summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKai Koehne <kai.koehne@theqtcompany.com>2015-03-18 09:28:59 +0100
committerKai Koehne <kai.koehne@theqtcompany.com>2015-03-23 08:13:42 +0000
commitd3659bf88bac8dbfcdc6c957bdcc25e29bef0f04 (patch)
tree93b7823a2fc198d47441610592238b039101b2ab
parent5c379f3ff0471c51827577d047c93bab88ad44ce (diff)
QVarLengthArray: Add initializer_list constructor
Implement an initializer_list constructor, which was probably just forgotten so far. Technically this is a SC incompatible change, since QVarLengthArray<int> array = {10}; will now create an array with one element 10, instead of an empty array with a reserved size of 10. Anyhow, keeping the inconsistency with the STL / other Qt containers here would certainly do more harm than good in the long run. Task-number: QTBUG-45047 Change-Id: I4675880f93e141181250939942fa32300916b0e3 Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
-rw-r--r--src/corelib/tools/qvarlengtharray.h11
-rw-r--r--src/corelib/tools/qvarlengtharray.qdoc11
-rw-r--r--tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp62
3 files changed, 84 insertions, 0 deletions
diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h
index 54d97d8762..32f621c809 100644
--- a/src/corelib/tools/qvarlengtharray.h
+++ b/src/corelib/tools/qvarlengtharray.h
@@ -42,6 +42,9 @@
#include <string.h>
#include <stdlib.h>
#include <algorithm>
+#ifdef Q_COMPILER_INITIALIZER_LISTS
+#include <initializer_list>
+#endif
QT_BEGIN_NAMESPACE
@@ -62,6 +65,14 @@ public:
append(other.constData(), other.size());
}
+#ifdef Q_COMPILER_INITIALIZER_LISTS
+ QVarLengthArray(std::initializer_list<T> args)
+ : a(Prealloc), s(0), ptr(reinterpret_cast<T *>(array))
+ {
+ append(args.begin(), args.size());
+ }
+#endif
+
inline ~QVarLengthArray() {
if (QTypeInfo<T>::isComplex) {
T *i = ptr + s;
diff --git a/src/corelib/tools/qvarlengtharray.qdoc b/src/corelib/tools/qvarlengtharray.qdoc
index 6cc9f62c5a..d1b87f381e 100644
--- a/src/corelib/tools/qvarlengtharray.qdoc
+++ b/src/corelib/tools/qvarlengtharray.qdoc
@@ -100,6 +100,17 @@
\l{default-constructed value}.
*/
+
+/*! \fn QVarLengthArray::QVarLengthArray(std::initializer_list<T> args)
+ \since 5.5
+
+ Constructs an array from the std::initializer_list given by \a args.
+
+ This constructor is only enabled if the compiler supports C++11 initializer
+ lists.
+*/
+
+
/*! \fn QVarLengthArray::~QVarLengthArray()
Destroys the array.
diff --git a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
index 0b507ca277..40917eebea 100644
--- a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
+++ b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
@@ -54,6 +54,12 @@ private slots:
void indexOf();
void lastIndexOf();
void contains();
+ void initializeListInt();
+ void initializeListMovable();
+ void initializeListComplex();
+private:
+ template<typename T>
+ void initializeList();
};
int fooCtor = 0;
@@ -333,11 +339,23 @@ struct MyPrimitive
struct MyMovable
: MyBase
{
+ MyMovable(char input = 'j') : i(input) {}
+ bool operator==(const MyMovable &other) const
+ {
+ return i == other.i;
+ }
+ char i;
};
struct MyComplex
: MyBase
{
+ MyComplex(char input = 'j') : i(input) {}
+ bool operator==(const MyComplex &other) const
+ {
+ return i == other.i;
+ }
+ char i;
};
QT_BEGIN_NAMESPACE
@@ -734,5 +752,49 @@ void tst_QVarLengthArray::contains()
QVERIFY(myvec.contains(QLatin1String("I don't exist")));
}
+void tst_QVarLengthArray::initializeListInt()
+{
+ initializeList<int>();
+}
+
+void tst_QVarLengthArray::initializeListMovable()
+{
+ const int instancesCount = MyMovable::liveCount;
+ initializeList<MyMovable>();
+ QCOMPARE(MyMovable::liveCount, instancesCount);
+}
+
+void tst_QVarLengthArray::initializeListComplex()
+{
+ const int instancesCount = MyComplex::liveCount;
+ initializeList<MyComplex>();
+ QCOMPARE(MyComplex::liveCount, instancesCount);
+}
+
+template<typename T>
+void tst_QVarLengthArray::initializeList()
+{
+#ifdef Q_COMPILER_INITIALIZER_LISTS
+ T val1(110);
+ T val2(105);
+ T val3(101);
+ T val4(114);
+
+ QVarLengthArray<T> v1 {val1, val2, val3};
+ QCOMPARE(v1, QVarLengthArray<T>() << val1 << val2 << val3);
+ QCOMPARE(v1, (QVarLengthArray<T> {val1, val2, val3}));
+
+ QVarLengthArray<QVarLengthArray<T>, 4> v2{ v1, {val4}, QVarLengthArray<T>(), {val1, val2, val3} };
+ QVarLengthArray<QVarLengthArray<T>, 4> v3;
+ v3 << v1 << (QVarLengthArray<T>() << val4) << QVarLengthArray<T>() << v1;
+ QCOMPARE(v3, v2);
+
+ QVarLengthArray<T> v4({});
+ QCOMPARE(v4.size(), 0);
+#else
+ QSKIP("This tests requires a compiler that supports initializer lists.");
+#endif
+}
+
QTEST_APPLESS_MAIN(tst_QVarLengthArray)
#include "tst_qvarlengtharray.moc"