QList: overload data_ptr() for rvalue
Amends 343cc50c224655ba8da5cc02d263a9b70f10d529. Marc suggested adding an rvalue overload for data_ptr(). Return by rvalue as the new overload empties `this`; also `std::optional::value() &&` returns by rvalue so it's more idiomatic. Change-Id: I4e2f2cdee2420059465b0592b84c8ade3444e88b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
0e2067334d
commit
0e68115324
@ -107,8 +107,10 @@ public:
|
||||
using rvalue_ref = T &&;
|
||||
#endif
|
||||
|
||||
DataPointer &data_ptr() { return d; }
|
||||
const DataPointer &data_ptr() const { return d; }
|
||||
DataPointer &data_ptr() & { return d; }
|
||||
const DataPointer &data_ptr() const & { return d; }
|
||||
DataPointer &&data_ptr() && { return std::move(d); }
|
||||
// No current use-case for a `const &&` overload
|
||||
|
||||
class const_iterator;
|
||||
class iterator {
|
||||
|
@ -1640,8 +1640,9 @@
|
||||
*/
|
||||
|
||||
/*!
|
||||
\fn template <typename T> QList<T>::DataPointer &QList<T>::data_ptr();
|
||||
\fn template <typename T> const QList<T>::DataPointer &QList<T>::data_ptr() const;
|
||||
\fn template <typename T> QList<T>::DataPointer &QList<T>::data_ptr() &;
|
||||
\fn template <typename T> const QList<T>::DataPointer &QList<T>::data_ptr() const &;
|
||||
\fn template <typename T> QList<T>::DataPointer QList<T>::data_ptr() &&;
|
||||
|
||||
\internal
|
||||
\since 6.10
|
||||
|
@ -265,6 +265,7 @@ private slots:
|
||||
void countCustom() const { count<Custom>(); }
|
||||
void cpp17ctad() const;
|
||||
void data() const;
|
||||
void reinterpreted() const;
|
||||
void emptyInt() const { empty<int>(); }
|
||||
void emptyMovable() const { empty<Movable>(); }
|
||||
void emptyCustom() const { empty<Custom>(); }
|
||||
@ -776,7 +777,7 @@ void tst_QList::assignEmpty() const
|
||||
using T = int;
|
||||
QList<T> list;
|
||||
QList<T> ref1 = list;
|
||||
QVERIFY(list.d.needsDetach());
|
||||
QVERIFY(list.data_ptr().needsDetach());
|
||||
list.assign(list.begin(), list.begin());
|
||||
|
||||
#if !defined Q_OS_QNX // QNX has problems with the empty istream_iterator
|
||||
@ -784,7 +785,7 @@ void tst_QList::assignEmpty() const
|
||||
list.squeeze();
|
||||
QCOMPARE_EQ(list.capacity(), 0);
|
||||
ref1 = list;
|
||||
QVERIFY(list.d.needsDetach());
|
||||
QVERIFY(list.data_ptr().needsDetach());
|
||||
list.assign(empty, empty);
|
||||
#endif
|
||||
}
|
||||
@ -1340,6 +1341,29 @@ void tst_QList::data() const
|
||||
QVERIFY(!constVec.isDetached()); // const data() does not detach()
|
||||
}
|
||||
|
||||
void tst_QList::reinterpreted() const
|
||||
{
|
||||
const QList<char16_t> expected = {char16_t(42), char16_t(43), char16_t(44)};
|
||||
{
|
||||
QList<ushort> t = {42, 43, 44};
|
||||
const auto size = t.size();
|
||||
QList<char16_t> x = std::move(t.data_ptr()).reinterpreted<char16_t>();
|
||||
|
||||
QVERIFY(t.data_ptr().isNull());
|
||||
QCOMPARE(x.size(), size);
|
||||
QCOMPARE_EQ(x, expected);
|
||||
}
|
||||
{
|
||||
QList<ushort> t = {42, 43, 44};
|
||||
const auto size = t.size();
|
||||
QList<char16_t> x = std::move(t).data_ptr().reinterpreted<char16_t>();
|
||||
|
||||
QVERIFY(t.data_ptr().isNull());
|
||||
QCOMPARE(x.size(), size);
|
||||
QCOMPARE_EQ(x, expected);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void tst_QList::empty() const
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user