diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 5f0e759cf5..7310fd9be2 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -298,6 +298,22 @@ static QVariant::Private clonePrivate(const QVariant::Private &other) } // anonymous used to hide QVariant handlers +template inline +QVariant::Private::Private(std::piecewise_construct_t, const T &t) + : is_shared(!CanUseInternalSpace), is_null(std::is_same_v) +{ + const QtPrivate::QMetaTypeInterface *iface = QtPrivate::qMetaTypeInterfaceForType(); + Q_ASSERT((quintptr(iface) & 0x3) == 0); + packedType = quintptr(iface) >> 2; + + if constexpr (CanUseInternalSpace) { + new (data.data) T(t); + } else { + data.shared = QVariant::PrivateShared::create(QtPrivate::qMetaTypeInterfaceForType()); + new (data.shared->data()) T(t); + } +} + /*! \class QVariant \inmodule QtCore @@ -818,133 +834,60 @@ QVariant::QVariant(QMetaType type, const void *copy) : d(type) d = {}; } -QVariant::QVariant(int val) - : d(QMetaType::fromType()) -{ d.set(val); } -QVariant::QVariant(uint val) - : d(QMetaType::fromType()) -{ d.set(val); } -QVariant::QVariant(qlonglong val) - : d(QMetaType::fromType()) -{ d.set(val); } -QVariant::QVariant(qulonglong val) - : d(QMetaType::fromType()) -{ d.set(val); } -QVariant::QVariant(bool val) - : d(QMetaType::fromType()) -{ d.set(val); } -QVariant::QVariant(double val) - : d(QMetaType::fromType()) -{ d.set(val); } -QVariant::QVariant(float val) - : d(QMetaType::fromType()) -{ d.set(val); } +QVariant::QVariant(int val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(uint val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(qlonglong val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(qulonglong val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(bool val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(double val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(float val) : d(std::piecewise_construct_t{}, val) {} -QVariant::QVariant(const QByteArray &val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } -QVariant::QVariant(const QBitArray &val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } -QVariant::QVariant(const QString &val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } -QVariant::QVariant(QChar val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } -QVariant::QVariant(QLatin1StringView val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } -QVariant::QVariant(const QStringList &val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } +QVariant::QVariant(const QByteArray &val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(const QBitArray &val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(const QString &val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(QChar val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(const QStringList &val) : d(std::piecewise_construct_t{}, val) {} + +QVariant::QVariant(QDate val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(QTime val) : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(const QDateTime &val) : d(std::piecewise_construct_t{}, val) {} + +QVariant::QVariant(const QList &list) : d(std::piecewise_construct_t{}, list) {} +QVariant::QVariant(const QMap &map) : d(std::piecewise_construct_t{}, map) {} +QVariant::QVariant(const QHash &hash) : d(std::piecewise_construct_t{}, hash) {} + +QVariant::QVariant(QLatin1StringView val) : QVariant(QString(val)) {} -QVariant::QVariant(QDate val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } -QVariant::QVariant(QTime val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } -QVariant::QVariant(const QDateTime &val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } #if QT_CONFIG(easingcurve) -QVariant::QVariant(const QEasingCurve &val) - : d(QMetaType::fromType()) -{ v_construct(&d, val); } +QVariant::QVariant(const QEasingCurve &val) : d(std::piecewise_construct_t{}, val) {} #endif -QVariant::QVariant(const QList &list) - : d(QMetaType::fromType>()) -{ v_construct(&d, list); } -QVariant::QVariant(const QMap &map) - : d(QMetaType::fromType>()) -{ v_construct(&d, map); } -QVariant::QVariant(const QHash &hash) - : d(QMetaType::fromType>()) -{ v_construct(&d, hash); } #ifndef QT_NO_GEOM_VARIANT -QVariant::QVariant(const QPoint &pt) - : d(QMetaType::fromType()) -{ v_construct(&d, pt); } -QVariant::QVariant(const QPointF &pt) - : d(QMetaType::fromType()) -{ v_construct(&d, pt); } -QVariant::QVariant(const QRectF &r) - : d(QMetaType::fromType()) -{ v_construct(&d, r); } -QVariant::QVariant(const QLineF &l) - : d(QMetaType::fromType()) -{ v_construct(&d, l); } -QVariant::QVariant(const QLine &l) - : d(QMetaType::fromType()) -{ v_construct(&d, l); } -QVariant::QVariant(const QRect &r) - : d(QMetaType::fromType()) -{ v_construct(&d, r); } -QVariant::QVariant(const QSize &s) - : d(QMetaType::fromType()) -{ v_construct(&d, s); } -QVariant::QVariant(const QSizeF &s) - : d(QMetaType::fromType()) -{ v_construct(&d, s); } +QVariant::QVariant(const QPoint &pt) : d(std::piecewise_construct_t{}, pt) {} +QVariant::QVariant(const QPointF &pt) : d(std::piecewise_construct_t{}, pt) {} +QVariant::QVariant(const QRect &r) : d(std::piecewise_construct_t{}, r) {} +QVariant::QVariant(const QRectF &r) : d(std::piecewise_construct_t{}, r) {} +QVariant::QVariant(const QLine &l) : d(std::piecewise_construct_t{}, l) {} +QVariant::QVariant(const QLineF &l) : d(std::piecewise_construct_t{}, l) {} +QVariant::QVariant(const QSize &s) : d(std::piecewise_construct_t{}, s) {} +QVariant::QVariant(const QSizeF &s) : d(std::piecewise_construct_t{}, s) {} #endif #ifndef QT_BOOTSTRAPPED -QVariant::QVariant(const QUrl &u) - : d(QMetaType::fromType()) -{ v_construct(&d, u); } +QVariant::QVariant(const QUrl &u) : d(std::piecewise_construct_t{}, u) {} #endif -QVariant::QVariant(const QLocale &l) - : d(QMetaType::fromType()) -{ v_construct(&d, l); } +QVariant::QVariant(const QLocale &l) : d(std::piecewise_construct_t{}, l) {} #if QT_CONFIG(regularexpression) -QVariant::QVariant(const QRegularExpression &re) - : d(QMetaType::fromType()) -{ v_construct(&d, re); } +QVariant::QVariant(const QRegularExpression &re) : d(std::piecewise_construct_t{}, re) {} #endif // QT_CONFIG(regularexpression) -QVariant::QVariant(const QUuid &uuid) - : d(QMetaType::fromType()) -{ v_construct(&d, uuid); } +QVariant::QVariant(const QUuid &uuid) : d(std::piecewise_construct_t{}, uuid) {} #ifndef QT_BOOTSTRAPPED -QVariant::QVariant(const QJsonValue &jsonValue) - : d(QMetaType::fromType()) -{ v_construct(&d, jsonValue); } -QVariant::QVariant(const QJsonObject &jsonObject) - : d(QMetaType::fromType()) -{ v_construct(&d, jsonObject); } -QVariant::QVariant(const QJsonArray &jsonArray) - : d(QMetaType::fromType()) -{ v_construct(&d, jsonArray); } -QVariant::QVariant(const QJsonDocument &jsonDocument) - : d(QMetaType::fromType()) -{ v_construct(&d, jsonDocument); } +QVariant::QVariant(const QJsonValue &jsonValue) : d(std::piecewise_construct_t{}, jsonValue) {} +QVariant::QVariant(const QJsonObject &jsonObject) : d(std::piecewise_construct_t{}, jsonObject) {} +QVariant::QVariant(const QJsonArray &jsonArray) : d(std::piecewise_construct_t{}, jsonArray) {} +QVariant::QVariant(const QJsonDocument &jsonDocument) : d(std::piecewise_construct_t{}, jsonDocument) {} #endif // QT_BOOTSTRAPPED #if QT_CONFIG(itemmodel) -QVariant::QVariant(const QModelIndex &modelIndex) - : d(QMetaType::fromType()) -{ v_construct(&d, modelIndex); } -QVariant::QVariant(const QPersistentModelIndex &modelIndex) - : d(QMetaType::fromType()) -{ v_construct(&d, modelIndex); } +QVariant::QVariant(const QModelIndex &modelIndex) : d(std::piecewise_construct_t{}, modelIndex) {} +QVariant::QVariant(const QPersistentModelIndex &modelIndex) : d(std::piecewise_construct_t{}, modelIndex) {} #endif /*! \fn QVariant::Type QVariant::type() const diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index dc73f46af5..aca2db2cbe 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -445,7 +445,8 @@ public: quintptr is_null : 1; quintptr packedType : sizeof(QMetaType) * 8 - 2; - Private() noexcept : is_shared(false), is_null(true), packedType(0) {} + constexpr Private() noexcept : is_shared(false), is_null(true), packedType(0) {} + template explicit Private(std::piecewise_construct_t, const T &t); explicit Private(QMetaType type) noexcept : is_shared(false), is_null(false) { quintptr mt = quintptr(type.d_ptr); @@ -464,9 +465,6 @@ public: template const T &get() const { return *static_cast(CanUseInternalSpace ? &data.data : data.shared->data()); } - template - void set(const T &t) - { *static_cast(CanUseInternalSpace ? &data.data : data.shared->data()) = t; } inline const QtPrivate::QMetaTypeInterface* typeInterface() const { diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h index 593adfd0e9..40fde48a1c 100644 --- a/src/corelib/kernel/qvariant_p.h +++ b/src/corelib/kernel/qvariant_p.h @@ -22,19 +22,6 @@ QT_BEGIN_NAMESPACE -template -inline void v_construct(QVariant::Private *x, const T &t) -{ - if constexpr (QVariant::Private::CanUseInternalSpace) { - new (&x->data) T(t); - x->is_shared = false; - } else { - x->data.shared = QVariant::PrivateShared::create(QtPrivate::qMetaTypeInterfaceForType()); - new (x->data.shared->data()) T(t); - x->is_shared = true; - } -} - QT_END_NAMESPACE #endif // QVARIANT_P_H