summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJędrzej Nowacki <jedrzej.nowacki@digia.com>2014-05-21 12:28:27 +0200
committerJędrzej Nowacki <jedrzej.nowacki@digia.com>2014-07-04 08:24:05 +0200
commit9c79f6dfb3b5724b52421f74fbee6f5c0005d0e3 (patch)
treeee4e2722c3bc40d99a95753a2cc6140b061ffaf5
parent391b2accd87f02c9c0b1a4e766e50377d5918887 (diff)
Add initializer list support in QJsonArray
It allows to create a QJsonArray instance in C++ by using a similar expression to JSON. For example: QJsonArray a = {1, 2, 4}; [ChangeLog][QtCore][QtJson] QJsonArray now supports C++11 initializer lists. Task-number: QTBUG-26606 Change-Id: Icc352e518d9649d24176c89e7113d200d5c50b0d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/corelib/json/qjsonarray.cpp25
-rw-r--r--src/corelib/json/qjsonarray.h14
-rw-r--r--tests/auto/corelib/json/tst_qtjson.cpp52
3 files changed, 91 insertions, 0 deletions
diff --git a/src/corelib/json/qjsonarray.cpp b/src/corelib/json/qjsonarray.cpp
index 61bb158ff5..c1e831192a 100644
--- a/src/corelib/json/qjsonarray.cpp
+++ b/src/corelib/json/qjsonarray.cpp
@@ -138,6 +138,18 @@ QJsonArray::QJsonArray()
}
/*!
+ \fn QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args)
+ \since 5.4
+ Creates an array initialized from \a args initialization list.
+
+ QJsonArray can be constructed in a way similar to JSON notation,
+ for example:
+ \code
+ QJsonArray array = { 1, 2.2, QString() };
+ \endcode
+ */
+
+/*!
\internal
*/
QJsonArray::QJsonArray(QJsonPrivate::Data *data, QJsonPrivate::Array *array)
@@ -149,6 +161,19 @@ QJsonArray::QJsonArray(QJsonPrivate::Data *data, QJsonPrivate::Array *array)
}
/*!
+ This method replaces part of QJsonArray(std::initializer_list<QJsonValue> args) .
+ The constructor needs to be inline, but we do not want to leak implementation details
+ of this class.
+ \note this method is called for an uninitialized object
+ \internal
+ */
+void QJsonArray::initialize()
+{
+ d = 0;
+ a = 0;
+}
+
+/*!
Deletes the array.
*/
QJsonArray::~QJsonArray()
diff --git a/src/corelib/json/qjsonarray.h b/src/corelib/json/qjsonarray.h
index 84c162f0a0..4cada7cec1 100644
--- a/src/corelib/json/qjsonarray.h
+++ b/src/corelib/json/qjsonarray.h
@@ -44,6 +44,9 @@
#include <QtCore/qjsonvalue.h>
#include <QtCore/qiterator.h>
+#if defined(Q_COMPILER_INITIALIZER_LISTS)
+#include <initializer_list>
+#endif
QT_BEGIN_NAMESPACE
@@ -56,6 +59,16 @@ class Q_CORE_EXPORT QJsonArray
{
public:
QJsonArray();
+
+#if defined(Q_COMPILER_INITIALIZER_LISTS) || defined(Q_QDOC)
+ QJsonArray(std::initializer_list<QJsonValue> args)
+ {
+ initialize();
+ for (std::initializer_list<QJsonValue>::const_iterator i = args.begin(); i != args.end(); ++i)
+ append(*i);
+ }
+#endif
+
~QJsonArray();
QJsonArray(const QJsonArray &other);
@@ -212,6 +225,7 @@ private:
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonArray &);
QJsonArray(QJsonPrivate::Data *data, QJsonPrivate::Array *array);
+ void initialize();
void compact();
void detach(uint reserve = 0);
diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp
index 8d8a3d7e0e..761da2b0a3 100644
--- a/tests/auto/corelib/json/tst_qtjson.cpp
+++ b/tests/auto/corelib/json/tst_qtjson.cpp
@@ -140,6 +140,8 @@ private Q_SLOTS:
void nesting();
void longStrings();
+
+ void arrayInitializerList();
private:
QString testDataDir;
};
@@ -2443,5 +2445,55 @@ void tst_QtJson::testJsonValueRefDefault()
QCOMPARE(empty["n/a"].toDouble(42.0), 42.0);
}
+void tst_QtJson::arrayInitializerList()
+{
+#ifndef Q_COMPILER_INITIALIZER_LISTS
+ QSKIP("initializer_list is enabled only with c++11 support");
+#else
+ QVERIFY(QJsonArray{}.isEmpty());
+ QCOMPARE(QJsonArray{"one"}.count(), 1);
+ QCOMPARE(QJsonArray{1}.count(), 1);
+
+ {
+ QJsonArray a{1.3, "hello", 0};
+ QCOMPARE(QJsonValue(a[0]), QJsonValue(1.3));
+ QCOMPARE(QJsonValue(a[1]), QJsonValue("hello"));
+ QCOMPARE(QJsonValue(a[2]), QJsonValue(0));
+ QCOMPARE(a.count(), 3);
+ }
+ {
+ QJsonObject o;
+ o["property"] = 1;
+ QJsonArray a1 {o};
+ QCOMPARE(a1.count(), 1);
+ QCOMPARE(a1[0].toObject(), o);
+
+ QJsonArray a2 {o, 23};
+ QCOMPARE(a2.count(), 2);
+ QCOMPARE(a2[0].toObject(), o);
+ QCOMPARE(QJsonValue(a2[1]), QJsonValue(23));
+
+ QJsonArray a3 { a1, o, a2 };
+ QCOMPARE(QJsonValue(a3[0]), QJsonValue(a1));
+ QCOMPARE(QJsonValue(a3[1]), QJsonValue(o));
+ QCOMPARE(QJsonValue(a3[2]), QJsonValue(a2));
+
+ QJsonArray a4 { 1, QJsonArray{1,2,3}, QJsonArray{"hello", 2} };
+ QCOMPARE(a4.count(), 3);
+ QCOMPARE(QJsonValue(a4[0]), QJsonValue(1));
+
+ {
+ QJsonArray a41 = a4[1].toArray();
+ QJsonArray a42 = a4[2].toArray();
+ QCOMPARE(a41.count(), 3);
+ QCOMPARE(a42.count(), 2);
+
+ QCOMPARE(QJsonValue(a41[2]), QJsonValue(3));
+ QCOMPARE(QJsonValue(a42[1]), QJsonValue(2));
+ }
+ }
+#endif
+}
+
QTEST_MAIN(tst_QtJson)
#include "tst_qtjson.moc"