// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only // Used by both tst_qmetatype and tst_qsettings #ifndef TST_QMETATYPE_H #define TST_QMETATYPE_H #include #include #define FOR_EACH_PRIMITIVE_METATYPE(F) \ QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(F) \ QT_FOR_EACH_STATIC_CORE_POINTER(F) \ #define FOR_EACH_COMPLEX_CORE_METATYPE(F) \ QT_FOR_EACH_STATIC_CORE_CLASS(F) \ QT_FOR_EACH_STATIC_CORE_TEMPLATE(F) #define FOR_EACH_CORE_METATYPE(F) \ FOR_EACH_PRIMITIVE_METATYPE(F) \ FOR_EACH_COMPLEX_CORE_METATYPE(F) \ template struct MetaEnumToType {}; #define DEFINE_META_ENUM_TO_TYPE(MetaTypeName, MetaTypeId, RealType) \ template<> \ struct MetaEnumToType { \ typedef RealType Type; \ }; FOR_EACH_CORE_METATYPE(DEFINE_META_ENUM_TO_TYPE) #undef DEFINE_META_ENUM_TO_TYPE template struct DefaultValueFactory { typedef typename MetaEnumToType::Type Type; static Type *create() { return new Type(); } }; template <> struct DefaultValueFactory { typedef MetaEnumToType::Type Type; static Type *create() { return nullptr; } }; template struct DefaultValueTraits { // By default we assume that a default-constructed value (new T) is // initialized; e.g. QCOMPARE(*(new T), *(new T)) should succeed enum { IsInitialized = true }; }; template struct TestValueFactory {}; template<> struct TestValueFactory { static void *create() { return 0; } }; template<> struct TestValueFactory { static QString *create() { return new QString(QString::fromLatin1("QString")); } }; template<> struct TestValueFactory { static int *create() { return new int(INT_MIN); } }; template<> struct TestValueFactory { static uint *create() { return new uint(UINT_MAX); } }; template<> struct TestValueFactory { static bool *create() { return new bool(true); } }; template<> struct TestValueFactory { static double *create() { return new double(DBL_MIN); } }; template<> struct TestValueFactory { static QByteArray *create() { return new QByteArray(QByteArray("QByteArray")); } }; template<> struct TestValueFactory { static QByteArrayList *create() { return new QByteArrayList(QByteArrayList() << "Q" << "Byte" << "Array" << "List"); } }; template<> struct TestValueFactory { static QVariantMap *create() { return new QVariantMap(); } }; template<> struct TestValueFactory { static QVariantHash *create() { return new QVariantHash(); } }; template<> struct TestValueFactory { static QVariantPair *create() { return new QVariantPair(); } }; template<> struct TestValueFactory { static QVariantList *create() { return new QVariantList(QVariantList() << 123 << "Q" << "Variant" << "List"); } }; template<> struct TestValueFactory { static QChar *create() { return new QChar(QChar('q')); } }; template<> struct TestValueFactory { static long *create() { return new long(LONG_MIN); } }; template<> struct TestValueFactory { static short *create() { return new short(SHRT_MIN); } }; template<> struct TestValueFactory { static char *create() { return new char('c'); } }; template<> struct TestValueFactory { static char16_t *create() { return new char16_t('c'); } }; template<> struct TestValueFactory { static char32_t *create() { return new char32_t('c'); } }; template<> struct TestValueFactory { static ulong *create() { return new ulong(ULONG_MAX); } }; template<> struct TestValueFactory { static ushort *create() { return new ushort(USHRT_MAX); } }; template<> struct TestValueFactory { static signed char *create() { return new signed char(CHAR_MIN); } }; template<> struct TestValueFactory { static uchar *create() { return new uchar(UCHAR_MAX); } }; template<> struct TestValueFactory { static float *create() { return new float(FLT_MIN); } }; template<> struct TestValueFactory { static auto create() { return new qfloat16(std::numeric_limits::min()); } }; template<> struct TestValueFactory { static QObject * *create() { return new QObject *(0); } }; template<> struct TestValueFactory { static void * *create() { return new void *(0); } }; template<> struct TestValueFactory { static qlonglong *create() { return new qlonglong(LLONG_MIN); } }; template<> struct TestValueFactory { static qulonglong *create() { return new qulonglong(ULLONG_MAX); } }; template<> struct TestValueFactory { static QStringList *create() { return new QStringList(QStringList() << "Q" << "t"); } }; template<> struct TestValueFactory { static QBitArray *create() { return new QBitArray(QBitArray(256, true)); } }; template<> struct TestValueFactory { static QDate *create() { return new QDate(QDate::currentDate()); } }; template<> struct TestValueFactory { static QTime *create() { return new QTime(QTime::currentTime()); } }; template<> struct TestValueFactory { static QDateTime *create() { return new QDateTime(QDateTime::currentDateTime()); } }; template<> struct TestValueFactory { static QUrl *create() { return new QUrl("http://www.example.org"); } }; template<> struct TestValueFactory { static QLocale *create() { return new QLocale(QLocale::c()); } }; template<> struct TestValueFactory { static QRect *create() { return new QRect(10, 20, 30, 40); } }; template<> struct TestValueFactory { static QRectF *create() { return new QRectF(10, 20, 30, 40); } }; template<> struct TestValueFactory { static QSize *create() { return new QSize(10, 20); } }; template<> struct TestValueFactory { static QSizeF *create() { return new QSizeF(10, 20); } }; template<> struct TestValueFactory { static QLine *create() { return new QLine(10, 20, 30, 40); } }; template<> struct TestValueFactory { static QLineF *create() { return new QLineF(10, 20, 30, 40); } }; template<> struct TestValueFactory { static QPoint *create() { return new QPoint(10, 20); } }; template<> struct TestValueFactory { static QPointF *create() { return new QPointF(10, 20); } }; template<> struct TestValueFactory { static QEasingCurve *create() { return new QEasingCurve(QEasingCurve::InOutElastic); } }; template<> struct TestValueFactory { static QUuid *create() { return new QUuid(); } }; template<> struct TestValueFactory { static QModelIndex *create() { return new QModelIndex(); } }; template<> struct TestValueFactory { static QPersistentModelIndex *create() { return new QPersistentModelIndex(); } }; template<> struct TestValueFactory { static std::nullptr_t *create() { return new std::nullptr_t; } }; template<> struct TestValueFactory { static QRegularExpression *create() { #if QT_CONFIG(regularexpression) return new QRegularExpression("abc.*def"); #else return 0; #endif } }; template<> struct TestValueFactory { static QJsonValue *create() { return new QJsonValue(123.); } }; template<> struct TestValueFactory { static QJsonObject *create() { QJsonObject *o = new QJsonObject(); o->insert("a", 123.); o->insert("b", true); o->insert("c", QJsonValue::Null); o->insert("d", QLatin1String("ciao")); return o; } }; template<> struct TestValueFactory { static QJsonArray *create() { QJsonArray *a = new QJsonArray(); a->append(123.); a->append(true); a->append(QJsonValue::Null); a->append(QLatin1String("ciao")); return a; } }; template<> struct TestValueFactory { static QJsonDocument *create() { return new QJsonDocument( QJsonDocument::fromJson("{ 'foo': 123, 'bar': [true, null, 'ciao'] }") ); } }; template<> struct TestValueFactory { static QCborSimpleType *create() { return new QCborSimpleType(QCborSimpleType::True); } }; template<> struct TestValueFactory { static QCborValue *create() { return new QCborValue(123.); } }; template<> struct TestValueFactory { static QCborMap *create() { return new QCborMap{{0, 0}, {"Hello", 1}, {1, nullptr}}; } }; template<> struct TestValueFactory { static QCborArray *create() { return new QCborArray{0, 1, -2, 2.5, false, nullptr, "Hello", QByteArray("World") }; } }; template<> struct TestValueFactory { static QVariant *create() { return new QVariant(QStringList(QStringList() << "Q" << "t")); } }; #endif // TST_QMETATYPE_H