From d57a78657e09e38dc4137e3c6c80c1a42817cc8c Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 31 Oct 2023 14:58:10 +0100 Subject: [PATCH] Break out the list of available converters to a static method Mostly to pave the way for moving the class code to a file of its own, but this incidentally saves the need to std::as_const() every use. Moving the underlying object to a local static of a private method also saves the need for heap allocation (which was leaked). Pick-to: 6.6 6.5 Task-number: QTBUG-111228 Change-Id: I30f4bf3c46d39e04d0ac4e3e9ba431945ebb9193 Reviewed-by: Thiago Macieira Reviewed-by: Ville Voutilainen --- .../corelib/serialization/convert/converter.h | 3 +++ .../corelib/serialization/convert/main.cpp | 27 ++++++++++++------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/examples/corelib/serialization/convert/converter.h b/examples/corelib/serialization/convert/converter.h index 4bf567dbdd4..fabbffddfba 100644 --- a/examples/corelib/serialization/convert/converter.h +++ b/examples/corelib/serialization/convert/converter.h @@ -5,16 +5,19 @@ #define CONVERTER_H #include +#include #include #include class Converter { + static QList &converters(); protected: Converter(); static bool isNull(const Converter *converter); // in nullconverter.cpp public: + static const QList &allConverters(); enum class Direction { In = 1, Out = 2, InOut = In | Out }; Q_DECLARE_FLAGS(Directions, Direction) diff --git a/examples/corelib/serialization/convert/main.cpp b/examples/corelib/serialization/convert/main.cpp index cd70a909bad..a5b2c78f656 100644 --- a/examples/corelib/serialization/convert/main.cpp +++ b/examples/corelib/serialization/convert/main.cpp @@ -14,18 +14,25 @@ using namespace Qt::StringLiterals; -static QList *availableConverters; - Converter::Converter() { - if (!availableConverters) - availableConverters = new QList; - availableConverters->append(this); + converters().append(this); } Converter::~Converter() { - availableConverters->removeAll(this); + converters().removeAll(this); +} + +QList &Converter::converters() +{ + Q_CONSTINIT static QList store; + return store; +} + +const QList &Converter::allConverters() +{ + return converters(); } static const Converter *prepareConverter(QString format, Converter::Direction direction, @@ -46,7 +53,7 @@ static const Converter *prepareConverter(QString format, Converter::Direction di qFatal("Could not open \"%s\" for %s: %s", qPrintable(stream->fileName()), dirn, qPrintable(stream->errorString())); } else if (format == "auto"_L1) { - for (const Converter *conv : std::as_const(*availableConverters)) { + for (const Converter *conv : Converter::allConverters()) { if (conv->directions().testFlag(direction) && conv->probeFile(stream)) return conv; } @@ -56,7 +63,7 @@ static const Converter *prepareConverter(QString format, Converter::Direction di // Input format, however, we must know before we can call that: qFatal("Could not determine input format. Specify it with the -I option."); } else { - for (const Converter *conv : std::as_const(*availableConverters)) { + for (const Converter *conv : Converter::allConverters()) { if (conv->name() == format) { if (!conv->directions().testFlag(direction)) { qWarning("File format \"%s\" cannot be used for %s", @@ -77,7 +84,7 @@ int main(int argc, char *argv[]) QStringList inputFormats; QStringList outputFormats; - for (const Converter *conv : std::as_const(*availableConverters)) { + for (const Converter *conv : Converter::allConverters()) { auto direction = conv->directions(); QString name = conv->name(); if (direction.testFlag(Converter::Direction::In)) @@ -130,7 +137,7 @@ int main(int argc, char *argv[]) if (parser.isSet(formatOptionsOption)) { QString format = parser.value(formatOptionsOption); - for (const Converter *conv : std::as_const(*availableConverters)) { + for (const Converter *conv : Converter::allConverters()) { if (conv->name() == format) { const char *help = conv->optionsHelp(); if (help) {