summaryrefslogtreecommitdiffstats
path: root/examples/corelib/serialization/convert
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2023-10-31 14:58:10 +0100
committerEdward Welbourne <edward.welbourne@qt.io>2023-11-01 21:28:55 +0100
commitd57a78657e09e38dc4137e3c6c80c1a42817cc8c (patch)
treec397c5923f73a1985564a0ec9597ece8b41ffa65 /examples/corelib/serialization/convert
parent0b1670134b43ba390f35b52d2458e4269a804de3 (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.h3
-rw-r--r--examples/corelib/serialization/convert/main.cpp27
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) {