diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2023-10-31 14:58:10 +0100 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2023-11-01 21:28:55 +0100 |
commit | d57a78657e09e38dc4137e3c6c80c1a42817cc8c (patch) | |
tree | c397c5923f73a1985564a0ec9597ece8b41ffa65 /examples/corelib/serialization/convert | |
parent | 0b1670134b43ba390f35b52d2458e4269a804de3 (diff) |
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 <thiago.macieira@intel.com>
Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
Diffstat (limited to 'examples/corelib/serialization/convert')
-rw-r--r-- | examples/corelib/serialization/convert/converter.h | 3 | ||||
-rw-r--r-- | examples/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 4bf567dbdd..fabbffddfb 100644 --- a/examples/corelib/serialization/convert/converter.h +++ b/examples/corelib/serialization/convert/converter.h @@ -5,16 +5,19 @@ #define CONVERTER_H #include <QIODevice> +#include <QList> #include <QStringList> #include <QVariant> class Converter { + static QList<const Converter *> &converters(); protected: Converter(); static bool isNull(const Converter *converter); // in nullconverter.cpp public: + static const QList<const Converter *> &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 cd70a909ba..a5b2c78f65 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<const Converter *> *availableConverters; - Converter::Converter() { - if (!availableConverters) - availableConverters = new QList<const Converter *>; - availableConverters->append(this); + converters().append(this); } Converter::~Converter() { - availableConverters->removeAll(this); + converters().removeAll(this); +} + +QList<const Converter *> &Converter::converters() +{ + Q_CONSTINIT static QList<const Converter *> store; + return store; +} + +const QList<const Converter *> &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) { |