File indexing completed on 2025-09-17 09:09:10
0001
0002
0003
0004 #ifndef QCBORARRAY_H
0005 #define QCBORARRAY_H
0006
0007 #include <QtCore/qcborvalue.h>
0008
0009 #include <initializer_list>
0010
0011 QT_BEGIN_NAMESPACE
0012
0013 class QJsonArray;
0014 class QDataStream;
0015
0016 namespace QJsonPrivate { class Variant; }
0017
0018 class QCborContainerPrivate;
0019 class Q_CORE_EXPORT QCborArray
0020 {
0021 public:
0022 class ConstIterator;
0023 class Iterator {
0024 QCborValueRef item {};
0025 friend class ConstIterator;
0026 friend class QCborArray;
0027 Iterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
0028 public:
0029 typedef std::random_access_iterator_tag iterator_category;
0030 typedef qsizetype difference_type;
0031 typedef QCborValue value_type;
0032 typedef QCborValueRef reference;
0033 typedef QCborValueRef *pointer;
0034
0035 constexpr Iterator() = default;
0036 constexpr Iterator(const Iterator &) = default;
0037 Iterator &operator=(const Iterator &other)
0038 {
0039
0040 item.d = other.item.d;
0041 item.i = other.item.i;
0042 return *this;
0043 }
0044
0045 QCborValueRef operator*() const { return item; }
0046 QCborValueRef *operator->() { return &item; }
0047 const QCborValueConstRef *operator->() const { return &item; }
0048 QCborValueRef operator[](qsizetype j) const { return { item.d, item.i + j }; }
0049 #if QT_CORE_REMOVED_SINCE(6, 8)
0050 bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
0051 bool operator!=(const Iterator &o) const { return !operator==(o); }
0052 bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
0053 bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
0054 bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
0055 bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
0056 bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
0057 bool operator!=(const ConstIterator &o) const { return !operator==(o); }
0058 bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
0059 bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
0060 bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
0061 bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
0062 #endif
0063 Iterator &operator++() { ++item.i; return *this; }
0064 Iterator operator++(int) { Iterator n = *this; ++item.i; return n; }
0065 Iterator &operator--() { item.i--; return *this; }
0066 Iterator operator--(int) { Iterator n = *this; item.i--; return n; }
0067 Iterator &operator+=(qsizetype j) { item.i += j; return *this; }
0068 Iterator &operator-=(qsizetype j) { item.i -= j; return *this; }
0069 Iterator operator+(qsizetype j) const { return Iterator({ item.d, item.i + j }); }
0070 Iterator operator-(qsizetype j) const { return Iterator({ item.d, item.i - j }); }
0071 qsizetype operator-(Iterator j) const { return item.i - j.item.i; }
0072 private:
0073
0074 static bool comparesEqual_helper(const Iterator &lhs, const Iterator &rhs) noexcept
0075 {
0076 return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
0077 }
0078
0079 static bool comparesEqual_helper(const Iterator &lhs, const ConstIterator &rhs) noexcept
0080 {
0081 return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
0082 }
0083
0084 static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs,
0085 const Iterator &rhs) noexcept
0086 {
0087 Q_ASSERT(lhs.item.d == rhs.item.d);
0088 return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
0089 }
0090
0091 static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs,
0092 const ConstIterator &rhs) noexcept
0093 {
0094 Q_ASSERT(lhs.item.d == rhs.item.d);
0095 return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
0096 }
0097
0098
0099 friend bool comparesEqual(const Iterator &lhs, const Iterator &rhs) noexcept
0100 {
0101 return comparesEqual_helper(lhs, rhs);
0102 }
0103 friend Qt::strong_ordering compareThreeWay(const Iterator &lhs,
0104 const Iterator &rhs) noexcept
0105 {
0106 return compareThreeWay_helper(lhs, rhs);
0107 }
0108 Q_DECLARE_STRONGLY_ORDERED(Iterator)
0109 friend bool comparesEqual(const Iterator &lhs, const ConstIterator &rhs) noexcept
0110 {
0111 return comparesEqual_helper(lhs, rhs);
0112 }
0113 friend Qt::strong_ordering compareThreeWay(const Iterator &lhs,
0114 const ConstIterator &rhs) noexcept
0115 {
0116 return compareThreeWay_helper(lhs, rhs);
0117 }
0118 Q_DECLARE_STRONGLY_ORDERED(Iterator, ConstIterator)
0119 };
0120
0121 class ConstIterator {
0122 QCborValueConstRef item;
0123 friend class Iterator;
0124 friend class QCborArray;
0125 ConstIterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
0126 public:
0127 typedef std::random_access_iterator_tag iterator_category;
0128 typedef qsizetype difference_type;
0129 typedef const QCborValue value_type;
0130 typedef const QCborValueRef reference;
0131 typedef const QCborValueRef *pointer;
0132
0133 constexpr ConstIterator() = default;
0134 constexpr ConstIterator(const ConstIterator &) = default;
0135 ConstIterator &operator=(const ConstIterator &other)
0136 {
0137
0138 item.d = other.item.d;
0139 item.i = other.item.i;
0140 return *this;
0141 }
0142
0143 QCborValueConstRef operator*() const { return item; }
0144 const QCborValueConstRef *operator->() const { return &item; }
0145 QCborValueConstRef operator[](qsizetype j) const { return QCborValueRef{ item.d, item.i + j }; }
0146 #if QT_CORE_REMOVED_SINCE(6, 8)
0147 bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
0148 bool operator!=(const Iterator &o) const { return !operator==(o); }
0149 bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
0150 bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
0151 bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
0152 bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
0153 bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
0154 bool operator!=(const ConstIterator &o) const { return !operator==(o); }
0155 bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
0156 bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
0157 bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
0158 bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
0159 #endif
0160 ConstIterator &operator++() { ++item.i; return *this; }
0161 ConstIterator operator++(int) { ConstIterator n = *this; ++item.i; return n; }
0162 ConstIterator &operator--() { item.i--; return *this; }
0163 ConstIterator operator--(int) { ConstIterator n = *this; item.i--; return n; }
0164 ConstIterator &operator+=(qsizetype j) { item.i += j; return *this; }
0165 ConstIterator &operator-=(qsizetype j) { item.i -= j; return *this; }
0166 ConstIterator operator+(qsizetype j) const { return ConstIterator({ item.d, item.i + j }); }
0167 ConstIterator operator-(qsizetype j) const { return ConstIterator({ item.d, item.i - j }); }
0168 qsizetype operator-(ConstIterator j) const { return item.i - j.item.i; }
0169 private:
0170
0171 static bool comparesEqual_helper(const ConstIterator &lhs,
0172 const ConstIterator &rhs) noexcept
0173 {
0174 return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
0175 }
0176 static Qt::strong_ordering compareThreeWay_helper(const ConstIterator &lhs,
0177 const ConstIterator &rhs) noexcept
0178 {
0179 Q_ASSERT(lhs.item.d == rhs.item.d);
0180 return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
0181 }
0182
0183
0184 friend bool comparesEqual(const ConstIterator &lhs, const ConstIterator &rhs) noexcept
0185 {
0186 return comparesEqual_helper(lhs, rhs);
0187 }
0188 friend Qt::strong_ordering compareThreeWay(const ConstIterator &lhs,
0189 const ConstIterator &rhs) noexcept
0190 {
0191 return compareThreeWay_helper(lhs, rhs);
0192 }
0193 Q_DECLARE_STRONGLY_ORDERED(ConstIterator)
0194 };
0195
0196 typedef qsizetype size_type;
0197 typedef QCborValue value_type;
0198 typedef value_type *pointer;
0199 typedef const value_type *const_pointer;
0200 typedef QCborValue &reference;
0201 typedef const QCborValue &const_reference;
0202 typedef qsizetype difference_type;
0203
0204 QCborArray() noexcept;
0205 QCborArray(const QCborArray &other) noexcept;
0206 QCborArray &operator=(const QCborArray &other) noexcept;
0207 QCborArray(std::initializer_list<QCborValue> args)
0208 : QCborArray()
0209 {
0210 detach(qsizetype(args.size()));
0211 for (const QCborValue &v : args)
0212 append(v);
0213 }
0214 ~QCborArray();
0215
0216 void swap(QCborArray &other) noexcept
0217 {
0218 d.swap(other.d);
0219 }
0220
0221 QCborValue toCborValue() const { return *this; }
0222
0223 qsizetype size() const noexcept;
0224 bool isEmpty() const { return size() == 0; }
0225 void clear();
0226
0227 QCborValue at(qsizetype i) const;
0228 QCborValue first() const { return at(0); }
0229 QCborValue last() const { return at(size() - 1); }
0230 const QCborValue operator[](qsizetype i) const { return at(i); }
0231 QCborValueRef first() { Q_ASSERT(!isEmpty()); return begin()[0]; }
0232 QCborValueRef last() { Q_ASSERT(!isEmpty()); return begin()[size() - 1]; }
0233 QCborValueRef operator[](qsizetype i)
0234 {
0235 if (i >= size())
0236 insert(i, QCborValue());
0237 return begin()[i];
0238 }
0239
0240 void insert(qsizetype i, const QCborValue &value);
0241 void insert(qsizetype i, QCborValue &&value);
0242 void prepend(const QCborValue &value) { insert(0, value); }
0243 void prepend(QCborValue &&value) { insert(0, std::move(value)); }
0244 void append(const QCborValue &value) { insert(-1, value); }
0245 void append(QCborValue &&value) { insert(-1, std::move(value)); }
0246 QCborValue extract(ConstIterator it) { return extract(Iterator{ it.item.d, it.item.i }); }
0247 QCborValue extract(Iterator it);
0248 void removeAt(qsizetype i);
0249 QCborValue takeAt(qsizetype i) { Q_ASSERT(i < size()); return extract(begin() + i); }
0250 void removeFirst() { removeAt(0); }
0251 void removeLast() { removeAt(size() - 1); }
0252 QCborValue takeFirst() { return takeAt(0); }
0253 QCborValue takeLast() { return takeAt(size() - 1); }
0254
0255 bool contains(const QCborValue &value) const;
0256
0257 int compare(const QCborArray &other) const noexcept Q_DECL_PURE_FUNCTION;
0258 #if QT_CORE_REMOVED_SINCE(6, 8)
0259 bool operator==(const QCborArray &other) const noexcept
0260 { return compare(other) == 0; }
0261 bool operator!=(const QCborArray &other) const noexcept
0262 { return !operator==(other); }
0263 bool operator<(const QCborArray &other) const
0264 { return compare(other) < 0; }
0265 #endif
0266
0267 typedef Iterator iterator;
0268 typedef ConstIterator const_iterator;
0269 iterator begin() { detach(); return iterator{d.data(), 0}; }
0270 const_iterator constBegin() const { return const_iterator{d.data(), 0}; }
0271 const_iterator begin() const { return constBegin(); }
0272 const_iterator cbegin() const { return constBegin(); }
0273 iterator end() { detach(); return iterator{d.data(), size()}; }
0274 const_iterator constEnd() const { return const_iterator{d.data(), size()}; }
0275 const_iterator end() const { return constEnd(); }
0276 const_iterator cend() const { return constEnd(); }
0277 iterator insert(iterator before, const QCborValue &value)
0278 { insert(before.item.i, value); return iterator{d.data(), before.item.i}; }
0279 iterator insert(const_iterator before, const QCborValue &value)
0280 { insert(before.item.i, value); return iterator{d.data(), before.item.i}; }
0281 iterator erase(iterator it) { removeAt(it.item.i); return iterator{d.data(), it.item.i}; }
0282 iterator erase(const_iterator it) { removeAt(it.item.i); return iterator{d.data(), it.item.i}; }
0283
0284 void push_back(const QCborValue &t) { append(t); }
0285 void push_front(const QCborValue &t) { prepend(t); }
0286 void pop_front() { removeFirst(); }
0287 void pop_back() { removeLast(); }
0288 bool empty() const { return isEmpty(); }
0289
0290
0291 QCborArray operator+(const QCborValue &v) const
0292 { QCborArray n = *this; n += v; return n; }
0293 QCborArray &operator+=(const QCborValue &v)
0294 { append(v); return *this; }
0295 QCborArray &operator<<(const QCborValue &v)
0296 { append(v); return *this; }
0297
0298 static QCborArray fromStringList(const QStringList &list);
0299 static QCborArray fromVariantList(const QVariantList &list);
0300 static QCborArray fromJsonArray(const QJsonArray &array);
0301 static QCborArray fromJsonArray(QJsonArray &&array) noexcept;
0302 QVariantList toVariantList() const;
0303 QJsonArray toJsonArray() const;
0304
0305 private:
0306 friend Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool
0307 comparesEqual(const QCborArray &lhs, const QCborArray &rhs) noexcept;
0308 friend Qt::strong_ordering compareThreeWay(const QCborArray &lhs,
0309 const QCborArray &rhs) noexcept
0310 {
0311 int c = lhs.compare(rhs);
0312 return Qt::compareThreeWay(c, 0);
0313 }
0314 Q_DECLARE_STRONGLY_ORDERED(QCborArray)
0315
0316 static Q_DECL_PURE_FUNCTION bool
0317 comparesEqual_helper(const QCborArray &lhs, const QCborValue &rhs) noexcept;
0318 static Q_DECL_PURE_FUNCTION Qt::strong_ordering
0319 compareThreeWay_helper(const QCborArray &lhs, const QCborValue &rhs) noexcept;
0320 friend bool comparesEqual(const QCborArray &lhs,
0321 const QCborValue &rhs) noexcept
0322 {
0323 return comparesEqual_helper(lhs, rhs);
0324 }
0325 friend Qt::strong_ordering compareThreeWay(const QCborArray &lhs,
0326 const QCborValue &rhs) noexcept
0327 {
0328 return compareThreeWay_helper(lhs, rhs);
0329 }
0330 Q_DECLARE_STRONGLY_ORDERED(QCborArray, QCborValue)
0331
0332 static Q_DECL_PURE_FUNCTION bool
0333 comparesEqual_helper(const QCborArray &lhs, QCborValueConstRef rhs) noexcept;
0334 static Q_DECL_PURE_FUNCTION Qt::strong_ordering
0335 compareThreeWay_helper(const QCborArray &lhs, QCborValueConstRef rhs) noexcept;
0336 friend bool comparesEqual(const QCborArray &lhs,
0337 const QCborValueConstRef &rhs) noexcept
0338 {
0339 return comparesEqual_helper(lhs, rhs);
0340 }
0341 friend Qt::strong_ordering compareThreeWay(const QCborArray &lhs,
0342 const QCborValueConstRef &rhs) noexcept
0343 {
0344 return compareThreeWay_helper(lhs, rhs);
0345 }
0346 Q_DECLARE_STRONGLY_ORDERED(QCborArray, QCborValueConstRef)
0347
0348 void detach(qsizetype reserve = 0);
0349
0350 friend QCborValue;
0351 friend QCborValueRef;
0352 friend class QJsonPrivate::Variant;
0353 explicit QCborArray(QCborContainerPrivate &dd) noexcept;
0354 QExplicitlySharedDataPointer<QCborContainerPrivate> d;
0355 };
0356
0357 Q_DECLARE_SHARED(QCborArray)
0358
0359 inline QCborValue::QCborValue(QCborArray &&a)
0360 : n(-1), container(a.d.take()), t(Array)
0361 {
0362 }
0363
0364 #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
0365 inline QCborArray QCborValueRef::toArray() const
0366 {
0367 return concrete().toArray();
0368 }
0369
0370 inline QCborArray QCborValueRef::toArray(const QCborArray &a) const
0371 {
0372 return concrete().toArray(a);
0373 }
0374 #endif
0375
0376 inline QCborArray QCborValueConstRef::toArray() const
0377 {
0378 return concrete().toArray();
0379 }
0380
0381 inline QCborArray QCborValueConstRef::toArray(const QCborArray &a) const
0382 {
0383 return concrete().toArray(a);
0384 }
0385
0386 Q_CORE_EXPORT size_t qHash(const QCborArray &array, size_t seed = 0);
0387
0388 #if !defined(QT_NO_DEBUG_STREAM)
0389 Q_CORE_EXPORT QDebug operator<<(QDebug, const QCborArray &a);
0390 #endif
0391
0392 #ifndef QT_NO_DATASTREAM
0393 #if QT_CONFIG(cborstreamwriter)
0394 Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QCborArray &);
0395 #endif
0396 Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QCborArray &);
0397 #endif
0398
0399 QT_END_NAMESPACE
0400
0401 #endif