QSqlRecord: add missing C++11 move SMFs
[ChangeLog][QtSql][QSqlRecord] Added move constructor, -assignment operator, and swap(). Task-number: QTBUG-109938 Change-Id: I54f2666defbf56f5ba2faea6358722ebd7cac157 Reviewed-by: Christian Ehrlicher <ch.ehrlicher@gmx.de> Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
This commit is contained in:
parent
0cd153b268
commit
595360506d
@ -88,6 +88,37 @@ QSqlRecord::QSqlRecord(const QSqlRecord& other)
|
||||
d->ref.ref();
|
||||
}
|
||||
|
||||
/*!
|
||||
\fn QSqlRecord::QSqlRecord(QSqlRecord &&other)
|
||||
\since 6.6
|
||||
|
||||
Move-constructs a new QSqlRecord from \a other.
|
||||
|
||||
\note The moved-from object \a other is placed in a partially-formed state,
|
||||
in which the only valid operations are destruction and assignment of a new
|
||||
value.
|
||||
*/
|
||||
|
||||
/*!
|
||||
\fn QSqlRecord &QSqlRecord::operator=(QSqlRecord &&other)
|
||||
\since 6.6
|
||||
|
||||
Move-assigns \a other to this QSqlRecord instance.
|
||||
|
||||
\note The moved-from object \a other is placed in a partially-formed state,
|
||||
in which the only valid operations are destruction and assignment of a new
|
||||
value.
|
||||
*/
|
||||
|
||||
/*!
|
||||
\fn void QSqlRecord::swap(QSqlRecord &other)
|
||||
\since 6.6
|
||||
|
||||
Swaps SQL record \a other with this SQL record. This operation is very fast
|
||||
and never fails.
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
Sets the record equal to \a other.
|
||||
|
||||
@ -97,7 +128,7 @@ QSqlRecord::QSqlRecord(const QSqlRecord& other)
|
||||
|
||||
QSqlRecord& QSqlRecord::operator=(const QSqlRecord& other)
|
||||
{
|
||||
qAtomicAssign(d, other.d);
|
||||
QSqlRecord(other).swap(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -107,7 +138,7 @@ QSqlRecord& QSqlRecord::operator=(const QSqlRecord& other)
|
||||
|
||||
QSqlRecord::~QSqlRecord()
|
||||
{
|
||||
if (!d->ref.deref())
|
||||
if (d && !d->ref.deref())
|
||||
delete d;
|
||||
}
|
||||
|
||||
|
@ -19,9 +19,14 @@ class Q_SQL_EXPORT QSqlRecord
|
||||
public:
|
||||
QSqlRecord();
|
||||
QSqlRecord(const QSqlRecord& other);
|
||||
QSqlRecord(QSqlRecord &&other) noexcept
|
||||
: d{std::exchange(other.d, nullptr)} {}
|
||||
QSqlRecord& operator=(const QSqlRecord& other);
|
||||
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QSqlRecord)
|
||||
~QSqlRecord();
|
||||
|
||||
void swap(QSqlRecord &other) noexcept { qt_ptr_swap(d, other.d); }
|
||||
|
||||
bool operator==(const QSqlRecord &other) const;
|
||||
inline bool operator!=(const QSqlRecord &other) const { return !operator==(other); }
|
||||
|
||||
|
@ -40,6 +40,7 @@ private slots:
|
||||
void clearValues();
|
||||
void clear();
|
||||
void append();
|
||||
void moveSemantics();
|
||||
|
||||
private:
|
||||
std::unique_ptr<QSqlRecord> rec;
|
||||
@ -449,5 +450,24 @@ void tst_QSqlRecord::value()
|
||||
QCOMPARE(rec2.value("string").toString(), QLatin1String("Harry"));
|
||||
}
|
||||
|
||||
void tst_QSqlRecord::moveSemantics()
|
||||
{
|
||||
QSqlRecord rec, empty;
|
||||
rec.append(QSqlField("string", QMetaType(QMetaType::QString)));
|
||||
rec.setValue("string", "Harry");
|
||||
auto moved = std::move(rec);
|
||||
// `rec` is not partially-formed
|
||||
|
||||
// moving transfers state:
|
||||
QCOMPARE(moved.value("string").toString(), QLatin1String("Harry"));
|
||||
|
||||
// moved-from objects can be assigned-to:
|
||||
rec = empty;
|
||||
QVERIFY(rec.value("string").isNull());
|
||||
|
||||
// moved-from object can be destroyed:
|
||||
moved = std::move(rec);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QSqlRecord)
|
||||
#include "tst_qsqlrecord.moc"
|
||||
|
Loading…
Reference in New Issue
Block a user