From de7894ce3c60154cd3c44640c1734c6988d2afea Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 22 Jul 2022 16:32:46 -0700 Subject: [PATCH] QVariant: update constructors for trivially copyable types Make them all noexcept and ensure they are all passed by value. Unfortunately for QRectF and QLineF, they're too big when qreal==double, so QVariant needs to allocate memory itself. Strictly speaking, they're too big for passing by value too, but the codegen is identical, so we may as well. For Qt 7, enlarging QVariant::Private would be a good idea. Change-Id: I3859764fed084846bcb0fffd17044ac379b3c1d2 Reviewed-by: Fabian Kosmale Reviewed-by: Lars Knoll --- src/corelib/compat/removed_api.cpp | 20 ++++++++ src/corelib/kernel/qvariant.cpp | 78 +++++++++++++++--------------- src/corelib/kernel/qvariant.h | 50 +++++++++++-------- 3 files changed, 91 insertions(+), 57 deletions(-) diff --git a/src/corelib/compat/removed_api.cpp b/src/corelib/compat/removed_api.cpp index 3401cf9c0c..2b864ad41f 100644 --- a/src/corelib/compat/removed_api.cpp +++ b/src/corelib/compat/removed_api.cpp @@ -293,6 +293,26 @@ int QMetaType::idHelper() const return registerHelper(d_ptr); } +#include "qvariant.h" + +// these implementations aren't as efficient as they used to be prior to +// replacement, but there's no way to call the ambiguous overload +QVariant::QVariant(const QUuid &uuid) : QVariant(QVariant::fromValue(uuid)) {} +#ifndef QT_NO_GEOM_VARIANT +#include "qline.h" +#include "qpoint.h" +#include "qrect.h" +#include "qsize.h" +QVariant::QVariant(const QPoint &pt) : QVariant(QVariant::fromValue(pt)) {} +QVariant::QVariant(const QPointF &pt) : QVariant(QVariant::fromValue(pt)) {} +QVariant::QVariant(const QRect &r) : QVariant(QVariant::fromValue(r)) {} +QVariant::QVariant(const QRectF &r) : QVariant(QVariant::fromValue(r)) {} +QVariant::QVariant(const QLine &l) : QVariant(QVariant::fromValue(l)) {} +QVariant::QVariant(const QLineF &l) : QVariant(QVariant::fromValue(l)) {} +QVariant::QVariant(const QSize &s) : QVariant(QVariant::fromValue(s)) {} +QVariant::QVariant(const QSizeF &s) : QVariant(QVariant::fromValue(s)) {} +#endif + #include "qxmlstream.h" QXmlStreamReader::QXmlStreamReader(const QByteArray &data) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 7b79501b1e..4628bd7d6f 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -625,13 +625,13 @@ QVariant::QVariant(const QVariant &p) */ /*! - \fn QVariant::QVariant(QDate val) + \fn QVariant::QVariant(QDate val) noexcept Constructs a new variant with a date value, \a val. */ /*! - \fn QVariant::QVariant(QTime val) + \fn QVariant::QVariant(QTime val) noexcept Constructs a new variant with a time value, \a val. */ @@ -651,7 +651,7 @@ QVariant::QVariant(const QVariant &p) /*! \since 5.0 - \fn QVariant::QVariant(const QUuid &val) + \fn QVariant::QVariant(QUuid val) noexcept Constructs a new variant with an uuid value, \a val. */ @@ -711,49 +711,49 @@ QVariant::QVariant(const QVariant &p) */ /*! - \fn QVariant::QVariant(const QPoint &val) + \fn QVariant::QVariant(QPoint val) noexcept Constructs a new variant with a point value of \a val. */ /*! - \fn QVariant::QVariant(const QPointF &val) + \fn QVariant::QVariant(QPointF val) noexcept Constructs a new variant with a point value of \a val. */ /*! - \fn QVariant::QVariant(const QRectF &val) + \fn QVariant::QVariant(QRectF val) Constructs a new variant with a rect value of \a val. */ /*! - \fn QVariant::QVariant(const QLineF &val) + \fn QVariant::QVariant(QLineF val) noexcept Constructs a new variant with a line value of \a val. */ /*! - \fn QVariant::QVariant(const QLine &val) + \fn QVariant::QVariant(QLine val) noexcept Constructs a new variant with a line value of \a val. */ /*! - \fn QVariant::QVariant(const QRect &val) + \fn QVariant::QVariant(QRect val) noexcept Constructs a new variant with a rect value of \a val. */ /*! - \fn QVariant::QVariant(const QSize &val) + \fn QVariant::QVariant(QSize val) noexcept Constructs a new variant with a size value of \a val. */ /*! - \fn QVariant::QVariant(const QSizeF &val) + \fn QVariant::QVariant(QSizeF val) noexcept Constructs a new variant with a size value of \a val. */ @@ -765,44 +765,44 @@ QVariant::QVariant(const QVariant &p) */ /*! - \fn QVariant::QVariant(int val) + \fn QVariant::QVariant(int val) noexcept Constructs a new variant with an integer value, \a val. */ /*! - \fn QVariant::QVariant(uint val) + \fn QVariant::QVariant(uint val) noexcept Constructs a new variant with an unsigned integer value, \a val. */ /*! - \fn QVariant::QVariant(qlonglong val) + \fn QVariant::QVariant(qlonglong val) noexcept Constructs a new variant with a long long integer value, \a val. */ /*! - \fn QVariant::QVariant(qulonglong val) + \fn QVariant::QVariant(qulonglong val) noexcept Constructs a new variant with an unsigned long long integer value, \a val. */ /*! - \fn QVariant::QVariant(bool val) + \fn QVariant::QVariant(bool val) noexcept Constructs a new variant with a boolean value, \a val. */ /*! - \fn QVariant::QVariant(double val) + \fn QVariant::QVariant(double val) noexcept Constructs a new variant with a floating point value, \a val. */ /*! - \fn QVariant::QVariant(float val) + \fn QVariant::QVariant(float val) noexcept Constructs a new variant with a floating point value, \a val. \since 4.6 @@ -815,7 +815,7 @@ QVariant::QVariant(const QVariant &p) */ /*! - \fn QVariant::QVariant(QChar c) + \fn QVariant::QVariant(QChar c) noexcept Constructs a new variant with a char value, \a c. */ @@ -867,22 +867,22 @@ QVariant::QVariant(QMetaType type, const void *copy) : d(type.iface()) d = {}; } -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(int val) noexcept : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(uint val) noexcept : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(qlonglong val) noexcept : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(qulonglong val) noexcept : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(bool val) noexcept : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(double val) noexcept : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(float val) noexcept : d(std::piecewise_construct_t{}, 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(QChar val) noexcept : 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(QDate val) noexcept : d(std::piecewise_construct_t{}, val) {} +QVariant::QVariant(QTime val) noexcept : 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) {} @@ -895,14 +895,16 @@ QVariant::QVariant(QLatin1StringView val) : QVariant(QString(val)) {} QVariant::QVariant(const QEasingCurve &val) : d(std::piecewise_construct_t{}, val) {} #endif #ifndef QT_NO_GEOM_VARIANT -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) {} +QVariant::QVariant(QPoint pt) noexcept : d(std::piecewise_construct_t{}, pt) {} +QVariant::QVariant(QPointF pt) noexcept : d(std::piecewise_construct_t{}, pt) {} +QVariant::QVariant(QRect r) noexcept : d(std::piecewise_construct_t{}, r) {} +QVariant::QVariant(QRectF r) noexcept(sizeof(qreal) * 4 <= Private::MaxInternalSize) + : d(std::piecewise_construct_t{}, r) {} +QVariant::QVariant(QLine l) noexcept : d(std::piecewise_construct_t{}, l) {} +QVariant::QVariant(QLineF l) noexcept(sizeof(qreal) * 4 <= Private::MaxInternalSize) + : d(std::piecewise_construct_t{}, l) {} +QVariant::QVariant(QSize s) noexcept : d(std::piecewise_construct_t{}, s) {} +QVariant::QVariant(QSizeF s) noexcept : d(std::piecewise_construct_t{}, s) {} #endif #ifndef QT_BOOTSTRAPPED QVariant::QVariant(const QUrl &u) : d(std::piecewise_construct_t{}, u) {} @@ -911,7 +913,7 @@ QVariant::QVariant(const QLocale &l) : d(std::piecewise_construct_t{}, l) {} #if QT_CONFIG(regularexpression) QVariant::QVariant(const QRegularExpression &re) : d(std::piecewise_construct_t{}, re) {} #endif // QT_CONFIG(regularexpression) -QVariant::QVariant(const QUuid &uuid) : d(std::piecewise_construct_t{}, uuid) {} +QVariant::QVariant(QUuid uuid) noexcept : d(std::piecewise_construct_t{}, uuid) {} #ifndef QT_BOOTSTRAPPED QVariant::QVariant(const QJsonValue &jsonValue) : d(std::piecewise_construct_t{}, jsonValue) {} QVariant::QVariant(const QJsonObject &jsonObject) : d(std::piecewise_construct_t{}, jsonObject) {} diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index d1a87813e4..7074c69e93 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -196,13 +196,13 @@ public: explicit QVariant(QMetaType type, const void *copy = nullptr); QVariant(const QVariant &other); - QVariant(int i); - QVariant(uint ui); - QVariant(qlonglong ll); - QVariant(qulonglong ull); - QVariant(bool b); - QVariant(double d); - QVariant(float f); + QVariant(int i) noexcept; + QVariant(uint ui) noexcept; + QVariant(qlonglong ll) noexcept; + QVariant(qulonglong ull) noexcept; + QVariant(bool b) noexcept; + QVariant(double d) noexcept; + QVariant(float f) noexcept; #ifndef QT_NO_CAST_FROM_ASCII QT_ASCII_CAST_WARN QVariant(const char *str) : QVariant(QString::fromUtf8(str)) @@ -214,22 +214,22 @@ public: QVariant(const QString &string); QVariant(QLatin1StringView string); QVariant(const QStringList &stringlist); - QVariant(QChar qchar); - QVariant(QDate date); - QVariant(QTime time); + QVariant(QChar qchar) noexcept; + QVariant(QDate date) noexcept; + QVariant(QTime time) noexcept; QVariant(const QDateTime &datetime); QVariant(const QList &list); QVariant(const QMap &map); QVariant(const QHash &hash); #ifndef QT_NO_GEOM_VARIANT - QVariant(const QSize &size); - QVariant(const QSizeF &size); - QVariant(const QPoint &pt); - QVariant(const QPointF &pt); - QVariant(const QLine &line); - QVariant(const QLineF &line); - QVariant(const QRect &rect); - QVariant(const QRectF &rect); + QVariant(QSize size) noexcept; + QVariant(QSizeF size) noexcept; + QVariant(QPoint pt) noexcept; + QVariant(QPointF pt) noexcept; + QVariant(QLine line) noexcept; + QVariant(QLineF line) noexcept(sizeof(qreal) * 4 <= Private::MaxInternalSize); + QVariant(QRect rect) noexcept; + QVariant(QRectF rect) noexcept(sizeof(qreal) * 4 <= Private::MaxInternalSize); #endif QVariant(const QLocale &locale); #if QT_CONFIG(regularexpression) @@ -238,7 +238,7 @@ public: #if QT_CONFIG(easingcurve) QVariant(const QEasingCurve &easing); #endif - QVariant(const QUuid &uuid); + QVariant(QUuid uuid) noexcept; #ifndef QT_BOOTSTRAPPED QVariant(const QUrl &url); QVariant(const QJsonValue &jsonValue); @@ -259,6 +259,18 @@ public: QVariant(const volatile void *) = delete; #endif +#if QT_CORE_REMOVED_SINCE(6, 5) + QVariant(const QSize &size); + QVariant(const QSizeF &size); + QVariant(const QPoint &pt); + QVariant(const QPointF &pt); + QVariant(const QLine &line); + QVariant(const QLineF &line); + QVariant(const QRect &rect); + QVariant(const QRectF &rect); + QVariant(const QUuid &uuid); +#endif + QVariant& operator=(const QVariant &other); inline QVariant(QVariant &&other) noexcept : d(other.d) { other.d = Private(); }