summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlen Mabey <Glen.Mabey@swri.org>2013-07-09 21:27:22 -0500
committerOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-08-09 09:01:41 +0200
commit35105f173e56ead3f5ad19b7ebeca5f5b928408b (patch)
tree7b41addc4ba4d3a2ebc0a2bd36d5543c69797ca7
parenta332322de95f25ca3228102d80d6a92b73b6177d (diff)
Long live QByteArrayList!
Initial submission of a new class QByteArrayList with the purpose of aggregating and then joining QByteArray instances. [ChangeLog][QtCore] Added new QByteArrayList class. Done-with: Marc Mutz <marc.mutz@kdab.com> Change-Id: I503af58f125d7f44fef10360177490c933e5840f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/corelib/doc/snippets/qbytearraylist/main.cpp51
-rw-r--r--src/corelib/doc/snippets/qbytearraylist/qbytearraylist.pro2
-rw-r--r--src/corelib/tools/qbytearraylist.cpp294
-rw-r--r--src/corelib/tools/qbytearraylist.h186
-rw-r--r--src/corelib/tools/tools.pri2
-rw-r--r--tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro4
-rw-r--r--tests/auto/corelib/tools/qbytearraylist/tst_qbytearraylist.cpp292
-rw-r--r--tests/auto/corelib/tools/tools.pro1
8 files changed, 832 insertions, 0 deletions
diff --git a/src/corelib/doc/snippets/qbytearraylist/main.cpp b/src/corelib/doc/snippets/qbytearraylist/main.cpp
new file mode 100644
index 0000000000..be462dea60
--- /dev/null
+++ b/src/corelib/doc/snippets/qbytearraylist/main.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 by Southwest Research Institute (R)
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QByteArrayList>
+
+int main(int, char **)
+{
+ QByteArray ba1, ba2, ba3;
+//! [0]
+ QByteArrayList longerList = (QByteArrayList() << ba1 << ba2 << ba3);
+//! [0]
+}
diff --git a/src/corelib/doc/snippets/qbytearraylist/qbytearraylist.pro b/src/corelib/doc/snippets/qbytearraylist/qbytearraylist.pro
new file mode 100644
index 0000000000..87397b491d
--- /dev/null
+++ b/src/corelib/doc/snippets/qbytearraylist/qbytearraylist.pro
@@ -0,0 +1,2 @@
+QT = core
+SOURCES = main.cpp
diff --git a/src/corelib/tools/qbytearraylist.cpp b/src/corelib/tools/qbytearraylist.cpp
new file mode 100644
index 0000000000..beb6a32df7
--- /dev/null
+++ b/src/corelib/tools/qbytearraylist.cpp
@@ -0,0 +1,294 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2014 by Southwest Research Institute (R)
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qbytearraylist.h>
+
+QT_BEGIN_NAMESPACE
+
+/*! \typedef QByteArrayListIterator
+ \relates QByteArrayList
+
+ The QByteArrayListIterator type definition provides a Java-style const
+ iterator for QByteArrayList.
+
+ QByteArrayList provides both \l{Java-style iterators} and
+ \l{STL-style iterators}. The Java-style const iterator is simply
+ a type definition for QListIterator<QByteArray>.
+
+ \sa QMutableByteArrayListIterator, QByteArrayList::const_iterator
+*/
+
+/*! \typedef QMutableByteArrayListIterator
+ \relates QByteArrayList
+
+ The QByteArrayListIterator type definition provides a Java-style
+ non-const iterator for QByteArrayList.
+
+ QByteArrayList provides both \l{Java-style iterators} and
+ \l{STL-style iterators}. The Java-style non-const iterator is
+ simply a type definition for QMutableListIterator<QByteArray>.
+
+ \sa QByteArrayListIterator, QByteArrayList::iterator
+*/
+
+/*!
+ \class QByteArrayList
+ \inmodule QtCore
+ \since 5.4
+ \brief The QByteArrayList class provides a list of byte arrays.
+
+ \ingroup tools
+ \ingroup shared
+ \ingroup string-processing
+
+ \reentrant
+
+ QByteArrayList inherits from QList<QByteArray>. Like QList, QByteArrayList is
+ \l{implicitly shared}. It provides fast index-based access as well as fast
+ insertions and removals. Passing string lists as value parameters is both
+ fast and safe.
+
+ All of QList's functionality also applies to QByteArrayList. For example, you
+ can use isEmpty() to test whether the list is empty, and you can call
+ functions like append(), prepend(), insert(), replace(), removeAll(),
+ removeAt(), removeFirst(), removeLast(), and removeOne() to modify a
+ QByteArrayList. In addition, QByteArrayList provides several join()
+ methods for concatenating the list into a single QByteArray.
+
+ The purpose of QByteArrayList is quite different from that of QStringList.
+ Whereas QStringList has many methods for manipulation of elements within
+ the list, QByteArrayList does not.
+ Normally, QStringList should be used whenever working with a list of printable
+ strings. QByteArrayList should be used to handle and efficiently join large blobs
+ of binary data, as when sequentially receiving serialized data through a
+ QIODevice.
+
+ \sa QByteArray, QStringList
+*/
+
+/*!
+ \fn QByteArrayList::QByteArrayList()
+
+ Constructs an empty byte array list.
+*/
+
+/*!
+ \fn QByteArrayList::QByteArrayList(const QByteArray &ba)
+
+ Constructs a byte array list that contains the given byte array,
+ \a ba. Longer lists are easily created like this:
+
+ \snippet qbytearraylist/main.cpp 0
+
+ \sa append()
+*/
+
+/*!
+ \fn QByteArrayList::QByteArrayList(const QList<QByteArray> &other)
+
+ Constructs a copy of \a other.
+
+ This operation takes \l{constant time}, because QByteArrayList is
+ \l{implicitly shared}. This makes returning a QByteArrayList from a
+ function very fast. If a shared instance is modified, it will be
+ copied (copy-on-write), and that takes \l{linear time}.
+
+ \sa operator=()
+*/
+
+/*!
+ \fn QByteArrayList::QByteArrayList(QList<QByteArray> &&other)
+
+ \overload
+
+ Move-constructs from \a other.
+
+ This constructor is only enabled if the compiler supports C++11
+ move semantics.
+
+ \sa operator=()
+*/
+
+/*! \fn QByteArrayList::QByteArrayList(std::initializer_list<QByteArray> args)
+
+ Constructs a list from a std::initializer_list given by \a args.
+
+ This constructor is only enabled if the compiler supports C++11 initializer
+ lists.
+*/
+
+/*!
+ \fn QByteArrayList &QByteArrayList::operator=(const QList<QByteArray> &other)
+
+ Assigns the contents of \a other to this byte array list and returns
+ a reference to \c *this.
+*/
+
+/*!
+ \fn QByteArrayList &QByteArrayList::operator=(QList<QByteArray> &&other)
+
+ \overload
+
+ Move-assigns the contents of \a other to this byte array list and returns
+ a reference to \c *this.
+
+ This operator is only enabled if the compiler supports C++11 move
+ semantics.
+*/
+
+/*!
+ \fn QByteArrayList &QByteArrayList::operator=(std::initializer_list<QByteArray> args)
+
+ \overload
+
+ Assigns the byte arrays from the initializer_list \a args to this byte array
+ list and returns a reference to \c *this.
+
+ This operator is only enabled if the compiler supports C++11 initializer
+ lists.
+*/
+
+/*!
+ \fn QByteArray QByteArrayList::join() const
+
+ Joins all the byte arrays into a single byte array.
+*/
+
+/*!
+ \fn QByteArray QByteArrayList::join(const QByteArray &separator) const
+
+ Joins all the byte arrays into a single byte array with each
+ element separated by the given \a separator.
+*/
+
+/*!
+ \fn QByteArray QByteArrayList::join(char separator) const
+
+ Joins all the byte arrays into a single byte array with each
+ element separated by the given \a separator.
+*/
+
+static int QByteArrayList_joinedSize(const QByteArrayList *that, int seplen)
+{
+ int totalLength = 0;
+ const int size = that->size();
+
+ for (int i = 0; i < size; ++i)
+ totalLength += that->at(i).size();
+
+ if (size > 0)
+ totalLength += seplen * (size - 1);
+
+ return totalLength;
+}
+
+QByteArray QtPrivate::QByteArrayList_join(const QByteArrayList *that, const char *sep, int seplen)
+{
+ QByteArray res;
+ if (const int joinedSize = QByteArrayList_joinedSize(that, seplen))
+ res.reserve(joinedSize); // don't call reserve(0) - it allocates one byte for the NUL
+ const int size = that->size();
+ for (int i = 0; i < size; ++i) {
+ if (i)
+ res.append(sep, seplen);
+ res += that->at(i);
+ }
+ return res;
+}
+
+/*!
+ \fn QByteArrayList operator+(const QByteArrayList &list1, const QByteArrayList &list2)
+ \fn QByteArrayList operator+(const QByteArrayList &list1, const QList<QByteArray> &list2)
+ \fn QByteArrayList operator+(const QList<QByteArray> &list1, const QByteArrayList &list2)
+ \fn QByteArrayList operator+(QByteArrayList &&list1, const QByteArrayList &list2)
+ \fn QByteArrayList operator+(QByteArrayList &&list1, const QList<QByteArray> &list2)
+ \relates QByteArrayList
+
+ Returns a byte array list that is the concatenation of \a list1 and \a list2.
+*/
+
+/*!
+ \fn QByteArrayList& operator+=(QByteArrayList &list1, const QList<QByteArray> &list2)
+ \relates QByteArrayList
+
+ Appends \a list2 (which may be a QByteArrayList itself) to \a
+ list1 and returns a reference to \a list1.
+*/
+
+/*!
+ \fn QByteArrayList &QByteArrayList::operator<<(const QByteArray &ba)
+
+ Appends the given byte array, \a ba, to this byte array list and returns
+ a reference to the byte array list.
+
+ \sa append()
+*/
+
+/*!
+ \fn QByteArrayList &QByteArrayList::operator<<(const QList<QByteArray> &other)
+
+ \overload
+
+ Appends the list of byte arrays \a other (which may be a
+ QByteArrayList itself) to this byte array list and returns a
+ reference to \c *this. */
+
+/*!
+ \fn QDataStream &operator>>(QDataStream &in, QByteArrayList &list)
+ \relates QByteArrayList
+
+ Reads a byte array list from the given \a in stream into the specified
+ \a list.
+
+ \sa {Serializing Qt Data Types}
+*/
+
+/*!
+ \fn QDataStream &operator<<(QDataStream &out, const QByteArrayList &list)
+ \relates QByteArrayList
+
+ Writes the given byte array \a list to the specified \a out stream.
+
+ \sa {Serializing Qt Data Types}
+*/
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qbytearraylist.h b/src/corelib/tools/qbytearraylist.h
new file mode 100644
index 0000000000..efcba8e7ea
--- /dev/null
+++ b/src/corelib/tools/qbytearraylist.h
@@ -0,0 +1,186 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2014 by Southwest Research Institute (R)
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QBYTEARRAYLIST_H
+#define QBYTEARRAYLIST_H
+
+#include <QtCore/qdatastream.h>
+#include <QtCore/qlist.h>
+#include <QtCore/qbytearray.h>
+
+QT_BEGIN_NAMESPACE
+
+
+typedef QListIterator<QByteArray> QByteArrayListIterator;
+typedef QMutableListIterator<QByteArray> QMutableByteArrayListIterator;
+
+class QByteArrayList : public QList<QByteArray>
+{
+public:
+ QByteArrayList() { }
+ explicit QByteArrayList(const QByteArray &i) { append(i); }
+ QByteArrayList(const QList<QByteArray> &l) : QList<QByteArray>(l) { }
+#ifdef Q_COMPILER_RVALUE_REFS
+ QByteArrayList(QList<QByteArray> &&l) : QList<QByteArray>(qMove(l)) { }
+#endif
+#ifdef Q_COMPILER_INITIALIZER_LISTS
+ QByteArrayList(std::initializer_list<QByteArray> args) : QList<QByteArray>(args) { }
+#endif
+ // compiler-generated copy/move ctor/assignment operators are ok
+ // compiler-generated dtor is ok
+ // inherited swap() is ok (sic!)
+
+ // For the operators, we could just say using QList<QByteArray>::operator{=,<<},
+ // but they would not return QByteArrayList&, so we need to write inline forwarders:
+ QByteArrayList &operator=(const QList<QByteArray> &other)
+ { QList<QByteArray>::operator=(other); return *this; }
+#ifdef Q_COMPILER_RVALUE_REFS
+ QByteArrayList &operator=(QList<QByteArray> &&other)
+ { QList<QByteArray>::operator=(qMove(other)); return *this; }
+#endif
+ // if this is missing, assignment from an initializer_list is ambiguous:
+#ifdef Q_COMPILER_INITIALIZER_LISTS
+ QByteArrayList &operator=(std::initializer_list<QByteArray> args)
+ { QByteArrayList copy(args); swap(copy); return *this; }
+#endif
+ QByteArrayList &operator<<(const QByteArray &str)
+ { QList<QByteArray>::operator<<(str); return *this; }
+ QByteArrayList &operator<<(const QList<QByteArray> &l)
+ { QList<QByteArray>::operator<<(l); return *this; }
+
+ //
+ // actual functionality provided on top of what QList<QByteArray> provides starts here:
+ //
+ inline QByteArray join() const;
+ inline QByteArray join(const QByteArray &sep) const;
+ inline QByteArray join(char sep) const;
+};
+
+Q_DECLARE_TYPEINFO(QByteArrayList, Q_MOVABLE_TYPE);
+
+namespace QtPrivate {
+ QByteArray Q_CORE_EXPORT QByteArrayList_join(const QByteArrayList *that, const char *separator, int separatorLength);
+}
+
+inline QByteArray QByteArrayList::join() const
+{
+ return QtPrivate::QByteArrayList_join(this, 0, 0);
+}
+
+inline QByteArray QByteArrayList::join(const QByteArray &sep) const
+{
+ return QtPrivate::QByteArrayList_join(this, sep.constData(), sep.size());
+}
+
+inline QByteArray QByteArrayList::join(char sep) const
+{
+ return QtPrivate::QByteArrayList_join(this, &sep, 1);
+}
+
+inline QByteArrayList operator+(const QByteArrayList &lhs, const QByteArrayList &rhs)
+{
+ QByteArrayList res = lhs;
+ res += rhs;
+ return res;
+}
+
+#ifdef Q_COMPILER_RVALUE_REFS
+inline QByteArrayList operator+(QByteArrayList &&lhs, const QByteArrayList &rhs)
+{
+ lhs += rhs;
+ return qMove(lhs);
+}
+#endif
+
+inline QByteArrayList operator+(const QByteArrayList &lhs, const QList<QByteArray> &rhs)
+{
+ QByteArrayList res = lhs;
+ res += rhs;
+ return res;
+}
+
+#ifdef Q_COMPILER_RVALUE_REFS
+inline QByteArrayList operator+(QByteArrayList &&lhs, const QList<QByteArray> &rhs)
+{
+ lhs += rhs;
+ return qMove(lhs);
+}
+#endif
+
+inline QByteArrayList operator+(const QList<QByteArray> &lhs, const QByteArrayList &rhs)
+{
+ QByteArrayList res = lhs;
+ res += rhs;
+ return res;
+}
+
+#if 0 // ambiguous with QList<QByteArray>::operator+(const QList<QByteArray> &) const
+#ifdef Q_COMPILER_RVALUE_REFS
+inline QByteArrayList operator+(QList<QByteArray> &&lhs, const QByteArrayList &rhs)
+{
+ lhs += rhs;
+ return qMove(lhs);
+}
+#endif
+#endif
+
+inline QByteArrayList& operator+=(QByteArrayList &lhs, const QList<QByteArray> &rhs)
+{
+ lhs.append(rhs);
+ return lhs;
+}
+
+#ifndef QT_NO_DATASTREAM
+inline QDataStream &operator>>(QDataStream &in, QByteArrayList &list)
+{
+ return operator>>(in, static_cast<QList<QByteArray> &>(list));
+}
+inline QDataStream &operator<<(QDataStream &out, const QByteArrayList &list)
+{
+ return operator<<(out, static_cast<const QList<QByteArray> &>(list));
+}
+#endif // QT_NO_DATASTREAM
+
+QT_END_NAMESPACE
+
+#endif // QBYTEARRAYLIST_H
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index 467f870249..af0ed228bd 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -9,6 +9,7 @@ HEADERS += \
tools/qarraydatapointer.h \
tools/qbitarray.h \
tools/qbytearray.h \
+ tools/qbytearraylist.h \
tools/qbytearraymatcher.h \
tools/qbytedata_p.h \
tools/qcache.h \
@@ -77,6 +78,7 @@ SOURCES += \
tools/qarraydata.cpp \
tools/qbitarray.cpp \
tools/qbytearray.cpp \
+ tools/qbytearraylist.cpp \
tools/qbytearraymatcher.cpp \
tools/qcollator.cpp \
tools/qcommandlineoption.cpp \
diff --git a/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro b/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro
new file mode 100644
index 0000000000..2cd4522f67
--- /dev/null
+++ b/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro
@@ -0,0 +1,4 @@
+CONFIG += testcase parallel_test
+TARGET = tst_qbytearraylist
+QT = core testlib
+SOURCES = tst_qbytearraylist.cpp
diff --git a/tests/auto/corelib/tools/qbytearraylist/tst_qbytearraylist.cpp b/tests/auto/corelib/tools/qbytearraylist/tst_qbytearraylist.cpp
new file mode 100644
index 0000000000..7d409ca1b8
--- /dev/null
+++ b/tests/auto/corelib/tools/qbytearraylist/tst_qbytearraylist.cpp
@@ -0,0 +1,292 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2014 by Southwest Research Institute (R)
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <qbytearraylist.h>
+
+#include <qmetatype.h>
+
+Q_DECLARE_METATYPE(QByteArrayList)
+
+class tst_QByteArrayList : public QObject
+{
+ Q_OBJECT
+private slots:
+ void join() const;
+ void join_data() const;
+ void joinByteArray() const;
+ void joinByteArray_data() const;
+ void joinChar() const;
+ void joinChar_data() const;
+ void joinEmptiness() const;
+
+ void operator_plus() const;
+ void operator_plus_data() const;
+
+ void initializerList() const;
+};
+
+void tst_QByteArrayList::join() const
+{
+ QFETCH(QByteArrayList, input);
+ QFETCH(QByteArray, expectedResult);
+
+ QCOMPARE(input.join(), expectedResult);
+}
+
+void tst_QByteArrayList::join_data() const
+{
+ QTest::addColumn<QByteArrayList>("input");
+ QTest::addColumn<QByteArray>("expectedResult");
+
+ QTest::newRow("data1") << QByteArrayList()
+ << QByteArray();
+
+ QTest::newRow("data2") << QByteArrayList("one")
+ << QByteArray("one");
+
+ QTest::newRow("data3") << (QByteArrayList() << "a" << "b")
+ << QByteArray("ab");
+
+ QTest::newRow("data4") << (QByteArrayList() << "a" << "b" << "c")
+ << QByteArray("abc");
+}
+
+void tst_QByteArrayList::joinByteArray() const
+{
+ QFETCH(QByteArrayList, input);
+ QFETCH(QByteArray, separator);
+ QFETCH(QByteArray, expectedResult);
+
+ QCOMPARE(input.join(separator), expectedResult);
+}
+
+void tst_QByteArrayList::joinByteArray_data() const
+{
+ QTest::addColumn<QByteArrayList>("input");
+ QTest::addColumn<QByteArray>("separator");
+ QTest::addColumn<QByteArray>("expectedResult");
+
+ QTest::newRow("data1") << QByteArrayList()
+ << QByteArray()
+ << QByteArray();
+
+ QTest::newRow("data2") << QByteArrayList()
+ << QByteArray("separator")
+ << QByteArray();
+
+ QTest::newRow("data3") << QByteArrayList("one")
+ << QByteArray("separator")
+ << QByteArray("one");
+
+ QTest::newRow("data4") << (QByteArrayList() << "a" << "b")
+ << QByteArray(" ")
+ << QByteArray("a b");
+
+ QTest::newRow("data5") << (QByteArrayList() << "a" << "b" << "c")
+ << QByteArray(" ")
+ << QByteArray("a b c");
+
+ QTest::newRow("data6") << (QByteArrayList() << "a" << "b" << "c")
+ << QByteArray()
+ << QByteArray("abc");
+
+ QTest::newRow("data7") << (QByteArrayList() << "a" << "b" << "c")
+ << QByteArray("") //empty
+ << QByteArray("abc");
+}
+
+void tst_QByteArrayList::joinChar() const
+{
+ QFETCH(QByteArrayList, input);
+ QFETCH(char, separator);
+ QFETCH(QByteArray, expectedResult);
+
+ QCOMPARE(input.join(separator), expectedResult);
+}
+
+void tst_QByteArrayList::joinChar_data() const
+{
+ QTest::addColumn<QByteArrayList>("input");
+ QTest::addColumn<char>("separator");
+ QTest::addColumn<QByteArray>("expectedResult");
+
+ QTest::newRow("data1") << QByteArrayList()
+ << ' '
+ << QByteArray();
+
+ QTest::newRow("data2") << (QByteArrayList() << "a a" << "b")
+ << ' '
+ << QByteArray("a a b");
+
+ QTest::newRow("data3") << (QByteArrayList() << "a" << "b" << "c c")
+ << ' '
+ << QByteArray("a b c c");
+}
+
+void tst_QByteArrayList::joinEmptiness() const
+{
+ QByteArrayList list;
+ QByteArray string = list.join(QByteArray());
+
+ QVERIFY(string.isEmpty());
+ QVERIFY(string.isNull());
+}
+
+void tst_QByteArrayList::operator_plus() const
+{
+ QFETCH(QByteArrayList, lhs);
+ QFETCH(QByteArrayList, rhs);
+ QFETCH(QByteArrayList, expectedResult);
+
+ // operator+ for const lvalues
+ {
+ const QByteArrayList bal1 = lhs;
+ const QByteArrayList bal2 = rhs;
+ QCOMPARE(bal1 + bal2, expectedResult);
+ }
+ {
+ const QList<QByteArray> lba1 = lhs;
+ const QByteArrayList bal2 = rhs;
+ QCOMPARE(lba1 + bal2, expectedResult);
+ }
+ {
+ const QByteArrayList bal1 = lhs;
+ const QList<QByteArray> lba2 = rhs;
+ QCOMPARE(bal1 + lba2, expectedResult);
+ }
+ {
+ const QList<QByteArray> lba1 = lhs;
+ const QList<QByteArray> lba2 = rhs;
+ QCOMPARE(lba1 + lba2, QList<QByteArray>(expectedResult)); // check we don't mess with old code
+ }
+
+ // operator+ for rvalues (only lhs)
+ {
+ QByteArrayList bal1 = lhs;
+ const QByteArrayList bal2 = rhs;
+ QCOMPARE(qMove(bal1) + bal2, expectedResult);
+ }
+ {
+ QList<QByteArray> lba1 = lhs;
+ const QByteArrayList bal2 = rhs;
+ QCOMPARE(qMove(lba1) + bal2, expectedResult);
+ }
+ {
+ QByteArrayList bal1 = lhs;
+ const QList<QByteArray> lba2 = rhs;
+ QCOMPARE(qMove(bal1) + lba2, expectedResult);
+ }
+ {
+ QList<QByteArray> lba1 = lhs;
+ const QList<QByteArray> lba2 = rhs;
+ QCOMPARE(qMove(lba1) + lba2, QList<QByteArray>(expectedResult)); // check we don't mess with old code
+ }
+
+ // operator += for const lvalues
+ {
+ QByteArrayList bal1 = lhs;
+ const QByteArrayList bal2 = rhs;
+ QCOMPARE(bal1 += bal2, expectedResult);
+ }
+ {
+ QByteArrayList bal1 = lhs;
+ const QList<QByteArray> lba2 = rhs;
+ QCOMPARE(bal1 += lba2, expectedResult);
+ }
+ {
+ QList<QByteArray> lba1 = lhs;
+ const QByteArrayList bal2 = rhs;
+ QCOMPARE(lba1 += bal2, QList<QByteArray>(expectedResult));
+ }
+
+ QByteArrayList t1 = lhs;
+ QByteArrayList t2 = rhs;
+
+ QCOMPARE(qMove(t1) + t2, expectedResult);
+}
+
+void tst_QByteArrayList::operator_plus_data() const
+{
+ QTest::addColumn<QByteArrayList>("lhs");
+ QTest::addColumn<QByteArrayList>("rhs");
+ QTest::addColumn<QByteArrayList>("expectedResult");
+
+ QTest::newRow("simpl") << ( QByteArrayList() << "a" )
+ << ( QByteArrayList() << "b" << "c" )
+ << ( QByteArrayList() << "a" << "b" << "c" );
+
+ QTest::newRow("blank1") << QByteArrayList()
+ << QByteArrayList()
+ << QByteArrayList();
+
+ QTest::newRow("blank2") << ( QByteArrayList() )
+ << ( QByteArrayList() << "b" << "c" )
+ << ( QByteArrayList() << "b" << "c" );
+
+ QTest::newRow("empty1") << ( QByteArrayList() << "" )
+ << ( QByteArrayList() << "b" << "c" )
+ << ( QByteArrayList() << "" << "b" << "c" );
+
+ QTest::newRow("empty2") << ( QByteArrayList() << "a" )
+ << ( QByteArrayList() << "" << "c" )
+ << ( QByteArrayList() << "a" << "" << "c" );
+}
+
+void tst_QByteArrayList::initializerList() const
+{
+#ifdef Q_COMPILER_INITIALIZER_LISTS
+ // constructor
+ QByteArrayList v1 = {QByteArray("hello"),"world",QByteArray("plop")};
+ QCOMPARE(v1, (QByteArrayList() << "hello" << "world" << "plop"));
+ QCOMPARE(v1, (QByteArrayList{"hello","world","plop"}));
+ // assignment operator (through implicit temporary)
+ QByteArrayList v2;
+ v2 = {QByteArray("hello"),"world",QByteArray("plop")};
+ QCOMPARE(v2, v1);
+#else
+ QSKIP("This test requires C++11 initializer_list support in the compiler.");
+#endif
+}
+
+QTEST_APPLESS_MAIN(tst_QByteArrayList)
+#include "tst_qbytearraylist.moc"
diff --git a/tests/auto/corelib/tools/tools.pro b/tests/auto/corelib/tools/tools.pro
index 19cb060960..ce37ccb18b 100644
--- a/tests/auto/corelib/tools/tools.pro
+++ b/tests/auto/corelib/tools/tools.pro
@@ -6,6 +6,7 @@ SUBDIRS=\
qarraydata_strictiterators \
qbitarray \
qbytearray \
+ qbytearraylist \
qbytearraymatcher \
qbytedatabuffer \
qcache \