QtBase  v6.3.1
qcborarray.h
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2018 Intel Corporation.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QCBORARRAY_H
41 #define QCBORARRAY_H
42 
43 #include <QtCore/qcborvalue.h>
44 
45 #include <initializer_list>
46 
48 
49 class QJsonArray;
50 class QDataStream;
51 
52 namespace QJsonPrivate { class Variant; }
53 
55 class Q_CORE_EXPORT QCborArray
56 {
57 public:
58  class ConstIterator;
59  class Iterator {
60  mutable QCborValueRef item;
61  friend class ConstIterator;
62  friend class QCborArray;
63  Iterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
64  public:
65  typedef std::random_access_iterator_tag iterator_category;
70 
71  constexpr Iterator() = default;
72  constexpr Iterator(const Iterator &) = default;
74  {
75  // rebind the reference
76  item.d = other.item.d;
77  item.i = other.item.i;
78  return *this;
79  }
80 
81  QCborValueRef operator*() const { return item; }
82  QCborValueRef *operator->() const { return &item; }
83  QCborValueRef operator[](qsizetype j) { return { item.d, item.i + j }; }
84 
85  bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
86  bool operator!=(const Iterator &o) const { return !(*this == o); }
87  bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
88  bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
89  bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
90  bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
91  bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
92  bool operator!=(const ConstIterator &o) const { return !(*this == o); }
93  bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
94  bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
95  bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
96  bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
97  Iterator &operator++() { ++item.i; return *this; }
98  Iterator operator++(int) { Iterator n = *this; ++item.i; return n; }
99  Iterator &operator--() { item.i--; return *this; }
100  Iterator operator--(int) { Iterator n = *this; item.i--; return n; }
101  Iterator &operator+=(qsizetype j) { item.i += j; return *this; }
102  Iterator &operator-=(qsizetype j) { item.i -= j; return *this; }
103  Iterator operator+(qsizetype j) const { return Iterator({ item.d, item.i + j }); }
104  Iterator operator-(qsizetype j) const { return Iterator({ item.d, item.i - j }); }
105  qsizetype operator-(Iterator j) const { return item.i - j.item.i; }
106  };
107 
110  friend class Iterator;
111  friend class QCborArray;
112  ConstIterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
113  public:
114  typedef std::random_access_iterator_tag iterator_category;
116  typedef const QCborValue value_type;
117  typedef const QCborValueRef reference;
118  typedef const QCborValueRef *pointer;
119 
120  constexpr ConstIterator() = default;
121  constexpr ConstIterator(const ConstIterator &) = default;
123  {
124  // rebind the reference
125  item.d = other.item.d;
126  item.i = other.item.i;
127  return *this;
128  }
129 
130  const QCborValueRef operator*() const { return item; }
131  const QCborValueRef *operator->() const { return &item; }
132  const QCborValueRef operator[](qsizetype j) { return { item.d, item.i + j }; }
133 
134  bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
135  bool operator!=(const Iterator &o) const { return !(*this == o); }
136  bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
137  bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
138  bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
139  bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
140  bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
141  bool operator!=(const ConstIterator &o) const { return !(*this == o); }
142  bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
143  bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
144  bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
145  bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
146  ConstIterator &operator++() { ++item.i; return *this; }
147  ConstIterator operator++(int) { ConstIterator n = *this; ++item.i; return n; }
148  ConstIterator &operator--() { item.i--; return *this; }
149  ConstIterator operator--(int) { ConstIterator n = *this; item.i--; return n; }
150  ConstIterator &operator+=(qsizetype j) { item.i += j; return *this; }
151  ConstIterator &operator-=(qsizetype j) { item.i -= j; return *this; }
152  ConstIterator operator+(qsizetype j) const { return ConstIterator({ item.d, item.i + j }); }
153  ConstIterator operator-(qsizetype j) const { return ConstIterator({ item.d, item.i - j }); }
154  qsizetype operator-(ConstIterator j) const { return item.i - j.item.i; }
155  };
156 
159  typedef value_type *pointer;
160  typedef const value_type *const_pointer;
162  typedef const QCborValue &const_reference;
164 
165  QCborArray() noexcept;
166  QCborArray(const QCborArray &other) noexcept;
167  QCborArray &operator=(const QCborArray &other) noexcept;
168  QCborArray(std::initializer_list<QCborValue> args)
169  : QCborArray()
170  {
171  detach(qsizetype(args.size()));
172  for (const QCborValue &v : args)
173  append(v);
174  }
175  ~QCborArray();
176 
177  void swap(QCborArray &other) noexcept
178  {
179  d.swap(other.d);
180  }
181 
182  QCborValue toCborValue() const { return *this; }
183 
184  qsizetype size() const noexcept;
185  bool isEmpty() const { return size() == 0; }
186  void clear();
187 
188  QCborValue at(qsizetype i) const;
189  QCborValue first() const { return at(0); }
190  QCborValue last() const { return at(size() - 1); }
191  const QCborValue operator[](qsizetype i) const { return at(i); }
192  QCborValueRef first() { Q_ASSERT(!isEmpty()); return begin()[0]; }
193  QCborValueRef last() { Q_ASSERT(!isEmpty()); return begin()[size() - 1]; }
195  {
196  if (i >= size())
197  insert(i, QCborValue());
198  return begin()[i];
199  }
200 
201  void insert(qsizetype i, const QCborValue &value);
202  void insert(qsizetype i, QCborValue &&value);
203  void prepend(const QCborValue &value) { insert(0, value); }
204  void prepend(QCborValue &&value) { insert(0, std::move(value)); }
205  void append(const QCborValue &value) { insert(-1, value); }
206  void append(QCborValue &&value) { insert(-1, std::move(value)); }
207  QCborValue extract(ConstIterator it) { return extract(Iterator{ it.item.d, it.item.i }); }
208  QCborValue extract(Iterator it);
209  void removeAt(qsizetype i);
211  void removeFirst() { removeAt(0); }
212  void removeLast() { removeAt(size() - 1); }
213  QCborValue takeFirst() { return takeAt(0); }
214  QCborValue takeLast() { return takeAt(size() - 1); }
215 
216  bool contains(const QCborValue &value) const;
217 
218  int compare(const QCborArray &other) const noexcept Q_DECL_PURE_FUNCTION;
219 #if 0 && __has_include(<compare>)
220  std::strong_ordering operator<=>(const QCborArray &other) const
221  {
222  int c = compare(other);
223  if (c > 0) return std::strong_ordering::greater;
224  if (c == 0) return std::strong_ordering::equivalent;
225  return std::strong_ordering::less;
226  }
227 #else
228  bool operator==(const QCborArray &other) const noexcept
229  { return compare(other) == 0; }
230  bool operator!=(const QCborArray &other) const noexcept
231  { return !(*this == other); }
232  bool operator<(const QCborArray &other) const
233  { return compare(other) < 0; }
234 #endif
235 
238  iterator begin() { detach(); return iterator{d.data(), 0}; }
239  const_iterator constBegin() const { return const_iterator{d.data(), 0}; }
240  const_iterator begin() const { return constBegin(); }
241  const_iterator cbegin() const { return constBegin(); }
242  iterator end() { detach(); return iterator{d.data(), size()}; }
243  const_iterator constEnd() const { return const_iterator{d.data(), size()}; }
244  const_iterator end() const { return constEnd(); }
245  const_iterator cend() const { return constEnd(); }
247  { insert(before.item.i, value); return iterator{d.data(), before.item.i}; }
249  { insert(before.item.i, value); return iterator{d.data(), before.item.i}; }
250  iterator erase(iterator it) { removeAt(it.item.i); return iterator{d.data(), it.item.i}; }
251  iterator erase(const_iterator it) { removeAt(it.item.i); return iterator{d.data(), it.item.i}; }
252 
253  void push_back(const QCborValue &t) { append(t); }
254  void push_front(const QCborValue &t) { prepend(t); }
255  void pop_front() { removeFirst(); }
256  void pop_back() { removeLast(); }
257  bool empty() const { return isEmpty(); }
258 
259  // convenience
261  { QCborArray n = *this; n += v; return n; }
263  { append(v); return *this; }
265  { append(v); return *this; }
266 
267  static QCborArray fromStringList(const QStringList &list);
269  static QCborArray fromJsonArray(const QJsonArray &array);
270  static QCborArray fromJsonArray(QJsonArray &&array) noexcept;
271  QVariantList toVariantList() const;
272  QJsonArray toJsonArray() const;
273 
274 private:
275  void detach(qsizetype reserve = 0);
276 
277  friend QCborValue;
278  friend QCborValueRef;
279  friend class QJsonPrivate::Variant;
280  explicit QCborArray(QCborContainerPrivate &dd) noexcept;
282 };
283 
285 
287  : n(-1), container(a.d.take()), t(Array)
288 {
289 }
290 
292 {
293  return concrete().toArray();
294 }
295 
297 {
298  return concrete().toArray(a);
299 }
300 
301 Q_CORE_EXPORT size_t qHash(const QCborArray &array, size_t seed = 0);
302 
303 #if !defined(QT_NO_DEBUG_STREAM)
304 Q_CORE_EXPORT QDebug operator<<(QDebug, const QCborArray &a);
305 #endif
306 
307 #ifndef QT_NO_DATASTREAM
308 #if QT_CONFIG(cborstreamwriter)
309 Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QCborArray &);
310 #endif
311 Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QCborArray &);
312 #endif
313 
315 
316 #endif // QCBORARRAY_H
small capitals from c petite p scientific i
[1]
Definition: afcover.h:80
The QCborArray::ConstIterator class provides an STL-style const iterator for QCborArray.
Definition: qcborarray.h:108
const QCborValueRef reference
Definition: qcborarray.h:117
ConstIterator & operator-=(qsizetype j)
Definition: qcborarray.h:151
const QCborValueRef operator*() const
Definition: qcborarray.h:130
qsizetype operator-(ConstIterator j) const
Definition: qcborarray.h:154
bool operator>(const ConstIterator &other) const
Definition: qcborarray.h:144
ConstIterator operator--(int)
Definition: qcborarray.h:149
bool operator>=(const ConstIterator &other) const
Definition: qcborarray.h:145
constexpr ConstIterator()=default
bool operator<(const Iterator &other) const
Definition: qcborarray.h:136
bool operator<(const ConstIterator &other) const
Definition: qcborarray.h:142
bool operator!=(const ConstIterator &o) const
Definition: qcborarray.h:141
ConstIterator & operator+=(qsizetype j)
Definition: qcborarray.h:150
bool operator<=(const Iterator &other) const
Definition: qcborarray.h:137
bool operator==(const Iterator &o) const
Definition: qcborarray.h:134
bool operator>=(const Iterator &other) const
Definition: qcborarray.h:139
constexpr ConstIterator(const ConstIterator &)=default
const QCborValueRef * pointer
Definition: qcborarray.h:118
ConstIterator operator+(qsizetype j) const
Definition: qcborarray.h:152
const QCborValueRef operator[](qsizetype j)
Definition: qcborarray.h:132
ConstIterator & operator--()
Definition: qcborarray.h:148
std::random_access_iterator_tag iterator_category
Definition: qcborarray.h:114
const QCborValueRef * operator->() const
Definition: qcborarray.h:131
ConstIterator & operator=(const ConstIterator &other)
Definition: qcborarray.h:122
bool operator==(const ConstIterator &o) const
Definition: qcborarray.h:140
bool operator!=(const Iterator &o) const
Definition: qcborarray.h:135
const QCborValue value_type
Definition: qcborarray.h:116
ConstIterator operator++(int)
Definition: qcborarray.h:147
ConstIterator & operator++()
Definition: qcborarray.h:146
bool operator<=(const ConstIterator &other) const
Definition: qcborarray.h:143
ConstIterator operator-(qsizetype j) const
Definition: qcborarray.h:153
bool operator>(const Iterator &other) const
Definition: qcborarray.h:138
The QCborArray::Iterator class provides an STL-style non-const iterator for QCborArray.
Definition: qcborarray.h:59
qsizetype operator-(Iterator j) const
Definition: qcborarray.h:105
constexpr Iterator()=default
bool operator<(const Iterator &other) const
Definition: qcborarray.h:87
bool operator<=(const Iterator &other) const
Definition: qcborarray.h:88
Iterator operator-(qsizetype j) const
Definition: qcborarray.h:104
bool operator==(const ConstIterator &o) const
Definition: qcborarray.h:91
Iterator operator--(int)
Definition: qcborarray.h:100
QCborValue value_type
Definition: qcborarray.h:67
Iterator & operator=(const Iterator &other)
Definition: qcborarray.h:73
bool operator>(const Iterator &other) const
Definition: qcborarray.h:89
Iterator & operator++()
Definition: qcborarray.h:97
Iterator operator++(int)
Definition: qcborarray.h:98
QCborValueRef operator[](qsizetype j)
Definition: qcborarray.h:83
QCborValueRef operator*() const
Definition: qcborarray.h:81
constexpr Iterator(const Iterator &)=default
bool operator<(const ConstIterator &other) const
Definition: qcborarray.h:93
bool operator>=(const Iterator &other) const
Definition: qcborarray.h:90
Iterator & operator--()
Definition: qcborarray.h:99
Iterator & operator+=(qsizetype j)
Definition: qcborarray.h:101
qsizetype difference_type
Definition: qcborarray.h:66
Iterator operator+(qsizetype j) const
Definition: qcborarray.h:103
QCborValueRef reference
Definition: qcborarray.h:68
std::random_access_iterator_tag iterator_category
Definition: qcborarray.h:65
bool operator>=(const ConstIterator &other) const
Definition: qcborarray.h:96
bool operator>(const ConstIterator &other) const
Definition: qcborarray.h:95
bool operator!=(const ConstIterator &o) const
Definition: qcborarray.h:92
bool operator!=(const Iterator &o) const
Definition: qcborarray.h:86
QCborValueRef * pointer
Definition: qcborarray.h:69
bool operator<=(const ConstIterator &other) const
Definition: qcborarray.h:94
Iterator & operator-=(qsizetype j)
Definition: qcborarray.h:102
bool operator==(const Iterator &o) const
Definition: qcborarray.h:85
QCborValueRef * operator->() const
Definition: qcborarray.h:82
The QCborArray class is used to hold an array of CBOR elements.
Definition: qcborarray.h:56
QCborValue & reference
Definition: qcborarray.h:161
QCborValue takeLast()
Definition: qcborarray.h:214
const_iterator constEnd() const
Definition: qcborarray.h:243
const_iterator constBegin() const
Definition: qcborarray.h:239
QCborValue takeAt(qsizetype i)
Definition: qcborarray.h:210
QVariantList toVariantList() const
Definition: qjsoncbor.cpp:823
QCborValue takeFirst()
Definition: qcborarray.h:213
void append(QCborValue &&value)
Definition: qcborarray.h:206
iterator begin()
Definition: qcborarray.h:238
static QCborArray fromJsonArray(const QJsonArray &array)
Definition: qjsoncbor.cpp:875
bool operator==(const QCborArray &other) const noexcept
Definition: qcborarray.h:228
bool operator!=(const QCborArray &other) const noexcept
Definition: qcborarray.h:230
const value_type * const_pointer
Definition: qcborarray.h:160
void pop_front()
Definition: qcborarray.h:255
const_iterator begin() const
Definition: qcborarray.h:240
void append(const QCborValue &value)
Definition: qcborarray.h:205
ConstIterator const_iterator
Definition: qcborarray.h:237
const_iterator end() const
Definition: qcborarray.h:244
void removeAt(qsizetype i)
Definition: qcborarray.cpp:395
void push_back(const QCborValue &t)
Definition: qcborarray.h:253
QCborValue toCborValue() const
Definition: qcborarray.h:182
bool isEmpty() const
Definition: qcborarray.h:185
QCborArray() noexcept
Definition: qcborarray.cpp:117
Iterator iterator
Definition: qcborarray.h:236
void removeLast()
Definition: qcborarray.h:212
iterator insert(const_iterator before, const QCborValue &value)
Definition: qcborarray.h:248
value_type * pointer
Definition: qcborarray.h:159
QCborValue first() const
Definition: qcborarray.h:189
const_iterator cend() const
Definition: qcborarray.h:245
void push_front(const QCborValue &t)
Definition: qcborarray.h:254
const QCborValue & const_reference
Definition: qcborarray.h:162
QCborArray & operator+=(const QCborValue &v)
Definition: qcborarray.h:262
QCborValueRef last()
Definition: qcborarray.h:193
void prepend(QCborValue &&value)
Definition: qcborarray.h:204
QJsonArray toJsonArray() const
Definition: qjsoncbor.cpp:447
QCborValue last() const
Definition: qcborarray.h:190
iterator erase(iterator it)
Definition: qcborarray.h:250
void removeFirst()
Definition: qcborarray.h:211
qsizetype difference_type
Definition: qcborarray.h:163
void swap(QCborArray &other) noexcept
Definition: qcborarray.h:177
QCborValue extract(ConstIterator it)
Definition: qcborarray.h:207
bool empty() const
Definition: qcborarray.h:257
QCborValue value_type
Definition: qcborarray.h:158
iterator insert(iterator before, const QCborValue &value)
Definition: qcborarray.h:246
const_iterator cbegin() const
Definition: qcborarray.h:241
QCborArray operator+(const QCborValue &v) const
Definition: qcborarray.h:260
static QCborArray fromStringList(const QStringList &list)
Definition: qjsoncbor.cpp:837
qsizetype size_type
Definition: qcborarray.h:157
static QCborArray fromVariantList(const QVariantList &list)
Definition: qjsoncbor.cpp:855
iterator erase(const_iterator it)
Definition: qcborarray.h:251
bool operator<(const QCborArray &other) const
Definition: qcborarray.h:232
void pop_back()
Definition: qcborarray.h:256
QCborValueRef operator[](qsizetype i)
Definition: qcborarray.h:194
QCborValueRef first()
Definition: qcborarray.h:192
const QCborValue operator[](qsizetype i) const
Definition: qcborarray.h:191
QCborArray & operator<<(const QCborValue &v)
Definition: qcborarray.h:264
void prepend(const QCborValue &value)
Definition: qcborarray.h:203
iterator end()
Definition: qcborarray.h:242
The QCborValue class encapsulates a value in CBOR.
Definition: qcborvalue.h:86
QCborArray toArray() const
QCborArray toArray() const
Definition: qcborarray.h:291
The QDataStream class provides serialization of binary data to a QIODevice.
Definition: qdatastream.h:66
operator>>(QDataStream &ds, qfloat16 &f)
Definition: qfloat16.cpp:344
operator<<(QDataStream &ds, qfloat16 f)
Definition: qfloat16.cpp:327
The QDebug class provides an output stream for debugging information.
Definition: qdebug.h:65
template< typename Enum > size_t qHash(QFlags< Enum > flags, size_t seed=0) noexcept
The QJsonArray class encapsulates a JSON array.
Definition: qjsonarray.h:54
The QStringList class provides a list of strings.
map insert("Paris", "France")
b clear()
list append(new Employee("Blackpool", "Stephen"))
set reserve(20000)
set contains("Julia")
auto it unsigned count const
Definition: hb-iter.hh:848
#define inline
Definition: md4c.c:45
GeneratorWrapper< T > take(size_t target, GeneratorWrapper< T > &&generator)
Definition: catch_p_p.h:4151
Definition: qfloat16.h:381
#define Q_DECL_PURE_FUNCTION
EGLOutputLayerEXT EGLint EGLAttrib value
ptrdiff_t qsizetype
Definition: qglobal.h:308
GLsizei const GLfloat * v
[13]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLfloat n
const GLubyte * c
Definition: qopenglext.h:12701
GLenum array
Definition: qopenglext.h:7028
GLdouble GLdouble t
[9]
Definition: qopenglext.h:243
#define Q_ASSERT(cond)
Definition: qrandom.cpp:84
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
#define Q_DECLARE_SHARED(TYPE)
Definition: qtypeinfo.h:197
QCborValue(QCborTag(2), QByteArray("\x01\0\0\0\0\0\0\0\0", 9))
[0]
list prepend("one")
QSharedPointer< T > other(t)
[5]
QGraphicsItem * item
QAction * at
QStringList::Iterator it
QStringList list
[0]
void compare(Input input, FnUnderTest fn_under_test, const QByteArray &output)