37 typedef std::pair<QCborValue, QCborValue> value_type;
38 typedef QCborValue key_type;
39 typedef QCborValue mapped_type;
40 typedef qsizetype size_type;
44 QCborValueRef item {};
45 friend class ConstIterator;
46 friend class QCborMap;
47 Iterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
49 typedef std::random_access_iterator_tag iterator_category;
50 typedef qsizetype difference_type;
51 typedef std::pair<QCborValueConstRef, QCborValueRef> value_type;
52 typedef std::pair<QCborValueConstRef, QCborValueRef> reference;
53 typedef std::pair<QCborValueConstRef, QCborValueRef> pointer;
55 constexpr Iterator() =
default;
56 constexpr Iterator(
const Iterator &) =
default;
57 ~Iterator() =
default;
58 Iterator &operator=(
const Iterator &other)
61 item.d = other.item.d;
62 item.i = other.item.i;
66 value_type operator*()
const {
return { QCborValueRef{item.d, item.i - 1}, item }; }
67 value_type operator[](qsizetype j)
const {
return *(*
this + j); }
68 QCborValueRef *operator->() {
return &item; }
69 const QCborValueConstRef *operator->()
const {
return &item; }
70#if QT_VERSION >= QT_VERSION_CHECK(7
,0
,0
)
75 key()
const {
return QCborValueRef(item.d, item.i - 1); }
76 QCborValueConstRef keyRef()
const {
return QCborValueRef(item.d, item.i - 1); }
77 QCborValueRef value()
const {
return item; }
79#if QT_CORE_REMOVED_SINCE(6
, 8
)
80 bool operator==(
const Iterator &o)
const {
return item.d == o.item.d && item.i == o.item.i; }
81 bool operator!=(
const Iterator &o)
const {
return !operator==(o); }
82 bool operator<(
const Iterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i < other.item.i; }
83 bool operator<=(
const Iterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i <= other.item.i; }
84 bool operator>(
const Iterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i > other.item.i; }
85 bool operator>=(
const Iterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i >= other.item.i; }
86 bool operator==(
const ConstIterator &o)
const {
return item.d == o.item.d && item.i == o.item.i; }
87 bool operator!=(
const ConstIterator &o)
const {
return !operator==(o); }
88 bool operator<(
const ConstIterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i < other.item.i; }
89 bool operator<=(
const ConstIterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i <= other.item.i; }
90 bool operator>(
const ConstIterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i > other.item.i; }
91 bool operator>=(
const ConstIterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i >= other.item.i; }
93 Iterator &operator++() { item.i += 2;
return *
this; }
94 Iterator operator++(
int) { Iterator n = *
this; item.i += 2;
return n; }
95 Iterator &operator--() { item.i -= 2;
return *
this; }
96 Iterator operator--(
int) { Iterator n = *
this; item.i -= 2;
return n; }
97 Iterator &operator+=(qsizetype j) { item.i += 2 * j;
return *
this; }
98 Iterator &operator-=(qsizetype j) { item.i -= 2 * j;
return *
this; }
99 Iterator operator+(qsizetype j)
const {
return Iterator({ item.d, item.i + 2 * j }); }
100 Iterator operator-(qsizetype j)
const {
return Iterator({ item.d, item.i - 2 * j }); }
101 qsizetype operator-(Iterator j)
const {
return (item.i - j.item.i) / 2; }
105 static bool comparesEqual_helper(
const Iterator &lhs,
const Iterator &rhs)
noexcept
107 return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
110 static bool comparesEqual_helper(
const Iterator &lhs,
const ConstIterator &rhs)
noexcept
112 return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
115 static Qt::strong_ordering compareThreeWay_helper(
const Iterator &lhs,
118 Q_ASSERT(lhs.item.d == rhs.item.d);
119 return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
122 static Qt::strong_ordering compareThreeWay_helper(
const Iterator &lhs,
123 const ConstIterator &rhs)
125 Q_ASSERT(lhs.item.d == rhs.item.d);
126 return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
130 friend bool comparesEqual(
const Iterator &lhs,
const Iterator &rhs)
noexcept
132 return comparesEqual_helper(lhs, rhs);
134 friend Qt::strong_ordering compareThreeWay(
const Iterator &lhs,
137 return compareThreeWay_helper(lhs, rhs);
139 Q_DECLARE_STRONGLY_ORDERED_NON_NOEXCEPT(Iterator)
140 friend bool comparesEqual(
const Iterator &lhs,
const ConstIterator &rhs)
noexcept
142 return comparesEqual_helper(lhs, rhs);
144 friend Qt::strong_ordering compareThreeWay(
const Iterator &lhs,
145 const ConstIterator &rhs)
147 return compareThreeWay_helper(lhs, rhs);
149 Q_DECLARE_STRONGLY_ORDERED_NON_NOEXCEPT(Iterator, ConstIterator)
152 class ConstIterator {
153 QCborValueConstRef item;
154 friend class Iterator;
155 friend class QCborMap;
156 friend class QCborValue;
157 friend class QCborValueRef;
158 constexpr ConstIterator(QCborValueConstRef it) : item{it} {}
159 ConstIterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
161 typedef std::random_access_iterator_tag iterator_category;
162 typedef qsizetype difference_type;
163 typedef std::pair<QCborValueConstRef, QCborValueConstRef> value_type;
164 typedef std::pair<QCborValueConstRef, QCborValueConstRef> reference;
165 typedef std::pair<QCborValueConstRef, QCborValueConstRef> pointer;
167 constexpr ConstIterator() =
default;
168 constexpr ConstIterator(
const ConstIterator &) =
default;
169 ~ConstIterator() =
default;
170 ConstIterator &operator=(
const ConstIterator &other)
173 item.d = other.item.d;
174 item.i = other.item.i;
178 value_type operator*()
const {
return { QCborValueRef(item.d, item.i - 1), item }; }
179 value_type operator[](qsizetype j)
const {
return *(*
this + j); }
180 const QCborValueConstRef *operator->()
const {
return &item; }
181#if QT_VERSION >= QT_VERSION_CHECK(7
,0
,0
)
186 key()
const {
return QCborValueRef(item.d, item.i - 1); }
187 QCborValueConstRef keyRef()
const {
return QCborValueRef(item.d, item.i - 1); }
188 QCborValueConstRef value()
const {
return item; }
190#if QT_CORE_REMOVED_SINCE(6
, 8
)
191 bool operator==(
const Iterator &o)
const {
return item.d == o.item.d && item.i == o.item.i; }
192 bool operator!=(
const Iterator &o)
const {
return !operator==(o); }
193 bool operator<(
const Iterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i < other.item.i; }
194 bool operator<=(
const Iterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i <= other.item.i; }
195 bool operator>(
const Iterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i > other.item.i; }
196 bool operator>=(
const Iterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i >= other.item.i; }
197 bool operator==(
const ConstIterator &o)
const {
return item.d == o.item.d && item.i == o.item.i; }
198 bool operator!=(
const ConstIterator &o)
const {
return !operator==(o); }
199 bool operator<(
const ConstIterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i < other.item.i; }
200 bool operator<=(
const ConstIterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i <= other.item.i; }
201 bool operator>(
const ConstIterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i > other.item.i; }
202 bool operator>=(
const ConstIterator& other)
const { Q_ASSERT(item.d == other.item.d);
return item.i >= other.item.i; }
204 ConstIterator &operator++() { item.i += 2;
return *
this; }
205 ConstIterator operator++(
int) { ConstIterator n = *
this; item.i += 2;
return n; }
206 ConstIterator &operator--() { item.i -= 2;
return *
this; }
207 ConstIterator operator--(
int) { ConstIterator n = *
this; item.i -= 2;
return n; }
208 ConstIterator &operator+=(qsizetype j) { item.i += 2 * j;
return *
this; }
209 ConstIterator &operator-=(qsizetype j) { item.i -= 2 * j;
return *
this; }
210 ConstIterator operator+(qsizetype j)
const {
return ConstIterator{ item.d, item.i + 2 * j }; }
211 ConstIterator operator-(qsizetype j)
const {
return ConstIterator{ item.d, item.i - 2 * j }; }
212 qsizetype operator-(ConstIterator j)
const {
return (item.i - j.item.i) / 2; }
215 static bool comparesEqual_helper(
const ConstIterator &lhs,
216 const ConstIterator &rhs)
noexcept
218 return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
220 static Qt::strong_ordering compareThreeWay_helper(
const ConstIterator &lhs,
221 const ConstIterator &rhs)
223 Q_ASSERT(lhs.item.d == rhs.item.d);
224 return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
228 friend bool comparesEqual(
const ConstIterator &lhs,
const ConstIterator &rhs)
noexcept
230 return comparesEqual_helper(lhs, rhs);
232 friend Qt::strong_ordering compareThreeWay(
const ConstIterator &lhs,
233 const ConstIterator &rhs)
235 return compareThreeWay_helper(lhs, rhs);
237 Q_DECLARE_STRONGLY_ORDERED_NON_NOEXCEPT(ConstIterator)
241 QCborMap(
const QCborMap &other)
noexcept;
242 QCborMap(QCborMap &&other)
noexcept =
default;
243 QCborMap &operator=(
const QCborMap &other)
noexcept;
244 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QCborMap)
245 QCborMap(std::initializer_list<value_type> args)
249 for (
const auto &pair : args)
250 insert(pair.first, pair.second);
254 void swap(QCborMap &other)
noexcept
259 QCborValue toCborValue()
const {
return *
this; }
261 Q_DECL_PURE_FUNCTION qsizetype size()
const noexcept;
262 bool isEmpty()
const {
return size() == 0; }
264 QList<QCborValue> keys()
const;
266 QCborValue value(qint64 key)
const
267 { const_iterator it = find(key);
return comparesEqual(it, end()) ? QCborValue() : it.value(); }
268 QCborValue value(QLatin1StringView key)
const
269 { const_iterator it = find(key);
return comparesEqual(it, end()) ? QCborValue() : it.value(); }
270 QCborValue value(
const QString & key)
const
271 { const_iterator it = find(key);
return comparesEqual(it, end()) ? QCborValue() : it.value(); }
272 QCborValue value(
const QCborValue &key)
const
273 { const_iterator it = find(key);
return comparesEqual(it, end()) ? QCborValue() : it.value(); }
274#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
275 template<size_t N> QT_ASCII_CAST_WARN
const QCborValue value(
const char (&key)[N])
const
276 {
return value(QString::fromUtf8(key, N - 1)); }
278 const QCborValue operator[](qint64 key)
const
279 { const_iterator it = find(key);
return comparesEqual(it, end()) ? QCborValue() : it.value(); }
280 const QCborValue operator[](QLatin1StringView key)
const
281 { const_iterator it = find(key);
return comparesEqual(it, end()) ? QCborValue() : it.value(); }
282 const QCborValue operator[](
const QString & key)
const
283 { const_iterator it = find(key);
return comparesEqual(it, end()) ? QCborValue() : it.value(); }
284 const QCborValue operator[](
const QCborValue &key)
const
285 { const_iterator it = find(key);
return comparesEqual(it, end()) ? QCborValue() : it.value(); }
286#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
287 template<size_t N> QT_ASCII_CAST_WARN
const QCborValue operator[](
const char (&key)[N])
const
288 {
return operator[](QString::fromUtf8(key, N - 1)); }
290 QCborValueRef operator[](qint64 key);
291 QCborValueRef operator[](QLatin1StringView key);
292 QCborValueRef operator[](
const QString & key);
293 QCborValueRef operator[](
const QCborValue &key);
295 QCborValue take(qint64 key)
296 { const_iterator it = constFind(key);
if (!comparesEqual(it, constEnd()))
return extract(it);
return QCborValue(); }
297 QCborValue take(QLatin1StringView key)
298 { const_iterator it = constFind(key);
if (!comparesEqual(it, constEnd()))
return extract(it);
return QCborValue(); }
299 QCborValue take(
const QString &key)
300 { const_iterator it = constFind(key);
if (!comparesEqual(it, constEnd()))
return extract(it);
return QCborValue(); }
301 QCborValue take(
const QCborValue &key)
302 { const_iterator it = constFind(key);
if (!comparesEqual(it, constEnd()))
return extract(it);
return QCborValue(); }
303 void remove(qint64 key)
304 { const_iterator it = constFind(key);
if (!comparesEqual(it, constEnd())) erase(it); }
305 void remove(QLatin1StringView key)
306 { const_iterator it = constFind(key);
if (!comparesEqual(it, constEnd())) erase(it); }
307 void remove(
const QString & key)
308 { const_iterator it = constFind(key);
if (!comparesEqual(it, constEnd())) erase(it); }
309 void remove(
const QCborValue &key)
310 { const_iterator it = constFind(key);
if (!comparesEqual(it, constEnd())) erase(it); }
311 bool contains(qint64 key)
const
312 { const_iterator it = find(key);
return !comparesEqual(it, end()); }
313 bool contains(QLatin1StringView key)
const
314 { const_iterator it = find(key);
return !comparesEqual(it, end()); }
315 bool contains(
const QString & key)
const
316 { const_iterator it = find(key);
return !comparesEqual(it, end()); }
317 bool contains(
const QCborValue &key)
const
318 { const_iterator it = find(key);
return !comparesEqual(it, end()); }
320 Q_DECL_PURE_FUNCTION
int compare(
const QCborMap &other)
const noexcept;
321#if QT_CORE_REMOVED_SINCE(6
, 8
)
322 bool operator==(
const QCborMap &other)
const noexcept
323 {
return compare(other) == 0; }
324 bool operator!=(
const QCborMap &other)
const noexcept
325 {
return !operator==(other); }
326 bool operator<(
const QCborMap &other)
const
327 {
return compare(other) < 0; }
330 typedef Iterator iterator;
331 typedef ConstIterator const_iterator;
332 iterator begin() { detach();
return iterator{d.data(), 1}; }
333 const_iterator constBegin()
const {
return const_iterator{d.data(), 1}; }
334 const_iterator begin()
const {
return constBegin(); }
335 const_iterator cbegin()
const {
return constBegin(); }
336 iterator end() { detach();
return iterator{d.data(), 2 * size() + 1}; }
337 const_iterator constEnd()
const {
return const_iterator{d.data(), 2 * size() + 1}; }
338 const_iterator end()
const {
return constEnd(); }
339 const_iterator cend()
const {
return constEnd(); }
340 iterator erase(iterator it);
341 iterator erase(const_iterator it) {
return erase(iterator{ it.item.d, it.item.i }); }
342 QCborValue extract(iterator it);
343 QCborValue extract(const_iterator it) {
return extract(iterator{ it.item.d, it.item.i }); }
344 bool empty()
const {
return isEmpty(); }
346 typedef QKeyValueIterator<QCborValueConstRef, QCborValueConstRef, const_iterator,
347 QtPrivate::QCborMapKeyValues<QCborValueConstRef, ConstIterator>>
348 const_key_value_iterator;
349 typedef QKeyValueIterator<QCborValueConstRef, QCborValueRef, iterator,
350 QtPrivate::QCborMapKeyValues<QCborValueRef, Iterator>>
353 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
354 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
355 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
356 const_key_value_iterator constKeyValueBegin()
const
358 return const_key_value_iterator(begin());
360 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
361 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
363 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QCborMap &>(*
this); }
364 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QCborMap &>(*
this); }
365 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QCborMap>(std::move(*
this)); }
366 auto asKeyValueRange()
const &&
368 return QtPrivate::QKeyValueRange<QCborMap>(std::move(*
this));
371 iterator find(qint64 key);
372 iterator find(QLatin1StringView key);
373 iterator find(
const QString & key);
374 iterator find(
const QCborValue &key);
375 const_iterator constFind(qint64 key)
const;
376 const_iterator constFind(QLatin1StringView key)
const;
377 const_iterator constFind(
const QString & key)
const;
378 const_iterator constFind(
const QCborValue &key)
const;
379 const_iterator find(qint64 key)
const {
return constFind(key); }
380 const_iterator find(QLatin1StringView key)
const {
return constFind(key); }
381 const_iterator find(
const QString & key)
const {
return constFind(key); }
382 const_iterator find(
const QCborValue &key)
const {
return constFind(key); }
384 iterator insert(qint64 key,
const QCborValue &value_)
386 QCborValueRef v = operator[](key);
388 return { d.data(), v.i };
390 iterator insert(QLatin1StringView key,
const QCborValue &value_)
392 QCborValueRef v = operator[](key);
394 return { d.data(), v.i };
396 iterator insert(
const QString &key,
const QCborValue &value_)
398 QCborValueRef v = operator[](key);
400 return { d.data(), v.i };
402 iterator insert(
const QCborValue &key,
const QCborValue &value_)
404 QCborValueRef v = operator[](key);
406 return { d.data(), v.i };
408 iterator insert(value_type v) {
return insert(v.first, v.second); }
410 static QCborMap fromVariantMap(
const QVariantMap &map);
411 static QCborMap fromVariantHash(
const QVariantHash &hash);
412 static QCborMap fromJsonObject(
const QJsonObject &o);
413 static QCborMap fromJsonObject(QJsonObject &&o)
noexcept;
414 QVariantMap toVariantMap()
const;
415 QVariantHash toVariantHash()
const;
416 QJsonObject toJsonObject()
const;
419 friend class QCborContainerPrivate;
420 friend class QCborValue;
421 friend class QCborValueRef;
422 friend class QJsonPrivate::Variant;
423 void detach(qsizetype reserve = 0);
425 friend Q_CORE_EXPORT Q_DECL_PURE_FUNCTION
bool
426 comparesEqual(
const QCborMap &lhs,
const QCborMap &rhs)
noexcept;
427 friend Qt::strong_ordering compareThreeWay(
const QCborMap &lhs,
428 const QCborMap &rhs)
noexcept
430 int c = lhs.compare(rhs);
431 return Qt::compareThreeWay(c, 0);
433 Q_DECLARE_STRONGLY_ORDERED(QCborMap)
435 static Q_DECL_PURE_FUNCTION
bool
436 comparesEqual_helper(
const QCborMap &lhs,
const QCborValue &rhs)
noexcept;
437 static Q_DECL_PURE_FUNCTION Qt::strong_ordering
438 compareThreeWay_helper(
const QCborMap &lhs,
const QCborValue &rhs)
noexcept;
439 friend bool comparesEqual(
const QCborMap &lhs,
440 const QCborValue &rhs)
noexcept
442 return comparesEqual_helper(lhs, rhs);
444 friend Qt::strong_ordering compareThreeWay(
const QCborMap &lhs,
445 const QCborValue &rhs)
noexcept
447 return compareThreeWay_helper(lhs, rhs);
449 Q_DECLARE_STRONGLY_ORDERED(QCborMap, QCborValue)
451 static Q_DECL_PURE_FUNCTION
bool
452 comparesEqual_helper(
const QCborMap &lhs, QCborValueConstRef rhs)
noexcept;
453 static Q_DECL_PURE_FUNCTION Qt::strong_ordering
454 compareThreeWay_helper(
const QCborMap &lhs, QCborValueConstRef rhs)
noexcept;
455 friend bool comparesEqual(
const QCborMap &lhs,
456 const QCborValueConstRef &rhs)
noexcept
458 return comparesEqual_helper(lhs, rhs);
460 friend Qt::strong_ordering compareThreeWay(
const QCborMap &lhs,
461 const QCborValueConstRef &rhs)
noexcept
463 return compareThreeWay_helper(lhs, rhs);
465 Q_DECLARE_STRONGLY_ORDERED(QCborMap, QCborValueConstRef)
467 explicit QCborMap(QCborContainerPrivate &dd)
noexcept;
468 QExplicitlySharedDataPointer<QCborContainerPrivate> d;