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 #include "qcbormap.h"
41 #include "qcborvalue_p.h"
42 
43 QT_BEGIN_NAMESPACE
44 
45 using namespace QtCbor;
46 
47 /*!
48     \class QCborMap
49     \inmodule QtCore
50     \ingroup cbor
51     \reentrant
52     \since 5.12
53 
54     \brief The QCborMap class is used to hold an associative container representable in CBOR.
55 
56     This class can be used to hold an associative container in CBOR, a map
57     between a key and a value type. CBOR is the Concise Binary Object
58     Representation, a very compact form of binary data encoding that is a
59     superset of JSON. It was created by the IETF Constrained RESTful
60     Environments (CoRE) WG, which has used it in many new RFCs. It is meant to
61     be used alongside the \l{https://tools.ietf.org/html/rfc7252}{CoAP
62     protocol}.
63 
64     Unlike JSON and \l QVariantMap, CBOR map keys can be of any type, not just
65     strings. For that reason, QCborMap is effectively a map between QCborValue
66     keys to QCborValue value elements.
67 
68     However, for all member functions that take a key parameter, QCborMap
69     provides overloads that will work efficiently with integers and strings. In
70     fact, the use of integer keys is encouraged, since they occupy fewer bytes
71     to transmit and are simpler to encode and decode. Newer protocols designed
72     by the IETF CoRE WG to work specifically with CBOR are known to use them.
73 
74     QCborMap is not sorted, because of that, searching for keys has linear
75     complexity (O(n)). QCborMap actually keeps the elements in the order that
76     they were inserted, which means that it is possible to make sorted
77     QCborMaps by carefully inserting elements in sorted order. CBOR does not
78     require sorting, but recommends it.
79 
80     QCborMap can also be converted to and from QVariantMap and QJsonObject.
81     However, when performing the conversion, any non-string keys will be
82     stringified using a one-way method that the conversion back to QCborMap
83     will not undo.
84 
85     \sa QCborArray, QCborValue, QJsonDocument, QVariantMap
86  */
87 
88 /*!
89     \typedef QCborMap::value_type
90 
91     The value that is stored in this container: a pair of QCborValues
92  */
93 
94 /*!
95     \typedef QCborMap::key_type
96 
97     The key type for this map. Since QCborMap keys can be any CBOR type, this
98     is a QCborValue.
99  */
100 
101 /*!
102     \typedef QCborMap::mapped_type
103 
104     The type that is mapped to (the value), that is, a QCborValue.
105  */
106 
107 /*!
108     \typedef QCborMap::size_type
109 
110     The type that QCborMap uses for sizes.
111  */
112 
113 /*!
114     \typedef QCborMap::iterator
115 
116     A synonym for QCborMap::Iterator.
117  */
118 
119 /*!
120     \typedef QCborMap::const_iterator
121 
122     A synonym for QCborMap::ConstIterator
123  */
124 
125 /*!
126     \fn QCborMap::iterator QCborMap::begin()
127 
128     Returns a map iterator pointing to the first key-value pair of this map. If
129     this map is empty, the returned iterator will be the same as end().
130 
131     \sa constBegin(), end()
132  */
133 
134 /*!
135     \fn QCborMap::const_iterator QCborMap::constBegin() const
136 
137     Returns a map iterator pointing to the first key-value pair of this map. If
138     this map is empty, the returned iterator will be the same as constEnd().
139 
140     \sa begin(), constEnd()
141  */
142 
143 /*!
144     \fn QCborMap::const_iterator QCborMap::begin() const
145 
146     Returns a map iterator pointing to the first key-value pair of this map. If
147     this map is empty, the returned iterator will be the same as constEnd().
148 
149     \sa begin(), constEnd()
150  */
151 
152 /*!
153     \fn QCborMap::const_iterator QCborMap::cbegin() const
154 
155     Returns a map iterator pointing to the first key-value pair of this map. If
156     this map is empty, the returned iterator will be the same as constEnd().
157 
158     \sa begin(), constEnd()
159  */
160 
161 /*!
162     \fn QCborMap::iterator QCborMap::end()
163 
164     Returns a map iterator representing an element just past the last element
165     in the map.
166 
167     \sa begin(), constBegin(), find(), constFind()
168  */
169 
170 /*!
171     \fn QCborMap::iterator QCborMap::constEnd() const
172 
173     Returns a map iterator representing an element just past the last element
174     in the map.
175 
176     \sa begin(), constBegin(), find(), constFind()
177  */
178 
179 /*!
180     \fn QCborMap::iterator QCborMap::end() const
181 
182     Returns a map iterator representing an element just past the last element
183     in the map.
184 
185     \sa begin(), constBegin(), find(), constFind()
186  */
187 
188 /*!
189     \fn QCborMap::iterator QCborMap::cend() const
190 
191     Returns a map iterator representing an element just past the last element
192     in the map.
193 
194     \sa begin(), constBegin(), find(), constFind()
195  */
196 
197 /*!
198     Constructs an empty CBOR Map object.
199 
200     \sa isEmpty()
201  */
QCborMap()202 QCborMap::QCborMap() noexcept
203     : d(nullptr)
204 {
205 }
206 
207 /*!
208     Creates a QCborMap object that is a copy of \a other.
209  */
QCborMap(const QCborMap & other)210 QCborMap::QCborMap(const QCborMap &other) noexcept
211     : d(other.d)
212 {
213 }
214 
215 /*!
216     \fn QCborMap::QCborMap(std::initializer_list<value_type> args)
217 
218     Constructs a QCborMap with items from a brace-initialization list found in
219     \a args, as in the following example:
220 
221     \code
222         QCborMap map = {
223             {0, "Hello"},
224             {1, "World"},
225             {"foo", nullptr},
226             {"bar", QCborArray{0, 1, 2, 3, 4}}
227         };
228     \endcode
229  */
230 
231 /*!
232     Destroys this QCborMap object and frees any associated resources it owns.
233  */
~QCborMap()234 QCborMap::~QCborMap()
235 {
236 }
237 
238 /*!
239     Replaces the contents of this object with a copy of \a other, then returns
240     a reference to this object.
241  */
operator =(const QCborMap & other)242 QCborMap &QCborMap::operator=(const QCborMap &other) noexcept
243 {
244     d = other.d;
245     return *this;
246 }
247 
248 /*!
249     \fn void QCborMap::swap(QCborMap &other)
250 
251     Swaps the contents of this map and \a other.
252  */
253 
254 /*!
255     \fn QCborValue QCborMap::toCborValue() const
256 
257     Explicitly constructs a \l QCborValue object that represents this map.
258     This function is usually not necessary since QCborValue has a constructor
259     for QCborMap, so the conversion is implicit.
260 
261     Converting QCborMap to QCborValue allows it to be used in any context where
262     QCborValues can be used, including as keys and mapped types in QCborMap, as
263     well as QCborValue::toCbor().
264 
265     \sa QCborValue::QCborValue(const QCborMap &)
266  */
267 
268 /*!
269     \fn bool QCborMap::isEmpty() const
270 
271     Returns true if this map is empty (that is, size() is 0).
272 
273     \sa size(), clear()
274  */
275 
276 /*!
277     Returns the number of elements in this map.
278 
279     \sa isEmpty()
280  */
size() const281 qsizetype QCborMap::size() const noexcept
282 {
283     return d ? d->elements.size() / 2 : 0;
284 }
285 
286 /*!
287     Empties this map.
288 
289     \sa isEmpty()
290  */
clear()291 void QCborMap::clear()
292 {
293     d.reset();
294 }
295 
296 /*!
297     Returns a list of all keys in this map.
298 
299     \sa QMap::keys(), QHash::keys()
300  */
keys() const301 QVector<QCborValue> QCborMap::keys() const
302 {
303     QVector<QCborValue> result;
304     if (d) {
305         result.reserve(size());
306         for (qsizetype i = 0; i < d->elements.size(); i += 2)
307             result << d->valueAt(i);
308     }
309     return result;
310 }
311 
312 /*!
313     \fn QCborValue QCborMap::value(qint64 key) const
314 
315     Returns the QCborValue element in this map that corresponds to key \a key,
316     if there is one. CBOR recommends using integer keys, since they occupy less
317     space and are simpler to encode and decode.
318 
319     If the map does not contain key \a key, this function returns a QCborValue
320     containing an undefined value. For that reason, it is not possible with
321     this function to tell apart the situation where the key was not present
322     from the situation where the key was mapped to an undefined value.
323 
324     If the map contains more than one key equal to \a key, it is undefined
325     which one the return from function will reference. QCborMap does not allow
326     inserting duplicate keys, but it is possible to create such a map by
327     decoding a CBOR stream with them. They are usually not permitted and having
328     duplicate keys is usually an indication of a problem in the sender.
329 
330     \sa operator[](qint64), find(qint64), constFind(qint64), remove(qint64), contains(qint64)
331         value(QLatin1String), value(const QString &), value(const QCborValue &)
332  */
333 
334 /*!
335     \fn QCborValue QCborMap::operator[](qint64 key) const
336 
337     Returns the QCborValue element in this map that corresponds to key \a key,
338     if there is one. CBOR recommends using integer keys, since they occupy less
339     space and are simpler to encode and decode.
340 
341     If the map does not contain key \a key, this function returns a QCborValue
342     containing an undefined value. For that reason, it is not possible with
343     this function to tell apart the situation where the key was not present
344     from the situation where the key was mapped to an undefined value.
345 
346     If the map contains more than one key equal to \a key, it is undefined
347     which one this function will return. QCborMap does not allow inserting
348     duplicate keys, but it is possible to create such a map by decoding a CBOR
349     stream with them. They are usually not permitted and having duplicate keys
350     is usually an indication of a problem in the sender.
351 
352     \sa value(qint64), find(qint64), constFind(qint64), remove(qint64), contains(qint64)
353         operator[](QLatin1String), operator[](const QString &), operator[](const QCborOperator[] &)
354  */
355 
356 /*!
357     \fn QCborValue QCborMap::take(qint64 key)
358 
359     Removes the key \a key and the corresponding value from the map and returns
360     the value, if it is found. If the map contains no such key, this function does nothing.
361 
362     If the map contains more than one key equal to \a key, it is undefined
363     which one this function will remove. QCborMap does not allow inserting
364     duplicate keys, but it is possible to create such a map by decoding a CBOR
365     stream with them. They are usually not permitted and having duplicate keys
366     is usually an indication of a problem in the sender.
367 
368     \sa value(qint64), operator[](qint64), find(qint64), contains(qint64),
369       take(QLatin1String), take(const QString &), take(const QCborValue &), insert()
370  */
371 
372 /*!
373     \fn void QCborMap::remove(qint64 key)
374 
375     Removes the key \a key and the corresponding value from the map, if it is
376     found. If the map contains no such key, this function does nothing.
377 
378     If the map contains more than one key equal to \a key, it is undefined
379     which one this function will remove. QCborMap does not allow inserting
380     duplicate keys, but it is possible to create such a map by decoding a CBOR
381     stream with them. They are usually not permitted and having duplicate keys
382     is usually an indication of a problem in the sender.
383 
384     \sa value(qint64), operator[](qint64), find(qint64), contains(qint64)
385         remove(QLatin1String), remove(const QString &), remove(const QCborValue &)
386  */
387 
388 /*!
389     \fn bool QCborMap::contains(qint64 key) const
390 
391     Returns true if this map contains a key-value pair identified by key \a
392     key. CBOR recommends using integer keys, since they occupy less space and
393     are simpler to encode and decode.
394 
395     \sa value(qint64), operator[](qint64), find(qint64), remove(qint64),
396         contains(QLatin1String), remove(const QString &), remove(const QCborValue &)
397  */
398 
399 /*!
400     Returns a QCborValueRef to the value in this map that corresponds to key \a
401     key. CBOR recommends using integer keys, since they occupy less space and
402     are simpler to encode and decode.
403 
404     QCborValueRef has the exact same API as \l QCborValue, with one important
405     difference: if you assign new values to it, this map will be updated with
406     that new value.
407 
408     If the map did not have a key equal to \a key, one is inserted and this
409     function returns a reference to the new value, which will be a QCborValue
410     with an undefined value. For that reason, it is not possible with this
411     function to tell apart the situation where the key was not present from the
412     situation where the key was mapped to an undefined value.
413 
414     If the map contains more than one key equal to \a key, it is undefined
415     which one the return will reference. QCborMap does not allow inserting
416     duplicate keys, but it is possible to create such a map by decoding a CBOR
417     stream with them. They are usually not permitted and having duplicate keys
418     is usually an indication of a problem in the sender.
419 
420     \sa value(qint64), find(qint64), contains(qint64), remove(qint64),
421         operator[](QLatin1String), operator[](const QString &), operator[](const QCborValue &)
422  */
operator [](qint64 key)423 QCborValueRef QCborMap::operator[](qint64 key)
424 {
425     auto it = find(key);
426     if (it == constEnd()) {
427         // insert element
428         detach(it.item.i + 2);
429         d->append(key);
430         d->append(Undefined{});
431     }
432     return { d.data(), it.item.i };
433 }
434 
435 /*!
436     \fn QCborValue QCborMap::value(QLatin1String key) const
437     \overload
438 
439     Returns the QCborValue element in this map that corresponds to key \a key,
440     if there is one.
441 
442     If the map does not contain key \a key, this function returns a QCborValue
443     containing an undefined value. For that reason, it is not possible with
444     this function to tell apart the situation where the key was not present
445     from the situation where the key was mapped to an undefined value.
446 
447     If the map contains more than one key equal to \a key, it is undefined
448     which one this function will return. QCborMap does not allow inserting
449     duplicate keys, but it is possible to create such a map by decoding a CBOR
450     stream with them. They are usually not permitted and having duplicate keys
451     is usually an indication of a problem in the sender.
452 
453     \sa operator[](QLatin1String), find(QLatin1String), constFind(QLatin1String),
454         remove(QLatin1String), contains(QLatin1String)
455         value(qint64), value(const QString &), value(const QCborValue &)
456  */
457 
458 /*!
459     \fn QCborValue QCborMap::operator[](QLatin1String key) const
460     \overload
461 
462     Returns the QCborValue element in this map that corresponds to key \a key,
463     if there is one.
464 
465     If the map does not contain key \a key, this function returns a QCborValue
466     containing an undefined value. For that reason, it is not possible with
467     this function to tell apart the situation where the key was not present
468     from the situation where the key was mapped to an undefined value.
469 
470     If the map contains more than one key equal to \a key, it is undefined
471     which one this function will return. QCborMap does not allow inserting
472     duplicate keys, but it is possible to create such a map by decoding a CBOR
473     stream with them. They are usually not permitted and having duplicate keys
474     is usually an indication of a problem in the sender.
475 
476     \sa value(QLatin1String), find(QLatin1String), constFind(QLatin1String),
477         remove(QLatin1String), contains(QLatin1String)
478         operator[](qint64), operator[](const QString &), operator[](const QCborOperator[] &)
479  */
480 
481 /*!
482     \fn QCborValue QCborMap::take(QLatin1String key)
483 
484     Removes the key \a key and the corresponding value from the map and returns
485     the value, if it is found. If the map contains no such key, this function does nothing.
486 
487     If the map contains more than one key equal to \a key, it is undefined
488     which one this function will remove. QCborMap does not allow inserting
489     duplicate keys, but it is possible to create such a map by decoding a CBOR
490     stream with them. They are usually not permitted and having duplicate keys
491     is usually an indication of a problem in the sender.
492 
493     \sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String), contains(QLatin1String),
494       take(qint64), take(const QString &), take(const QCborValue &), insert()
495  */
496 
497 /*!
498     \fn void QCborMap::remove(QLatin1String key)
499     \overload
500 
501     Removes the key \a key and the corresponding value from the map, if it is
502     found. If the map contains no such key, this function does nothing.
503 
504     If the map contains more than one key equal to \a key, it is undefined
505     which one this function will remove. QCborMap does not allow inserting
506     duplicate keys, but it is possible to create such a map by decoding a CBOR
507     stream with them. They are usually not permitted and having duplicate keys
508     is usually an indication of a problem in the sender.
509 
510     \sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String), contains(QLatin1String)
511         remove(qint64), remove(const QString &), remove(const QCborValue &)
512  */
513 
514 /*!
515     \fn bool QCborMap::contains(QLatin1String key) const
516     \overload
517 
518     Returns true if this map contains a key-value pair identified by key \a
519     key.
520 
521     \sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String), remove(QLatin1String),
522         contains(qint64), remove(const QString &), remove(const QCborValue &)
523  */
524 
525 /*!
526     \overload
527 
528     Returns a QCborValueRef to the value in this map that corresponds to key \a
529     key.
530 
531     QCborValueRef has the exact same API as \l QCborValue, with one important
532     difference: if you assign new values to it, this map will be updated with
533     that new value.
534 
535     If the map did not have a key equal to \a key, one is inserted and this
536     function returns a reference to the new value, which will be a QCborValue
537     with an undefined value. For that reason, it is not possible with this
538     function to tell apart the situation where the key was not present from the
539     situation where the key was mapped to an undefined value.
540 
541     If the map contains more than one key equal to \a key, it is undefined
542     which one the return will reference. QCborMap does not allow inserting
543     duplicate keys, but it is possible to create such a map by decoding a CBOR
544     stream with them. They are usually not permitted and having duplicate keys
545     is usually an indication of a problem in the sender.
546 
547     \sa value(QLatin1String), find(QLatin1String), contains(QLatin1String), remove(QLatin1String),
548         operator[](qint64), operator[](const QString &), operator[](const QCborValue &)
549  */
operator [](QLatin1String key)550 QCborValueRef QCborMap::operator[](QLatin1String key)
551 {
552     auto it = find(key);
553     if (it == constEnd()) {
554         // insert element
555         detach(it.item.i + 2);
556         d->append(key);
557         d->append(Undefined{});
558     }
559     return { d.data(), it.item.i };
560 }
561 
562 /*!
563     \fn QCborValue QCborMap::value(const QString &key) const
564     \overload
565 
566     Returns the QCborValue element in this map that corresponds to key \a key,
567     if there is one.
568 
569     If the map does not contain key \a key, this function returns a QCborValue
570     containing an undefined value. For that reason, it is not possible with
571     this function to tell apart the situation where the key was not present
572     from the situation where the key was mapped to an undefined value.
573 
574     If the map contains more than one key equal to \a key, it is undefined
575     which one this function will return. QCborMap does not allow inserting
576     duplicate keys, but it is possible to create such a map by decoding a CBOR
577     stream with them. They are usually not permitted and having duplicate keys
578     is usually an indication of a problem in the sender.
579 
580     \sa operator[](const QString &), find(const QString &), constFind(const QString &),
581         remove(const QString &), contains(const QString &)
582         value(qint64), value(QLatin1String), value(const QCborValue &)
583  */
584 
585 /*!
586     \fn QCborValue QCborMap::operator[](const QString &key) const
587     \overload
588 
589     Returns the QCborValue element in this map that corresponds to key \a key,
590     if there is one.
591 
592     If the map does not contain key \a key, this function returns a QCborValue
593     containing an undefined value. For that reason, it is not possible with
594     this function to tell apart the situation where the key was not present
595     from the situation where the key was mapped to an undefined value.
596 
597     If the map contains more than one key equal to \a key, it is undefined
598     which one this function will return. QCborMap does not allow inserting
599     duplicate keys, but it is possible to create such a map by decoding a CBOR
600     stream with them. They are usually not permitted and having duplicate keys
601     is usually an indication of a problem in the sender.
602 
603     \sa value(const QString &), find(const QString &), constFind(const QString &),
604         remove(const QString &), contains(const QString &)
605         operator[](qint64), operator[](QLatin1String), operator[](const QCborOperator[] &)
606  */
607 
608 /*!
609     \fn QCborValue QCborMap::take(const QString &key)
610 
611     Removes the key \a key and the corresponding value from the map and returns
612     the value, if it is found. If the map contains no such key, this function does nothing.
613 
614     If the map contains more than one key equal to \a key, it is undefined
615     which one this function will remove. QCborMap does not allow inserting
616     duplicate keys, but it is possible to create such a map by decoding a CBOR
617     stream with them. They are usually not permitted and having duplicate keys
618     is usually an indication of a problem in the sender.
619 
620     \sa value(const QString &), operator[](const QString &), find(const QString &), contains(const QString &),
621       take(QLatin1String), take(qint64), take(const QCborValue &), insert()
622  */
623 
624 /*!
625     \fn void QCborMap::remove(const QString &key)
626     \overload
627 
628     Removes the key \a key and the corresponding value from the map, if it is
629     found. If the map contains no such key, this function does nothing.
630 
631     If the map contains more than one key equal to \a key, it is undefined
632     which one this function will remove. QCborMap does not allow inserting
633     duplicate keys, but it is possible to create such a map by decoding a CBOR
634     stream with them. They are usually not permitted and having duplicate keys
635     is usually an indication of a problem in the sender.
636 
637     \sa value(const QString &), operator[](const QString &), find(const QString &),
638         contains(const QString &)
639         remove(qint64), remove(QLatin1String), remove(const QCborValue &)
640  */
641 
642 /*!
643     \fn bool QCborMap::contains(const QString &key) const
644     \overload
645 
646     Returns true if this map contains a key-value pair identified by key \a
647     key.
648 
649     \sa value(const QString &), operator[](const QString &), find(const QString &),
650         remove(const QString &),
651         contains(qint64), remove(QLatin1String), remove(const QCborValue &)
652  */
653 
654 /*!
655     \overload
656 
657     Returns a QCborValueRef to the value in this map that corresponds to key \a
658     key.
659 
660     QCborValueRef has the exact same API as \l QCborValue, with one important
661     difference: if you assign new values to it, this map will be updated with
662     that new value.
663 
664     If the map did not have a key equal to \a key, one is inserted and this
665     function returns a reference to the new value, which will be a QCborValue
666     with an undefined value. For that reason, it is not possible with this
667     function to tell apart the situation where the key was not present from the
668     situation where the key was mapped to an undefined value.
669 
670     If the map contains more than one key equal to \a key, it is undefined
671     which one the return will reference. QCborMap does not allow inserting
672     duplicate keys, but it is possible to create such a map by decoding a CBOR
673     stream with them. They are usually not permitted and having duplicate keys
674     is usually an indication of a problem in the sender.
675 
676     \sa value(const QString &), find(const QString &), contains(const QString &), remove(const QString &),
677         operator[](qint64), operator[](QLatin1String), operator[](const QCborValue &)
678  */
operator [](const QString & key)679 QCborValueRef QCborMap::operator[](const QString & key)
680 {
681     auto it = find(key);
682     if (it == constEnd()) {
683         // insert element
684         detach(it.item.i + 2);
685         d->append(key);
686         d->append(Undefined{});
687     }
688     return { d.data(), it.item.i };
689 }
690 
691 /*!
692     \fn QCborValue QCborMap::value(const QCborValue &key) const
693 
694     Returns the QCborValue element in this map that corresponds to key \a key,
695     if there is one.
696 
697     If the map does not contain key \a key, this function returns a QCborValue
698     containing an undefined value. For that reason, it is not possible with
699     this function to tell apart the situation where the key was not present
700     from the situation where the key was mapped to an undefined value.
701 
702     If the map contains more than one key equal to \a key, it is undefined
703     which one this function will return. QCborMap does not allow inserting
704     duplicate keys, but it is possible to create such a map by decoding a CBOR
705     stream with them. They are usually not permitted and having duplicate keys
706     is usually an indication of a problem in the sender.
707 
708     \sa operator[](const QCborValue &), find(const QCborValue &), constFind(const QCborValue &),
709         remove(const QCborValue &), contains(const QCborValue &)
710         value(qint64), value(QLatin1String), value(const QString &)
711  */
712 
713 /*!
714     \fn QCborValue QCborMap::operator[](const QCborValue &key) const
715 
716     Returns the QCborValue element in this map that corresponds to key \a key,
717     if there is one.
718 
719     If the map does not contain key \a key, this function returns a QCborValue
720     containing an undefined value. For that reason, it is not possible with
721     this function to tell apart the situation where the key was not present
722     from the situation where the key was mapped to an undefined value.
723 
724     If the map contains more than one key equal to \a key, it is undefined
725     which one this function will return. QCborMap does not allow inserting
726     duplicate keys, but it is possible to create such a map by decoding a CBOR
727     stream with them. They are usually not permitted and having duplicate keys
728     is usually an indication of a problem in the sender.
729 
730     \sa value(const QCborValue &), find(const QCborValue &), constFind(const QCborValue &),
731         remove(const QCborValue &), contains(const QCborValue &)
732         operator[](qint64), operator[](QLatin1String), operator[](const QCborOperator[] &)
733  */
734 
735 /*!
736     \fn QCborValue QCborMap::take(const QCborValue &key)
737 
738     Removes the key \a key and the corresponding value from the map and returns
739     the value, if it is found. If the map contains no such key, this function does nothing.
740 
741     If the map contains more than one key equal to \a key, it is undefined
742     which one this function will remove. QCborMap does not allow inserting
743     duplicate keys, but it is possible to create such a map by decoding a CBOR
744     stream with them. They are usually not permitted and having duplicate keys
745     is usually an indication of a problem in the sender.
746 
747     \sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &), contains(const QCborValue &),
748       take(QLatin1String), take(const QString &), take(qint64), insert()
749  */
750 
751 /*!
752     \fn void QCborMap::remove(const QCborValue &key)
753 
754     Removes the key \a key and the corresponding value from the map, if it is
755     found. If the map contains no such key, this function does nothing.
756 
757     If the map contains more than one key equal to \a key, it is undefined
758     which one this function will remove. QCborMap does not allow inserting
759     duplicate keys, but it is possible to create such a map by decoding a CBOR
760     stream with them. They are usually not permitted and having duplicate keys
761     is usually an indication of a problem in the sender.
762 
763     \sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
764         contains(const QCborValue &)
765         remove(qint64), remove(QLatin1String), remove(const QString &)
766  */
767 
768 /*!
769     \fn bool QCborMap::contains(const QCborValue &key) const
770 
771     Returns true if this map contains a key-value pair identified by key \a
772     key.
773 
774     \sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
775         remove(const QCborValue &),
776         contains(qint64), remove(QLatin1String), remove(const QString &)
777  */
778 
779 /*!
780     \overload
781 
782     Returns a QCborValueRef to the value in this map that corresponds to key \a
783     key.
784 
785     QCborValueRef has the exact same API as \l QCborValue, with one important
786     difference: if you assign new values to it, this map will be updated with
787     that new value.
788 
789     If the map did not have a key equal to \a key, one is inserted and this
790     function returns a reference to the new value, which will be a QCborValue
791     with an undefined value. For that reason, it is not possible with this
792     function to tell apart the situation where the key was not present from the
793     situation where the key was mapped to an undefined value.
794 
795     If the map contains more than one key equal to \a key, it is undefined
796     which one the return will reference. QCborMap does not allow inserting
797     duplicate keys, but it is possible to create such a map by decoding a CBOR
798     stream with them. They are usually not permitted and having duplicate keys
799     is usually an indication of a problem in the sender.
800 
801     \sa value(const QCborValue &), find(const QCborValue &), contains(const QCborValue &), remove(const QCborValue &),
802         operator[](qint64), operator[](QLatin1String), operator[](const QString &)
803  */
operator [](const QCborValue & key)804 QCborValueRef QCborMap::operator[](const QCborValue &key)
805 {
806     auto it = find(key);
807     if (it == constEnd()) {
808         // insert element
809         detach(it.item.i + 2);
810         d->append(key);
811         d->append(Undefined{});
812     }
813     return { d.data(), it.item.i };
814 }
815 
816 /*!
817     \fn QCborMap::iterator QCborMap::find(qint64 key)
818     \fn QCborMap::const_iterator QCborMap::find(qint64 key) const
819 
820     Returns a map iterator to the key-value pair whose key is \a key, if the
821     map contains such a pair. If it doesn't, this function returns end().
822 
823     CBOR recommends using integer keys, since they occupy less
824     space and are simpler to encode and decode.
825 
826     If the map contains more than one key equal to \a key, it is undefined
827     which one this function will find. QCborMap does not allow inserting
828     duplicate keys, but it is possible to create such a map by decoding a CBOR
829     stream with them. They are usually not permitted and having duplicate keys
830     is usually an indication of a problem in the sender.
831 
832     \sa value(qint64), operator[](qint64), constFind(qint64), remove(qint64), contains(qint64)
833         value(QLatin1String), value(const QString &), value(const QCborValue &)
834  */
find(qint64 key)835 QCborMap::iterator QCborMap::find(qint64 key)
836 {
837     detach();
838     auto it = constFind(key);
839     return { d.data(), it.item.i };
840 }
841 
842 /*!
843     \fn QCborMap::iterator QCborMap::find(QLatin1String key)
844     \fn QCborMap::const_iterator QCborMap::find(QLatin1String key) const
845     \overload
846 
847     Returns a map iterator to the key-value pair whose key is \a key, if the
848     map contains such a pair. If it doesn't, this function returns end().
849 
850     If the map contains more than one key equal to \a key, it is undefined
851     which one this function will find. QCborMap does not allow inserting
852     duplicate keys, but it is possible to create such a map by decoding a CBOR
853     stream with them. They are usually not permitted and having duplicate keys
854     is usually an indication of a problem in the sender.
855 
856     \sa value(QLatin1String), operator[](QLatin1String), constFind(QLatin1String),
857         remove(QLatin1String), contains(QLatin1String)
858         value(qint64), value(const QString &), value(const QCborValue &)
859  */
find(QLatin1String key)860 QCborMap::iterator QCborMap::find(QLatin1String key)
861 {
862     detach();
863     auto it = constFind(key);
864     return { d.data(), it.item.i };
865 }
866 
867 /*!
868     \fn QCborMap::iterator QCborMap::find(const QString & key)
869     \fn QCborMap::const_iterator QCborMap::find(const QString & key) const
870     \overload
871 
872     Returns a map iterator to the key-value pair whose key is \a key, if the
873     map contains such a pair. If it doesn't, this function returns end().
874 
875     If the map contains more than one key equal to \a key, it is undefined
876     which one this function will find. QCborMap does not allow inserting
877     duplicate keys, but it is possible to create such a map by decoding a CBOR
878     stream with them. They are usually not permitted and having duplicate keys
879     is usually an indication of a problem in the sender.
880 
881     \sa value(const QString &), operator[](const QString &), constFind(const QString &),
882         remove(const QString &), contains(const QString &)
883         value(qint64), value(QLatin1String), value(const QCborValue &)
884  */
find(const QString & key)885 QCborMap::iterator QCborMap::find(const QString & key)
886 {
887     detach();
888     auto it = constFind(key);
889     return { d.data(), it.item.i };
890 }
891 
892 /*!
893     \fn QCborMap::iterator QCborMap::find(const QCborValue &key)
894     \fn QCborMap::const_iterator QCborMap::find(const QCborValue &key) const
895     \overload
896 
897     Returns a map iterator to the key-value pair whose key is \a key, if the
898     map contains such a pair. If it doesn't, this function returns end().
899 
900     If the map contains more than one key equal to \a key, it is undefined
901     which one this function will find. QCborMap does not allow inserting
902     duplicate keys, but it is possible to create such a map by decoding a CBOR
903     stream with them. They are usually not permitted and having duplicate keys
904     is usually an indication of a problem in the sender.
905 
906     \sa value(const QCborValue &), operator[](const QCborValue &), constFind(const QCborValue &),
907         remove(const QCborValue &), contains(const QCborValue &)
908         value(qint64), value(QLatin1String), value(const QString &)
909  */
find(const QCborValue & key)910 QCborMap::iterator QCborMap::find(const QCborValue &key)
911 {
912     detach();
913     auto it = constFind(key);
914     return { d.data(), it.item.i };
915 }
916 
917 /*!
918     Returns a map iterator to the key-value pair whose key is \a key, if the
919     map contains such a pair. If it doesn't, this function returns constEnd().
920 
921     CBOR recommends using integer keys, since they occupy less
922     space and are simpler to encode and decode.
923 
924     If the map contains more than one key equal to \a key, it is undefined
925     which one this function will find. QCborMap does not allow inserting
926     duplicate keys, but it is possible to create such a map by decoding a CBOR
927     stream with them. They are usually not permitted and having duplicate keys
928     is usually an indication of a problem in the sender.
929 
930     \sa value(qint64), operator[](qint64), find(qint64), remove(qint64), contains(qint64)
931         value(QLatin1String), value(const QString &), value(const QCborValue &)
932  */
constFind(qint64 key) const933 QCborMap::const_iterator QCborMap::constFind(qint64 key) const
934 {
935     for (qsizetype i = 0; i < 2 * size(); i += 2) {
936         const auto &e = d->elements.at(i);
937         if (e.type == QCborValue::Integer && e.value == key)
938             return { d.data(), i + 1 };
939     }
940     return constEnd();
941 }
942 
943 /*!
944     \overload
945 
946     Returns a map iterator to the key-value pair whose key is \a key, if the
947     map contains such a pair. If it doesn't, this function returns constEnd().
948 
949     If the map contains more than one key equal to \a key, it is undefined
950     which one this function will find. QCborMap does not allow inserting
951     duplicate keys, but it is possible to create such a map by decoding a CBOR
952     stream with them. They are usually not permitted and having duplicate keys
953     is usually an indication of a problem in the sender.
954 
955     \sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String),
956         remove(QLatin1String), contains(QLatin1String)
957         value(qint64), value(const QString &), value(const QCborValue &)
958  */
constFind(QLatin1String key) const959 QCborMap::const_iterator QCborMap::constFind(QLatin1String key) const
960 {
961     for (qsizetype i = 0; i < 2 * size(); i += 2) {
962         if (d->stringEqualsElement(i, key))
963             return { d.data(), i + 1 };
964     }
965     return constEnd();
966 }
967 
968 /*!
969     \overload
970 
971     Returns a map iterator to the key-value pair whose key is \a key, if the
972     map contains such a pair. If it doesn't, this function returns constEnd().
973 
974     If the map contains more than one key equal to \a key, it is undefined
975     which one this function will find. QCborMap does not allow inserting
976     duplicate keys, but it is possible to create such a map by decoding a CBOR
977     stream with them. They are usually not permitted and having duplicate keys
978     is usually an indication of a problem in the sender.
979 
980     \sa value(const QString &), operator[](const QString &), find(const QString &),
981         remove(const QString &), contains(const QString &)
982         value(qint64), value(QLatin1String), value(const QCborValue &)
983  */
constFind(const QString & key) const984 QCborMap::const_iterator QCborMap::constFind(const QString & key) const
985 {
986     for (qsizetype i = 0; i < 2 * size(); i += 2) {
987         if (d->stringEqualsElement(i, key))
988             return { d.data(), i + 1 };
989     }
990     return constEnd();
991 }
992 
993 /*!
994     \overload
995 
996     Returns a map iterator to the key-value pair whose key is \a key, if the
997     map contains such a pair. If it doesn't, this function returns constEnd().
998 
999     If the map contains more than one key equal to \a key, it is undefined
1000     which one this function will find. QCborMap does not allow inserting
1001     duplicate keys, but it is possible to create such a map by decoding a CBOR
1002     stream with them. They are usually not permitted and having duplicate keys
1003     is usually an indication of a problem in the sender.
1004 
1005     \sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
1006         remove(const QCborValue &), contains(const QCborValue &),
1007         value(qint64), value(QLatin1String), value(const QString &)
1008  */
constFind(const QCborValue & key) const1009 QCborMap::const_iterator QCborMap::constFind(const QCborValue &key) const
1010 {
1011     for (qsizetype i = 0; i < 2 * size(); i += 2) {
1012         int cmp = d->compareElement(i, key);
1013         if (cmp == 0)
1014             return { d.data(), i + 1 };
1015     }
1016     return constEnd();
1017 }
1018 
1019 /*!
1020     \fn QCborMap::iterator QCborMap::insert(qint64 key, const QCborValue &value)
1021     \overload
1022 
1023     Inserts the key \a key and value \a value into this map and returns a map
1024     iterator pointing to the newly inserted pair.
1025 
1026     If the map already had a key equal to \a key, its value will be overwritten
1027     by \a value.
1028 
1029     \sa erase(), remove(qint64), value(qint64), operator[](qint64), find(qint64),
1030         contains(qint64), take(qint64), extract()
1031  */
1032 
1033 /*!
1034     \fn QCborMap::iterator QCborMap::insert(QLatin1String key, const QCborValue &value)
1035     \overload
1036 
1037     Inserts the key \a key and value \a value into this map and returns a map
1038     iterator pointing to the newly inserted pair.
1039 
1040     If the map already had a key equal to \a key, its value will be overwritten
1041     by \a value.
1042 
1043     \sa erase(), remove(QLatin1String), value(QLatin1String), operator[](QLatin1String),
1044         find(QLatin1String), contains(QLatin1String), take(QLatin1String), extract()
1045  */
1046 
1047 /*!
1048     \fn QCborMap::iterator QCborMap::insert(const QString &key, const QCborValue &value)
1049     \overload
1050 
1051     Inserts the key \a key and value \a value into this map and returns a map
1052     iterator pointing to the newly inserted pair.
1053 
1054     If the map already had a key equal to \a key, its value will be overwritten
1055     by \a value.
1056 
1057     \sa erase(), remove(const QString &), value(const QString &), operator[](const QString &),
1058         find(const QString &), contains(const QString &), take(const QString &), extract()
1059  */
1060 
1061 /*!
1062     \fn QCborMap::iterator QCborMap::insert(const QCborValue &key, const QCborValue &value)
1063     \overload
1064 
1065     Inserts the key \a key and value \a value into this map and returns a map
1066     iterator pointing to the newly inserted pair.
1067 
1068     If the map already had a key equal to \a key, its value will be overwritten
1069     by \a value.
1070 
1071     \sa erase(), remove(const QCborValue &), value(const QCborValue &), operator[](const QCborValue &),
1072         find(const QCborValue &), contains(const QCborValue &), take(const QCborValue &), extract()
1073  */
1074 
1075 /*!
1076     \fn QCborMap::iterator QCborMap::insert(value_type v)
1077     \overload
1078 
1079     Inserts the key-value pair in \a v into this map and returns a map iterator
1080     pointing to the newly inserted pair.
1081 
1082     If the map already had a key equal to \c{v.first}, its value will be
1083     overwritten by \c{v.second}.
1084 
1085     \sa operator[], erase(), extract()
1086  */
1087 
1088 
1089 /*!
1090     \fn QCborMap::iterator QCborMap::erase(const_iterator it)
1091 
1092     Removes the key-value pair pointed to by the map iterator \a it and returns a
1093     pointer to the next element, after removal.
1094 
1095     \sa remove(), begin(), end(), insert(), extract()
1096  */
1097 
1098 /*!
1099     \overload
1100 
1101     Removes the key-value pair pointed to by the map iterator \a it and returns a
1102     pointer to the next element, after removal.
1103 
1104     \sa remove(), begin(), end(), insert()
1105  */
erase(QCborMap::iterator it)1106 QCborMap::iterator QCborMap::erase(QCborMap::iterator it)
1107 {
1108     detach();
1109 
1110     // remove both key and value
1111     // ### optimize?
1112     d->removeAt(it.item.i - 1);
1113     d->removeAt(it.item.i - 1);
1114     return it;
1115 }
1116 
1117 /*!
1118     \fn QCborValue QCborMap::extract(iterator it)
1119     \fn QCborValue QCborMap::extract(const_iterator it)
1120 
1121     Extracts a value from the map at the position indicated by iterator \a it
1122     and returns the value so extracted.
1123 
1124     \sa insert(), erase(), take(), remove()
1125  */
extract(iterator it)1126 QCborValue QCborMap::extract(iterator it)
1127 {
1128     detach();
1129     QCborValue v = d->extractAt(it.item.i);
1130     // remove both key and value
1131     // ### optimize?
1132     d->removeAt(it.item.i - 1);
1133     d->removeAt(it.item.i - 1);
1134 
1135     return v;
1136 }
1137 
1138 /*!
1139     \fn bool QCborMap::empty() const
1140 
1141     Synonym for isEmpty(). This function is provided for compatibility with
1142     generic code that uses the Standard Library API.
1143 
1144     Returns true if this map is empty (size() == 0).
1145 
1146     \sa isEmpty(), size()
1147  */
1148 
1149 /*!
1150     \fn int QCborMap::compare(const QCborMap &other) const
1151 
1152     Compares this map and \a other, comparing each element in sequence, and
1153     returns an integer that indicates whether this map should be sorted prior
1154     to (if the result is negative) or after \a other (if the result is
1155     positive). If this function returns 0, the two maps are equal and contain
1156     the same elements.
1157 
1158     Note that CBOR maps are unordered, which means that two maps containing the
1159     very same pairs but in different order will still compare differently. To
1160     avoid this, it is recommended to insert elements into the map in a
1161     predictable order, such as by ascending key value. In fact, maps with keys
1162     in sorted order are required for Canonical CBOR representation.
1163 
1164     For more information on CBOR sorting order, see QCborValue::compare().
1165 
1166     \sa QCborValue::compare(), QCborArray::compare(), operator==()
1167  */
1168 
1169 /*!
1170     \fn bool QCborMap::operator==(const QCborMap &other) const
1171 
1172     Compares this map and \a other, comparing each element in sequence, and
1173     returns true if the two maps contains the same elements in the same order,
1174     false otherwise.
1175 
1176     Note that CBOR maps are unordered, which means that two maps containing the
1177     very same pairs but in different order will still compare differently. To
1178     avoid this, it is recommended to insert elements into the map in a
1179     predictable order, such as by ascending key value. In fact, maps with keys
1180     in sorted order are required for Canonical CBOR representation.
1181 
1182     For more information on CBOR equality in Qt, see, QCborValue::compare().
1183 
1184     \sa compare(), QCborValue::operator==(), QCborMap::operator==(),
1185         operator!=(), operator<()
1186  */
1187 
1188 /*!
1189     \fn bool QCborMap::operator!=(const QCborMap &other) const
1190 
1191     Compares this map and \a other, comparing each element in sequence, and
1192     returns true if the two maps contains any different elements or elements in
1193     different orders, false otherwise.
1194 
1195     Note that CBOR maps are unordered, which means that two maps containing the
1196     very same pairs but in different order will still compare differently. To
1197     avoid this, it is recommended to insert elements into the map in a
1198     predictable order, such as by ascending key value. In fact, maps with keys
1199     in sorted order are required for Canonical CBOR representation.
1200 
1201     For more information on CBOR equality in Qt, see, QCborValue::compare().
1202 
1203     \sa compare(), QCborValue::operator==(), QCborMap::operator==(),
1204         operator==(), operator<()
1205  */
1206 
1207 /*!
1208     \fn bool QCborMap::operator<(const QCborMap &other) const
1209 
1210     Compares this map and \a other, comparing each element in sequence, and
1211     returns true if this map should be sorted before \a other, false
1212     otherwise.
1213 
1214     Note that CBOR maps are unordered, which means that two maps containing the
1215     very same pairs but in different order will still compare differently. To
1216     avoid this, it is recommended to insert elements into the map in a
1217     predictable order, such as by ascending key value. In fact, maps with keys
1218     in sorted order are required for Canonical CBOR representation.
1219 
1220     For more information on CBOR sorting order, see QCborValue::compare().
1221 
1222     \sa compare(), QCborValue::operator==(), QCborMap::operator==(),
1223         operator==(), operator!=()
1224  */
1225 
detach(qsizetype reserved)1226 void QCborMap::detach(qsizetype reserved)
1227 {
1228     d = QCborContainerPrivate::detach(d.data(), reserved ? reserved : size() * 2);
1229 }
1230 
1231 /*!
1232     \class QCborMap::Iterator
1233     \inmodule QtCore
1234     \ingroup cbor
1235     \reentrant
1236     \since 5.12
1237 
1238     \brief The QCborMap::Iterator class provides an STL-style non-const iterator for QCborMap.
1239 
1240     QCborMap::Iterator allows you to iterate over a QCborMap and to modify the
1241     value (but not the key) stored under a particular key. If you want to
1242     iterate over a const QCborMap, you should use QCborMap::ConstIterator. It
1243     is generally good practice to use QCborMap::ConstIterator on a non-const
1244     QCborMap as well, unless you need to change the QCborMap through the
1245     iterator. Const iterators are slightly faster, and improve code
1246     readability.
1247 
1248     You must initialize the iterator using a QCborMap function like
1249     QCborMap::begin(), QCborMap::end(), or QCborMap::find() before you can
1250     start iterating..
1251 
1252     Multiple iterators can be used on the same object. Existing iterators will however
1253     become dangling once the object gets modified.
1254 
1255     \sa QCborMap::ConstIterator
1256 */
1257 
1258 /*!
1259     \typedef QCborMap::Iterator::difference_type
1260     \internal
1261 */
1262 
1263 /*!
1264     \typedef QCborMap::Iterator::iterator_category
1265 
1266     A synonym for \e {std::random_access_iterator_tag} indicating
1267     this iterator is a random-access iterator.
1268 */
1269 
1270 /*!
1271     \typedef QCborMap::Iterator::reference
1272     \internal
1273 */
1274 
1275 /*!
1276     \typedef QCborMap::Iterator::value_type
1277     \internal
1278 */
1279 
1280 /*!
1281     \typedef QCborMap::Iterator::pointer
1282     \internal
1283 */
1284 
1285 /*!
1286     \fn QCborMap::Iterator::Iterator()
1287 
1288     Constructs an uninitialized iterator.
1289 
1290     Functions like key(), value(), and operator++() must not be
1291     called on an uninitialized iterator. Use operator=() to assign a
1292     value to it before using it.
1293 
1294     \sa QCborMap::begin(), QCborMap::end()
1295 */
1296 
1297 /*!
1298     \fn QCborMap::Iterator::Iterator(const Iterator &other)
1299 
1300     Constructs an iterator as a copy of \a other.
1301  */
1302 
1303 /*!
1304     \fn QCborMap::Iterator &QCborMap::Iterator::operator=(const Iterator &other)
1305 
1306     Makes this iterator a copy of \a other and returns a reference to this
1307     iterator.
1308  */
1309 
1310 /*!
1311     \fn QCborValue QCborMap::Iterator::key() const
1312 
1313     Returns the current item's key.
1314 
1315     There is no direct way of changing an item's key through an iterator,
1316     although it can be done by calling QCborMap::erase() followed by
1317     QCborMap::insert().
1318 
1319     \sa value()
1320 */
1321 
1322 /*!
1323     \fn QCborValueRef QCborMap::Iterator::value() const
1324 
1325     Returns a modifiable reference to the current item's value.
1326 
1327     You can change the value for a key by using value() on the left side of an
1328     assignment.
1329 
1330     The return value is of type QCborValueRef, a helper class for QCborArray
1331     and QCborMap. When you get an object of type QCborValueRef, you can use it
1332     as if it were a reference to a QCborValue. If you assign to it, the
1333     assignment will apply to the element in the QCborArray or QCborMap from
1334     which you got the reference.
1335 
1336     \sa key(), operator*()
1337 */
1338 
1339 /*!
1340     \fn QCborMap::Iterator::value_type QCborMap::Iterator::operator*() const
1341 
1342     Returns a pair containing the current item's key and a modifiable reference
1343     to the current item's value.
1344 
1345     The second element of the pair is of type QCborValueRef, a helper class for
1346     QCborArray and QCborMap. When you get an object of type QCborValueRef, you
1347     can use it as if it were a reference to a QCborValue. If you assign to it,
1348     the assignment will apply to the element in the QCborArray or QCborMap from
1349     which you got the reference.
1350 
1351     \sa key(), value()
1352 */
1353 
1354 /*!
1355     \fn QCborValueRef *QCborMap::Iterator::operator->() const
1356 
1357     Returns a pointer to a modifiable reference to the current pair's value.
1358 */
1359 
1360 /*!
1361     \fn bool QCborMap::Iterator::operator==(const Iterator &other) const
1362     \fn bool QCborMap::Iterator::operator==(const ConstIterator &other) const
1363 
1364     Returns \c true if \a other points to the same entry in the map as this
1365     iterator; otherwise returns \c false.
1366 
1367     \sa operator!=()
1368 */
1369 
1370 /*!
1371     \fn bool QCborMap::Iterator::operator!=(const Iterator &other) const
1372     \fn bool QCborMap::Iterator::operator!=(const ConstIterator &other) const
1373 
1374     Returns \c true if \a other points to a different entry in the map than
1375     this iterator; otherwise returns \c false.
1376 
1377     \sa operator==()
1378 */
1379 
1380 /*!
1381     \fn bool QCborMap::Iterator::operator<(const Iterator& other) const
1382     \fn bool QCborMap::Iterator::operator<(const ConstIterator& other) const
1383 
1384     Returns \c true if the entry in the map pointed to by this iterator
1385     occurs before the entry pointed to by the \a other iterator.
1386 */
1387 
1388 /*!
1389     \fn bool QCborMap::Iterator::operator<=(const Iterator& other) const
1390     \fn bool QCborMap::Iterator::operator<=(const ConstIterator& other) const
1391 
1392     Returns \c true if the entry in the map pointed to by this iterator
1393     occurs before or is the same entry as is pointed to by the \a other
1394     iterator.
1395 */
1396 
1397 /*!
1398     \fn bool QCborMap::Iterator::operator>(const Iterator& other) const
1399     \fn bool QCborMap::Iterator::operator>(const ConstIterator& other) const
1400 
1401     Returns \c true if the entry in the map pointed to by this iterator
1402     occurs after the entry pointed to by the \a other iterator.
1403  */
1404 
1405 /*!
1406     \fn bool QCborMap::Iterator::operator>=(const Iterator& other) const
1407     \fn bool QCborMap::Iterator::operator>=(const ConstIterator& other) const
1408 
1409     Returns \c true if the entry in the map pointed to by this iterator
1410     occurs after or is the same entry as is pointed to by the \a other
1411     iterator.
1412 */
1413 
1414 /*!
1415     \fn QCborMap::Iterator &QCborMap::Iterator::operator++()
1416 
1417     The prefix ++ operator, \c{++i}, advances the iterator to the next item in
1418     the map and returns this iterator.
1419 
1420     Calling this function on QCborMap::end() leads to undefined results.
1421 
1422     \sa operator--()
1423 */
1424 
1425 /*!
1426     \fn QCborMap::Iterator QCborMap::Iterator::operator++(int)
1427     \overload
1428 
1429     The postfix ++ operator, \c{i++}, advances the iterator to the next item in
1430     the map and returns an iterator to the previously current item.
1431 */
1432 
1433 /*!
1434     \fn QCborMap::Iterator QCborMap::Iterator::operator--()
1435 
1436     The prefix -- operator, \c{--i}, makes the preceding item current and
1437     returns this iterator.
1438 
1439     Calling this function on QCborMap::begin() leads to undefined results.
1440 
1441     \sa operator++()
1442 */
1443 
1444 /*!
1445     \fn QCborMap::Iterator QCborMap::Iterator::operator--(int)
1446     \overload
1447 
1448     The postfix -- operator, \c{i--}, makes the preceding item current and
1449     returns an iterator pointing to the previously current item.
1450 */
1451 
1452 /*!
1453     \fn QCborMap::Iterator QCborMap::Iterator::operator+(qsizetype j) const
1454 
1455     Returns an iterator to the item at \a j positions forward from this
1456     iterator. If \a j is negative, the iterator goes backward.
1457 
1458     \sa operator-()
1459 */
1460 
1461 /*!
1462     \fn QCborMap::Iterator QCborMap::Iterator::operator-(qsizetype j) const
1463 
1464     Returns an iterator to the item at \a j positions backward from this
1465     iterator. If \a j is negative, the iterator goes forward.
1466 
1467     \sa operator+()
1468 */
1469 
1470 /*!
1471     \fn qsizetype QCborMap::Iterator::operator-(QCborMap::Iterator j) const
1472 
1473     Returns the position of the item at iterator \a j relative to the item
1474     at this iterator. If the item at \a j is forward of this time, the returned
1475     value is negative.
1476 
1477     \sa operator+()
1478 */
1479 
1480 /*!
1481     \fn QCborMap::Iterator &QCborMap::Iterator::operator+=(qsizetype j)
1482 
1483     Advances the iterator by \a j items. If \a j is negative, the iterator goes
1484     backward. Returns a reference to this iterator.
1485 
1486     \sa operator-=(), operator+()
1487 */
1488 
1489 /*!
1490     \fn QCborMap::Iterator &QCborMap::Iterator::operator-=(qsizetype j)
1491 
1492     Makes the iterator go back by \a j items. If \a j is negative, the iterator
1493     goes forward. Returns a reference to this iterator.
1494 
1495     \sa operator+=(), operator-()
1496 */
1497 
1498 /*!
1499     \class QCborMap::ConstIterator
1500     \inmodule QtCore
1501     \ingroup cbor
1502     \since 5.12
1503 
1504     \brief The QCborMap::ConstIterator class provides an STL-style const iterator for QCborMap.
1505 
1506     QCborMap::ConstIterator allows you to iterate over a QCborMap. If you want
1507     to modify the QCborMap as you iterate over it, you must use
1508     QCborMap::Iterator instead. It is generally good practice to use
1509     QCborMap::ConstIterator, even on a non-const QCborMap, when you don't need
1510     to change the QCborMap through the iterator. Const iterators are slightly
1511     faster and improve code readability.
1512 
1513     You must initialize the iterator using a QCborMap function like
1514     QCborMap::begin(), QCborMap::end(), or QCborMap::find() before you can
1515     start iterating..
1516 
1517     Multiple iterators can be used on the same object. Existing iterators
1518     will however become dangling if the object gets modified.
1519 
1520     \sa QCborMap::Iterator
1521 */
1522 
1523 /*!
1524     \typedef QCborMap::ConstIterator::difference_type
1525     \internal
1526 */
1527 
1528 /*!
1529     \typedef QCborMap::ConstIterator::iterator_category
1530 
1531     A synonym for \e {std::random_access_iterator_tag} indicating
1532     this iterator is a random-access iterator.
1533 */
1534 
1535 /*!
1536     \typedef QCborMap::ConstIterator::reference
1537     \internal
1538 */
1539 
1540 /*!
1541     \typedef QCborMap::ConstIterator::value_type
1542     \internal
1543 */
1544 
1545 /*!
1546     \typedef QCborMap::ConstIterator::pointer
1547     \internal
1548 */
1549 
1550 /*!
1551     \fn QCborMap::ConstIterator::ConstIterator()
1552 
1553     Constructs an uninitialized iterator.
1554 
1555     Functions like key(), value(), and operator++() must not be
1556     called on an uninitialized iterator. Use operator=() to assign a
1557     value to it before using it.
1558 
1559     \sa QCborMap::constBegin(), QCborMap::constEnd()
1560 */
1561 
1562 /*!
1563     \fn QCborMap::ConstIterator::ConstIterator(const ConstIterator &other)
1564 
1565     Constructs an iterator as a copy of \a other.
1566  */
1567 
1568 /*!
1569     \fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator=(const ConstIterator &other)
1570 
1571     Makes this iterator a copy of \a other and returns a reference to this
1572     iterator.
1573  */
1574 
1575 /*!
1576     \fn QString QCborMap::ConstIterator::key() const
1577 
1578     Returns the current item's key.
1579 
1580     \sa value()
1581 */
1582 
1583 /*!
1584     \fn QCborValue QCborMap::ConstIterator::value() const
1585 
1586     Returns the current item's value.
1587 
1588     \sa key(), operator*()
1589 */
1590 
1591 /*!
1592     \fn QCborMap::ConstIterator::value_type QCborMap::ConstIterator::operator*() const
1593 
1594     Returns a pair containing the curent item's key and value.
1595 
1596     \sa key(), value()
1597  */
1598 
1599 /*!
1600     \fn const QCborValueRef *QCborMap::ConstIterator::operator->() const
1601 
1602     Returns a pointer to the current pair's value.
1603  */
1604 
1605 /*!
1606     \fn bool QCborMap::ConstIterator::operator==(const ConstIterator &other) const
1607     \fn bool QCborMap::ConstIterator::operator==(const Iterator &other) const
1608 
1609     Returns \c true if \a other points to the same entry in the map as this
1610     iterator; otherwise returns \c false.
1611 
1612     \sa operator!=()
1613 */
1614 
1615 /*!
1616     \fn bool QCborMap::ConstIterator::operator!=(const ConstIterator &other) const
1617     \fn bool QCborMap::ConstIterator::operator!=(const Iterator &other) const
1618 
1619     Returns \c true if \a other points to a different entry in the map than
1620     this iterator; otherwise returns \c false.
1621 
1622     \sa operator==()
1623  */
1624 
1625 /*!
1626     \fn bool QCborMap::ConstIterator::operator<(const Iterator &other) const
1627     \fn bool QCborMap::ConstIterator::operator<(const ConstIterator &other) const
1628 
1629     Returns \c true if the entry in the map pointed to by this iterator
1630     occurs before the entry pointed to by the \a other iterator.
1631 */
1632 
1633 /*!
1634     \fn bool QCborMap::ConstIterator::operator<=(const Iterator &other) const
1635     \fn bool QCborMap::ConstIterator::operator<=(const ConstIterator &other) const
1636 
1637     Returns \c true if the entry in the map pointed to by this iterator
1638     occurs before or is the same entry as is pointed to by the \a other
1639     iterator.
1640 */
1641 
1642 /*!
1643     \fn bool QCborMap::ConstIterator::operator>(const Iterator &other) const
1644     \fn bool QCborMap::ConstIterator::operator>(const ConstIterator &other) const
1645 
1646     Returns \c true if the entry in the map pointed to by this iterator
1647     occurs after the entry pointed to by the \a other iterator.
1648 */
1649 
1650 /*!
1651     \fn bool QCborMap::ConstIterator::operator>=(const Iterator &other) const
1652     \fn bool QCborMap::ConstIterator::operator>=(const ConstIterator &other) const
1653 
1654     Returns \c true if the entry in the map pointed to by this iterator
1655     occurs after or is the same entry as is pointed to by the \a other
1656     iterator.
1657 */
1658 
1659 /*!
1660     \fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator++()
1661 
1662     The prefix ++ operator, \c{++i}, advances the iterator to the next item in
1663     the map and returns this iterator.
1664 
1665     Calling this function on QCborMap::end() leads to undefined results.
1666 
1667     \sa operator--()
1668 */
1669 
1670 /*!
1671     \fn QCborMap::ConstIterator QCborMap::ConstIterator::operator++(int)
1672     \overload
1673 
1674     The postfix ++ operator, \c{i++}, advances the iterator to the next item in
1675     the map and returns an iterator to the previously current item.
1676  */
1677 
1678 /*!
1679     \fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator--()
1680 
1681     The prefix -- operator, \c{--i}, makes the preceding item current and
1682     returns this iterator.
1683 
1684     Calling this function on QCborMap::begin() leads to undefined results.
1685 
1686     \sa operator++()
1687 */
1688 
1689 /*!
1690     \fn QCborMap::ConstIterator QCborMap::ConstIterator::operator--(int)
1691     \overload
1692 
1693     The postfix -- operator, \c{i--}, makes the preceding item current and
1694     returns an iterator pointing to the previously current item.
1695  */
1696 
1697 /*!
1698     \fn QCborMap::ConstIterator QCborMap::ConstIterator::operator+(qsizetype j) const
1699 
1700     Returns an iterator to the item at \a j positions forward from this
1701     iterator. If \a j is negative, the iterator goes backward.
1702 
1703     \sa operator-()
1704 */
1705 
1706 /*!
1707     \fn QCborMap::ConstIterator QCborMap::ConstIterator::operator-(qsizetype j) const
1708 
1709     Returns an iterator to the item at \a j positions backward from this
1710     iterator. If \a j is negative, the iterator goes forward.
1711 
1712     \sa operator+()
1713 */
1714 
1715 /*!
1716     \fn qsizetype QCborMap::ConstIterator::operator-(QCborMap::ConstIterator j) const
1717 
1718     Returns the position of the item at iterator \a j relative to the item
1719     at this iterator. If the item at \a j is forward of this time, the returned
1720     value is negative.
1721 
1722     \sa operator+()
1723 */
1724 
1725 /*!
1726     \fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator+=(qsizetype j)
1727 
1728     Advances the iterator by \a j items. If \a j is negative, the iterator goes
1729     backward. Returns a reference to this iterator.
1730 
1731     \sa operator-=(), operator+()
1732 */
1733 
1734 /*!
1735     \fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator-=(qsizetype j)
1736 
1737     Makes the iterator go back by \a j items. If \a j is negative, the iterator
1738     goes forward. Returns a reference to this iterator.
1739 
1740     \sa operator+=(), operator-()
1741 */
1742 
qHash(const QCborMap & map,uint seed)1743 uint qHash(const QCborMap &map, uint seed)
1744 {
1745     return qHashRange(map.begin(), map.end(), seed);
1746 }
1747 
1748 #if !defined(QT_NO_DEBUG_STREAM)
operator <<(QDebug dbg,const QCborMap & m)1749 QDebug operator<<(QDebug dbg, const QCborMap &m)
1750 {
1751     QDebugStateSaver saver(dbg);
1752     dbg.nospace() << "QCborMap{";
1753     const char *open = "{";
1754     for (auto pair : m) {
1755         dbg << open << pair.first <<  ", " << pair.second << '}';
1756         open = ", {";
1757     }
1758     return dbg << '}';
1759 }
1760 #endif
1761 
1762 #ifndef QT_NO_DATASTREAM
operator <<(QDataStream & stream,const QCborMap & value)1763 QDataStream &operator<<(QDataStream &stream, const QCborMap &value)
1764 {
1765     stream << value.toCborValue().toCbor();
1766     return stream;
1767 }
1768 
operator >>(QDataStream & stream,QCborMap & value)1769 QDataStream &operator>>(QDataStream &stream, QCborMap &value)
1770 {
1771     QByteArray buffer;
1772     stream >> buffer;
1773     QCborParserError parseError{};
1774     value = QCborValue::fromCbor(buffer, &parseError).toMap();
1775     if (parseError.error)
1776         stream.setStatus(QDataStream::ReadCorruptData);
1777     return stream;
1778 }
1779 #endif
1780 
1781 QT_END_NAMESPACE
1782