mirror of https://github.com/qt/qtbase.git
QDateTime: future-proof swap()
In Qt 7 32-bit builds, the ShortData will be larger than the d-pointer. So don't swap() the d-pointer, but a) delegate to Data to swap itself and b) swap the ShortData there, adding a static_assert in the .cpp file that triggers when the assumption that ShortData is always at least as large as a pointer is violated. Found while porting away from overly-generic qSwap(), so done that, too. Task-number: QTBUG-97601 Pick-to: 6.3 6.2 Change-Id: I5139da58d99e9491a582ff2cb2f817cd96952044 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
73d0174f50
commit
9f8da21239
|
@ -3617,6 +3617,7 @@ QDateTime::QDateTime() noexcept
|
||||||
static_assert(sizeof(ShortData) == sizeof(qint64));
|
static_assert(sizeof(ShortData) == sizeof(qint64));
|
||||||
static_assert(sizeof(Data) == sizeof(qint64));
|
static_assert(sizeof(Data) == sizeof(qint64));
|
||||||
#endif
|
#endif
|
||||||
|
static_assert(sizeof(ShortData) >= sizeof(void*), "oops, Data::swap() is broken!");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
@ -267,6 +267,9 @@ class Q_CORE_EXPORT QDateTime
|
||||||
Data &operator=(const Data &other);
|
Data &operator=(const Data &other);
|
||||||
~Data();
|
~Data();
|
||||||
|
|
||||||
|
void swap(Data &other) noexcept
|
||||||
|
{ std::swap(data, other.data); }
|
||||||
|
|
||||||
bool isShort() const;
|
bool isShort() const;
|
||||||
void detach();
|
void detach();
|
||||||
|
|
||||||
|
@ -290,7 +293,7 @@ public:
|
||||||
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QDateTime)
|
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QDateTime)
|
||||||
QDateTime &operator=(const QDateTime &other) noexcept;
|
QDateTime &operator=(const QDateTime &other) noexcept;
|
||||||
|
|
||||||
void swap(QDateTime &other) noexcept { qSwap(d.d, other.d.d); }
|
void swap(QDateTime &other) noexcept { d.swap(other.d); }
|
||||||
|
|
||||||
bool isNull() const;
|
bool isNull() const;
|
||||||
bool isValid() const;
|
bool isValid() const;
|
||||||
|
|
|
@ -48,6 +48,7 @@ public Q_SLOTS:
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void ctor();
|
void ctor();
|
||||||
void operator_eq();
|
void operator_eq();
|
||||||
|
void moveSemantics();
|
||||||
void isNull();
|
void isNull();
|
||||||
void isValid();
|
void isValid();
|
||||||
void date();
|
void date();
|
||||||
|
@ -332,6 +333,18 @@ void tst_QDateTime::operator_eq()
|
||||||
QVERIFY(dt1 == dt2);
|
QVERIFY(dt1 == dt2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QDateTime::moveSemantics()
|
||||||
|
{
|
||||||
|
QDateTime dt1{QDate{2004, 3, 24}, QTime{23, 45, 57}, Qt::UTC};
|
||||||
|
QDateTime dt2{QDate{2005, 3, 11}, QTime{0, 0}, Qt::UTC};
|
||||||
|
QDateTime copy = dt1;
|
||||||
|
QDateTime moved = std::move(dt1);
|
||||||
|
QCOMPARE(copy, moved);
|
||||||
|
copy = dt2;
|
||||||
|
moved = std::move(dt2);
|
||||||
|
QCOMPARE(copy, moved);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QDateTime::isNull()
|
void tst_QDateTime::isNull()
|
||||||
{
|
{
|
||||||
QDateTime dt1;
|
QDateTime dt1;
|
||||||
|
|
Loading…
Reference in New Issue