blob: 4b28ca4a2ee6a5b9aa79f8afa33d1e564c1b9a4a [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2018 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qcbormap.h"
#include "qcborvalue_p.h"
QT_BEGIN_NAMESPACE
using namespace QtCbor;
/*!
\class QCborMap
\inmodule QtCore
\ingroup cbor
\reentrant
\since 5.12
\brief The QCborMap class is used to hold an associative container representable in CBOR.
This class can be used to hold an associative container in CBOR, a map
between a key and a value type. CBOR is the Concise Binary Object
Representation, a very compact form of binary data encoding that is a
superset of JSON. It was created by the IETF Constrained RESTful
Environments (CoRE) WG, which has used it in many new RFCs. It is meant to
be used alongside the \l{https://tools.ietf.org/html/rfc7252}{CoAP
protocol}.
Unlike JSON and \l QVariantMap, CBOR map keys can be of any type, not just
strings. For that reason, QCborMap is effectively a map between QCborValue
keys to QCborValue value elements.
However, for all member functions that take a key parameter, QCborMap
provides overloads that will work efficiently with integers and strings. In
fact, the use of integer keys is encouraged, since they occupy fewer bytes
to transmit and are simpler to encode and decode. Newer protocols designed
by the IETF CoRE WG to work specifically with CBOR are known to use them.
QCborMap is not sorted, because of that, searching for keys has linear
complexity (O(n)). QCborMap actually keeps the elements in the order that
they were inserted, which means that it is possible to make sorted
QCborMaps by carefully inserting elements in sorted order. CBOR does not
require sorting, but recommends it.
QCborMap can also be converted to and from QVariantMap and QJsonObject.
However, when performing the conversion, any non-string keys will be
stringified using a one-way method that the conversion back to QCborMap
will not undo.
\sa QCborArray, QCborValue, QJsonDocument, QVariantMap
*/
/*!
\typedef QCborMap::value_type
The value that is stored in this container: a pair of QCborValues
*/
/*!
\typedef QCborMap::key_type
The key type for this map. Since QCborMap keys can be any CBOR type, this
is a QCborValue.
*/
/*!
\typedef QCborMap::mapped_type
The type that is mapped to (the value), that is, a QCborValue.
*/
/*!
\typedef QCborMap::size_type
The type that QCborMap uses for sizes.
*/
/*!
\typedef QCborMap::iterator
A synonym for QCborMap::Iterator.
*/
/*!
\typedef QCborMap::const_iterator
A synonym for QCborMap::ConstIterator
*/
/*!
\fn QCborMap::iterator QCborMap::begin()
Returns a map iterator pointing to the first key-value pair of this map. If
this map is empty, the returned iterator will be the same as end().
\sa constBegin(), end()
*/
/*!
\fn QCborMap::const_iterator QCborMap::constBegin() const
Returns a map iterator pointing to the first key-value pair of this map. If
this map is empty, the returned iterator will be the same as constEnd().
\sa begin(), constEnd()
*/
/*!
\fn QCborMap::const_iterator QCborMap::begin() const
Returns a map iterator pointing to the first key-value pair of this map. If
this map is empty, the returned iterator will be the same as constEnd().
\sa begin(), constEnd()
*/
/*!
\fn QCborMap::const_iterator QCborMap::cbegin() const
Returns a map iterator pointing to the first key-value pair of this map. If
this map is empty, the returned iterator will be the same as constEnd().
\sa begin(), constEnd()
*/
/*!
\fn QCborMap::iterator QCborMap::end()
Returns a map iterator representing an element just past the last element
in the map.
\sa begin(), constBegin(), find(), constFind()
*/
/*!
\fn QCborMap::iterator QCborMap::constEnd() const
Returns a map iterator representing an element just past the last element
in the map.
\sa begin(), constBegin(), find(), constFind()
*/
/*!
\fn QCborMap::iterator QCborMap::end() const
Returns a map iterator representing an element just past the last element
in the map.
\sa begin(), constBegin(), find(), constFind()
*/
/*!
\fn QCborMap::iterator QCborMap::cend() const
Returns a map iterator representing an element just past the last element
in the map.
\sa begin(), constBegin(), find(), constFind()
*/
/*!
Constructs an empty CBOR Map object.
\sa isEmpty()
*/
QCborMap::QCborMap() noexcept
: d(nullptr)
{
}
/*!
Creates a QCborMap object that is a copy of \a other.
*/
QCborMap::QCborMap(const QCborMap &other) noexcept
: d(other.d)
{
}
/*!
\fn QCborMap::QCborMap(std::initializer_list<value_type> args)
Constructs a QCborMap with items from a brace-initialization list found in
\a args, as in the following example:
\code
QCborMap map = {
{0, "Hello"},
{1, "World"},
{"foo", nullptr},
{"bar", QCborArray{0, 1, 2, 3, 4}}
};
\endcode
*/
/*!
Destroys this QCborMap object and frees any associated resources it owns.
*/
QCborMap::~QCborMap()
{
}
/*!
Replaces the contents of this object with a copy of \a other, then returns
a reference to this object.
*/
QCborMap &QCborMap::operator=(const QCborMap &other) noexcept
{
d = other.d;
return *this;
}
/*!
\fn void QCborMap::swap(QCborMap &other)
Swaps the contents of this map and \a other.
*/
/*!
\fn QCborValue QCborMap::toCborValue() const
Explicitly constructs a \l QCborValue object that represents this map.
This function is usually not necessary since QCborValue has a constructor
for QCborMap, so the conversion is implicit.
Converting QCborMap to QCborValue allows it to be used in any context where
QCborValues can be used, including as keys and mapped types in QCborMap, as
well as QCborValue::toCbor().
\sa QCborValue::QCborValue(const QCborMap &)
*/
/*!
\fn bool QCborMap::isEmpty() const
Returns true if this map is empty (that is, size() is 0).
\sa size(), clear()
*/
/*!
Returns the number of elements in this map.
\sa isEmpty()
*/
qsizetype QCborMap::size() const noexcept
{
return d ? d->elements.size() / 2 : 0;
}
/*!
Empties this map.
\sa isEmpty()
*/
void QCborMap::clear()
{
d.reset();
}
/*!
Returns a list of all keys in this map.
\sa QMap::keys(), QHash::keys()
*/
QVector<QCborValue> QCborMap::keys() const
{
QVector<QCborValue> result;
if (d) {
result.reserve(size());
for (qsizetype i = 0; i < d->elements.size(); i += 2)
result << d->valueAt(i);
}
return result;
}
/*!
\fn QCborValue QCborMap::value(qint64 key) const
Returns the QCborValue element in this map that corresponds to key \a key,
if there is one. CBOR recommends using integer keys, since they occupy less
space and are simpler to encode and decode.
If the map does not contain key \a key, this function returns a QCborValue
containing an undefined value. For that reason, it is not possible with
this function to tell apart the situation where the key was not present
from the situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one the return from function will reference. QCborMap does not allow
inserting duplicate keys, but it is possible to create such a map by
decoding a CBOR stream with them. They are usually not permitted and having
duplicate keys is usually an indication of a problem in the sender.
\sa operator[](qint64), find(qint64), constFind(qint64), remove(qint64), contains(qint64)
value(QLatin1String), value(const QString &), value(const QCborValue &)
*/
/*!
\fn QCborValue QCborMap::operator[](qint64 key) const
Returns the QCborValue element in this map that corresponds to key \a key,
if there is one. CBOR recommends using integer keys, since they occupy less
space and are simpler to encode and decode.
If the map does not contain key \a key, this function returns a QCborValue
containing an undefined value. For that reason, it is not possible with
this function to tell apart the situation where the key was not present
from the situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one this function will return. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(qint64), find(qint64), constFind(qint64), remove(qint64), contains(qint64)
operator[](QLatin1String), operator[](const QString &), operator[](const QCborOperator[] &)
*/
/*!
\fn QCborValue QCborMap::take(qint64 key)
Removes the key \a key and the corresponding value from the map and returns
the value, if it is found. If the map contains no such key, this function does nothing.
If the map contains more than one key equal to \a key, it is undefined
which one this function will remove. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(qint64), operator[](qint64), find(qint64), contains(qint64),
take(QLatin1String), take(const QString &), take(const QCborValue &), insert()
*/
/*!
\fn void QCborMap::remove(qint64 key)
Removes the key \a key and the corresponding value from the map, if it is
found. If the map contains no such key, this function does nothing.
If the map contains more than one key equal to \a key, it is undefined
which one this function will remove. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(qint64), operator[](qint64), find(qint64), contains(qint64)
remove(QLatin1String), remove(const QString &), remove(const QCborValue &)
*/
/*!
\fn bool QCborMap::contains(qint64 key) const
Returns true if this map contains a key-value pair identified by key \a
key. CBOR recommends using integer keys, since they occupy less space and
are simpler to encode and decode.
\sa value(qint64), operator[](qint64), find(qint64), remove(qint64),
contains(QLatin1String), remove(const QString &), remove(const QCborValue &)
*/
/*!
Returns a QCborValueRef to the value in this map that corresponds to key \a
key. CBOR recommends using integer keys, since they occupy less space and
are simpler to encode and decode.
QCborValueRef has the exact same API as \l QCborValue, with one important
difference: if you assign new values to it, this map will be updated with
that new value.
If the map did not have a key equal to \a key, one is inserted and this
function returns a reference to the new value, which will be a QCborValue
with an undefined value. For that reason, it is not possible with this
function to tell apart the situation where the key was not present from the
situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one the return will reference. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(qint64), find(qint64), contains(qint64), remove(qint64),
operator[](QLatin1String), operator[](const QString &), operator[](const QCborValue &)
*/
QCborValueRef QCborMap::operator[](qint64 key)
{
auto it = find(key);
if (it == constEnd()) {
// insert element
detach(it.item.i + 2);
d->append(key);
d->append(Undefined{});
}
return { d.data(), it.item.i };
}
/*!
\fn QCborValue QCborMap::value(QLatin1String key) const
\overload
Returns the QCborValue element in this map that corresponds to key \a key,
if there is one.
If the map does not contain key \a key, this function returns a QCborValue
containing an undefined value. For that reason, it is not possible with
this function to tell apart the situation where the key was not present
from the situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one this function will return. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa operator[](QLatin1String), find(QLatin1String), constFind(QLatin1String),
remove(QLatin1String), contains(QLatin1String)
value(qint64), value(const QString &), value(const QCborValue &)
*/
/*!
\fn QCborValue QCborMap::operator[](QLatin1String key) const
\overload
Returns the QCborValue element in this map that corresponds to key \a key,
if there is one.
If the map does not contain key \a key, this function returns a QCborValue
containing an undefined value. For that reason, it is not possible with
this function to tell apart the situation where the key was not present
from the situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one this function will return. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(QLatin1String), find(QLatin1String), constFind(QLatin1String),
remove(QLatin1String), contains(QLatin1String)
operator[](qint64), operator[](const QString &), operator[](const QCborOperator[] &)
*/
/*!
\fn QCborValue QCborMap::take(QLatin1String key)
Removes the key \a key and the corresponding value from the map and returns
the value, if it is found. If the map contains no such key, this function does nothing.
If the map contains more than one key equal to \a key, it is undefined
which one this function will remove. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String), contains(QLatin1String),
take(qint64), take(const QString &), take(const QCborValue &), insert()
*/
/*!
\fn void QCborMap::remove(QLatin1String key)
\overload
Removes the key \a key and the corresponding value from the map, if it is
found. If the map contains no such key, this function does nothing.
If the map contains more than one key equal to \a key, it is undefined
which one this function will remove. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String), contains(QLatin1String)
remove(qint64), remove(const QString &), remove(const QCborValue &)
*/
/*!
\fn bool QCborMap::contains(QLatin1String key) const
\overload
Returns true if this map contains a key-value pair identified by key \a
key.
\sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String), remove(QLatin1String),
contains(qint64), remove(const QString &), remove(const QCborValue &)
*/
/*!
\overload
Returns a QCborValueRef to the value in this map that corresponds to key \a
key.
QCborValueRef has the exact same API as \l QCborValue, with one important
difference: if you assign new values to it, this map will be updated with
that new value.
If the map did not have a key equal to \a key, one is inserted and this
function returns a reference to the new value, which will be a QCborValue
with an undefined value. For that reason, it is not possible with this
function to tell apart the situation where the key was not present from the
situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one the return will reference. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(QLatin1String), find(QLatin1String), contains(QLatin1String), remove(QLatin1String),
operator[](qint64), operator[](const QString &), operator[](const QCborValue &)
*/
QCborValueRef QCborMap::operator[](QLatin1String key)
{
auto it = find(key);
if (it == constEnd()) {
// insert element
detach(it.item.i + 2);
d->append(key);
d->append(Undefined{});
}
return { d.data(), it.item.i };
}
/*!
\fn QCborValue QCborMap::value(const QString &key) const
\overload
Returns the QCborValue element in this map that corresponds to key \a key,
if there is one.
If the map does not contain key \a key, this function returns a QCborValue
containing an undefined value. For that reason, it is not possible with
this function to tell apart the situation where the key was not present
from the situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one this function will return. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa operator[](const QString &), find(const QString &), constFind(const QString &),
remove(const QString &), contains(const QString &)
value(qint64), value(QLatin1String), value(const QCborValue &)
*/
/*!
\fn QCborValue QCborMap::operator[](const QString &key) const
\overload
Returns the QCborValue element in this map that corresponds to key \a key,
if there is one.
If the map does not contain key \a key, this function returns a QCborValue
containing an undefined value. For that reason, it is not possible with
this function to tell apart the situation where the key was not present
from the situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one this function will return. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QString &), find(const QString &), constFind(const QString &),
remove(const QString &), contains(const QString &)
operator[](qint64), operator[](QLatin1String), operator[](const QCborOperator[] &)
*/
/*!
\fn QCborValue QCborMap::take(const QString &key)
Removes the key \a key and the corresponding value from the map and returns
the value, if it is found. If the map contains no such key, this function does nothing.
If the map contains more than one key equal to \a key, it is undefined
which one this function will remove. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QString &), operator[](const QString &), find(const QString &), contains(const QString &),
take(QLatin1String), take(qint64), take(const QCborValue &), insert()
*/
/*!
\fn void QCborMap::remove(const QString &key)
\overload
Removes the key \a key and the corresponding value from the map, if it is
found. If the map contains no such key, this function does nothing.
If the map contains more than one key equal to \a key, it is undefined
which one this function will remove. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QString &), operator[](const QString &), find(const QString &),
contains(const QString &)
remove(qint64), remove(QLatin1String), remove(const QCborValue &)
*/
/*!
\fn bool QCborMap::contains(const QString &key) const
\overload
Returns true if this map contains a key-value pair identified by key \a
key.
\sa value(const QString &), operator[](const QString &), find(const QString &),
remove(const QString &),
contains(qint64), remove(QLatin1String), remove(const QCborValue &)
*/
/*!
\overload
Returns a QCborValueRef to the value in this map that corresponds to key \a
key.
QCborValueRef has the exact same API as \l QCborValue, with one important
difference: if you assign new values to it, this map will be updated with
that new value.
If the map did not have a key equal to \a key, one is inserted and this
function returns a reference to the new value, which will be a QCborValue
with an undefined value. For that reason, it is not possible with this
function to tell apart the situation where the key was not present from the
situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one the return will reference. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QString &), find(const QString &), contains(const QString &), remove(const QString &),
operator[](qint64), operator[](QLatin1String), operator[](const QCborValue &)
*/
QCborValueRef QCborMap::operator[](const QString & key)
{
auto it = find(key);
if (it == constEnd()) {
// insert element
detach(it.item.i + 2);
d->append(key);
d->append(Undefined{});
}
return { d.data(), it.item.i };
}
/*!
\fn QCborValue QCborMap::value(const QCborValue &key) const
Returns the QCborValue element in this map that corresponds to key \a key,
if there is one.
If the map does not contain key \a key, this function returns a QCborValue
containing an undefined value. For that reason, it is not possible with
this function to tell apart the situation where the key was not present
from the situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one this function will return. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa operator[](const QCborValue &), find(const QCborValue &), constFind(const QCborValue &),
remove(const QCborValue &), contains(const QCborValue &)
value(qint64), value(QLatin1String), value(const QString &)
*/
/*!
\fn QCborValue QCborMap::operator[](const QCborValue &key) const
Returns the QCborValue element in this map that corresponds to key \a key,
if there is one.
If the map does not contain key \a key, this function returns a QCborValue
containing an undefined value. For that reason, it is not possible with
this function to tell apart the situation where the key was not present
from the situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one this function will return. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QCborValue &), find(const QCborValue &), constFind(const QCborValue &),
remove(const QCborValue &), contains(const QCborValue &)
operator[](qint64), operator[](QLatin1String), operator[](const QCborOperator[] &)
*/
/*!
\fn QCborValue QCborMap::take(const QCborValue &key)
Removes the key \a key and the corresponding value from the map and returns
the value, if it is found. If the map contains no such key, this function does nothing.
If the map contains more than one key equal to \a key, it is undefined
which one this function will remove. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &), contains(const QCborValue &),
take(QLatin1String), take(const QString &), take(qint64), insert()
*/
/*!
\fn void QCborMap::remove(const QCborValue &key)
Removes the key \a key and the corresponding value from the map, if it is
found. If the map contains no such key, this function does nothing.
If the map contains more than one key equal to \a key, it is undefined
which one this function will remove. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
contains(const QCborValue &)
remove(qint64), remove(QLatin1String), remove(const QString &)
*/
/*!
\fn bool QCborMap::contains(const QCborValue &key) const
Returns true if this map contains a key-value pair identified by key \a
key.
\sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
remove(const QCborValue &),
contains(qint64), remove(QLatin1String), remove(const QString &)
*/
/*!
\overload
Returns a QCborValueRef to the value in this map that corresponds to key \a
key.
QCborValueRef has the exact same API as \l QCborValue, with one important
difference: if you assign new values to it, this map will be updated with
that new value.
If the map did not have a key equal to \a key, one is inserted and this
function returns a reference to the new value, which will be a QCborValue
with an undefined value. For that reason, it is not possible with this
function to tell apart the situation where the key was not present from the
situation where the key was mapped to an undefined value.
If the map contains more than one key equal to \a key, it is undefined
which one the return will reference. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QCborValue &), find(const QCborValue &), contains(const QCborValue &), remove(const QCborValue &),
operator[](qint64), operator[](QLatin1String), operator[](const QString &)
*/
QCborValueRef QCborMap::operator[](const QCborValue &key)
{
auto it = find(key);
if (it == constEnd()) {
// insert element
detach(it.item.i + 2);
d->append(key);
d->append(Undefined{});
}
return { d.data(), it.item.i };
}
/*!
\fn QCborMap::iterator QCborMap::find(qint64 key)
\fn QCborMap::const_iterator QCborMap::find(qint64 key) const
Returns a map iterator to the key-value pair whose key is \a key, if the
map contains such a pair. If it doesn't, this function returns end().
CBOR recommends using integer keys, since they occupy less
space and are simpler to encode and decode.
If the map contains more than one key equal to \a key, it is undefined
which one this function will find. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(qint64), operator[](qint64), constFind(qint64), remove(qint64), contains(qint64)
value(QLatin1String), value(const QString &), value(const QCborValue &)
*/
QCborMap::iterator QCborMap::find(qint64 key)
{
auto it = constFind(key);
if (it != constEnd())
detach();
return { d.data(), it.item.i };
}
/*!
\fn QCborMap::iterator QCborMap::find(QLatin1String key)
\fn QCborMap::const_iterator QCborMap::find(QLatin1String key) const
\overload
Returns a map iterator to the key-value pair whose key is \a key, if the
map contains such a pair. If it doesn't, this function returns end().
If the map contains more than one key equal to \a key, it is undefined
which one this function will find. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(QLatin1String), operator[](QLatin1String), constFind(QLatin1String),
remove(QLatin1String), contains(QLatin1String)
value(qint64), value(const QString &), value(const QCborValue &)
*/
QCborMap::iterator QCborMap::find(QLatin1String key)
{
auto it = constFind(key);
if (it != constEnd())
detach();
return { d.data(), it.item.i };
}
/*!
\fn QCborMap::iterator QCborMap::find(const QString & key)
\fn QCborMap::const_iterator QCborMap::find(const QString & key) const
\overload
Returns a map iterator to the key-value pair whose key is \a key, if the
map contains such a pair. If it doesn't, this function returns end().
If the map contains more than one key equal to \a key, it is undefined
which one this function will find. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QString &), operator[](const QString &), constFind(const QString &),
remove(const QString &), contains(const QString &)
value(qint64), value(QLatin1String), value(const QCborValue &)
*/
QCborMap::iterator QCborMap::find(const QString & key)
{
auto it = constFind(key);
if (it != constEnd())
detach();
return { d.data(), it.item.i };
}
/*!
\fn QCborMap::iterator QCborMap::find(const QCborValue &key)
\fn QCborMap::const_iterator QCborMap::find(const QCborValue &key) const
\overload
Returns a map iterator to the key-value pair whose key is \a key, if the
map contains such a pair. If it doesn't, this function returns end().
If the map contains more than one key equal to \a key, it is undefined
which one this function will find. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QCborValue &), operator[](const QCborValue &), constFind(const QCborValue &),
remove(const QCborValue &), contains(const QCborValue &)
value(qint64), value(QLatin1String), value(const QString &)
*/
QCborMap::iterator QCborMap::find(const QCborValue &key)
{
auto it = constFind(key);
if (it != constEnd())
detach();
return { d.data(), it.item.i };
}
/*!
Returns a map iterator to the key-value pair whose key is \a key, if the
map contains such a pair. If it doesn't, this function returns constEnd().
CBOR recommends using integer keys, since they occupy less
space and are simpler to encode and decode.
If the map contains more than one key equal to \a key, it is undefined
which one this function will find. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(qint64), operator[](qint64), find(qint64), remove(qint64), contains(qint64)
value(QLatin1String), value(const QString &), value(const QCborValue &)
*/
QCborMap::const_iterator QCborMap::constFind(qint64 key) const
{
for (qsizetype i = 0; i < 2 * size(); i += 2) {
const auto &e = d->elements.at(i);
if (e.type == QCborValue::Integer && e.value == key)
return { d.data(), i + 1 };
}
return constEnd();
}
/*!
\overload
Returns a map iterator to the key-value pair whose key is \a key, if the
map contains such a pair. If it doesn't, this function returns constEnd().
If the map contains more than one key equal to \a key, it is undefined
which one this function will find. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(QLatin1String), operator[](QLatin1String), find(QLatin1String),
remove(QLatin1String), contains(QLatin1String)
value(qint64), value(const QString &), value(const QCborValue &)
*/
QCborMap::const_iterator QCborMap::constFind(QLatin1String key) const
{
for (qsizetype i = 0; i < 2 * size(); i += 2) {
if (d->stringEqualsElement(i, key))
return { d.data(), i + 1 };
}
return constEnd();
}
/*!
\overload
Returns a map iterator to the key-value pair whose key is \a key, if the
map contains such a pair. If it doesn't, this function returns constEnd().
If the map contains more than one key equal to \a key, it is undefined
which one this function will find. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QString &), operator[](const QString &), find(const QString &),
remove(const QString &), contains(const QString &)
value(qint64), value(QLatin1String), value(const QCborValue &)
*/
QCborMap::const_iterator QCborMap::constFind(const QString & key) const
{
for (qsizetype i = 0; i < 2 * size(); i += 2) {
if (d->stringEqualsElement(i, key))
return { d.data(), i + 1 };
}
return constEnd();
}
/*!
\overload
Returns a map iterator to the key-value pair whose key is \a key, if the
map contains such a pair. If it doesn't, this function returns constEnd().
If the map contains more than one key equal to \a key, it is undefined
which one this function will find. QCborMap does not allow inserting
duplicate keys, but it is possible to create such a map by decoding a CBOR
stream with them. They are usually not permitted and having duplicate keys
is usually an indication of a problem in the sender.
\sa value(const QCborValue &), operator[](const QCborValue &), find(const QCborValue &),
remove(const QCborValue &), contains(const QCborValue &),
value(qint64), value(QLatin1String), value(const QString &)
*/
QCborMap::const_iterator QCborMap::constFind(const QCborValue &key) const
{
for (qsizetype i = 0; i < 2 * size(); i += 2) {
int cmp = d->compareElement(i, key);
if (cmp == 0)
return { d.data(), i + 1 };
}
return constEnd();
}
/*!
\fn QCborMap::iterator QCborMap::insert(qint64 key, const QCborValue &value)
\overload
Inserts the key \a key and value \a value into this map and returns a map
iterator pointing to the newly inserted pair.
If the map already had a key equal to \a key, its value will be overwritten
by \a value.
\sa erase(), remove(qint64), value(qint64), operator[](qint64), find(qint64),
contains(qint64), take(qint64), extract()
*/
/*!
\fn QCborMap::iterator QCborMap::insert(QLatin1String key, const QCborValue &value)
\overload
Inserts the key \a key and value \a value into this map and returns a map
iterator pointing to the newly inserted pair.
If the map already had a key equal to \a key, its value will be overwritten
by \a value.
\sa erase(), remove(QLatin1String), value(QLatin1String), operator[](QLatin1String),
find(QLatin1String), contains(QLatin1String), take(QLatin1String), extract()
*/
/*!
\fn QCborMap::iterator QCborMap::insert(const QString &key, const QCborValue &value)
\overload
Inserts the key \a key and value \a value into this map and returns a map
iterator pointing to the newly inserted pair.
If the map already had a key equal to \a key, its value will be overwritten
by \a value.
\sa erase(), remove(const QString &), value(const QString &), operator[](const QString &),
find(const QString &), contains(const QString &), take(const QString &), extract()
*/
/*!
\fn QCborMap::iterator QCborMap::insert(const QCborValue &key, const QCborValue &value)
\overload
Inserts the key \a key and value \a value into this map and returns a map
iterator pointing to the newly inserted pair.
If the map already had a key equal to \a key, its value will be overwritten
by \a value.
\sa erase(), remove(const QCborValue &), value(const QCborValue &), operator[](const QCborValue &),
find(const QCborValue &), contains(const QCborValue &), take(const QCborValue &), extract()
*/
/*!
\fn QCborMap::iterator QCborMap::insert(value_type v)
\overload
Inserts the key-value pair in \a v into this map and returns a map iterator
pointing to the newly inserted pair.
If the map already had a key equal to \c{v.first}, its value will be
overwritten by \c{v.second}.
\sa operator[], erase(), extract()
*/
/*!
\fn QCborMap::iterator QCborMap::erase(const_iterator it)
Removes the key-value pair pointed to by the map iterator \a it and returns a
pointer to the next element, after removal.
\sa remove(), begin(), end(), insert(), extract()
*/
/*!
\overload
Removes the key-value pair pointed to by the map iterator \a it and returns a
pointer to the next element, after removal.
\sa remove(), begin(), end(), insert()
*/
QCborMap::iterator QCborMap::erase(QCborMap::iterator it)
{
detach();
// remove both key and value
// ### optimize?
d->removeAt(it.item.i - 1);
d->removeAt(it.item.i - 1);
return it;
}
/*!
\fn QCborValue QCborMap::extract(iterator it)
\fn QCborValue QCborMap::extract(const_iterator it)
Extracts a value from the map at the position indicated by iterator \a it
and returns the value so extracted.
\sa insert(), erase(), take(), remove()
*/
QCborValue QCborMap::extract(iterator it)
{
detach();
QCborValue v = d->extractAt(it.item.i);
// remove both key and value
// ### optimize?
d->removeAt(it.item.i - 1);
d->removeAt(it.item.i - 1);
return v;
}
/*!
\fn bool QCborMap::empty() const
Synonym for isEmpty(). This function is provided for compatibility with
generic code that uses the Standard Library API.
Returns true if this map is empty (size() == 0).
\sa isEmpty(), size()
*/
/*!
\fn int QCborMap::compare(const QCborMap &other) const
Compares this map and \a other, comparing each element in sequence, and
returns an integer that indicates whether this map should be sorted prior
to (if the result is negative) or after \a other (if the result is
positive). If this function returns 0, the two maps are equal and contain
the same elements.
Note that CBOR maps are unordered, which means that two maps containing the
very same pairs but in different order will still compare differently. To
avoid this, it is recommended to insert elements into the map in a
predictable order, such as by ascending key value. In fact, maps with keys
in sorted order are required for Canonical CBOR representation.
For more information on CBOR sorting order, see QCborValue::compare().
\sa QCborValue::compare(), QCborArray::compare(), operator==()
*/
/*!
\fn bool QCborMap::operator==(const QCborMap &other) const
Compares this map and \a other, comparing each element in sequence, and
returns true if the two maps contains the same elements in the same order,
false otherwise.
Note that CBOR maps are unordered, which means that two maps containing the
very same pairs but in different order will still compare differently. To
avoid this, it is recommended to insert elements into the map in a
predictable order, such as by ascending key value. In fact, maps with keys
in sorted order are required for Canonical CBOR representation.
For more information on CBOR equality in Qt, see, QCborValue::compare().
\sa compare(), QCborValue::operator==(), QCborMap::operator==(),
operator!=(), operator<()
*/
/*!
\fn bool QCborMap::operator!=(const QCborMap &other) const
Compares this map and \a other, comparing each element in sequence, and
returns true if the two maps contains any different elements or elements in
different orders, false otherwise.
Note that CBOR maps are unordered, which means that two maps containing the
very same pairs but in different order will still compare differently. To
avoid this, it is recommended to insert elements into the map in a
predictable order, such as by ascending key value. In fact, maps with keys
in sorted order are required for Canonical CBOR representation.
For more information on CBOR equality in Qt, see, QCborValue::compare().
\sa compare(), QCborValue::operator==(), QCborMap::operator==(),
operator==(), operator<()
*/
/*!
\fn bool QCborMap::operator<(const QCborMap &other) const
Compares this map and \a other, comparing each element in sequence, and
returns true if this map should be sorted before \a other, false
otherwise.
Note that CBOR maps are unordered, which means that two maps containing the
very same pairs but in different order will still compare differently. To
avoid this, it is recommended to insert elements into the map in a
predictable order, such as by ascending key value. In fact, maps with keys
in sorted order are required for Canonical CBOR representation.
For more information on CBOR sorting order, see QCborValue::compare().
\sa compare(), QCborValue::operator==(), QCborMap::operator==(),
operator==(), operator!=()
*/
void QCborMap::detach(qsizetype reserved)
{
d = QCborContainerPrivate::detach(d.data(), reserved ? reserved : size() * 2);
}
/*!
\class QCborMap::Iterator
\inmodule QtCore
\ingroup cbor
\reentrant
\since 5.12
\brief The QCborMap::Iterator class provides an STL-style non-const iterator for QCborMap.
QCborMap::Iterator allows you to iterate over a QCborMap and to modify the
value (but not the key) stored under a particular key. If you want to
iterate over a const QCborMap, you should use QCborMap::ConstIterator. It
is generally good practice to use QCborMap::ConstIterator on a non-const
QCborMap as well, unless you need to change the QCborMap through the
iterator. Const iterators are slightly faster, and improve code
readability.
You must initialize the iterator using a QCborMap function like
QCborMap::begin(), QCborMap::end(), or QCborMap::find() before you can
start iterating..
Multiple iterators can be used on the same object. Existing iterators will however
become dangling once the object gets modified.
\sa QCborMap::ConstIterator
*/
/*!
\typedef QCborMap::Iterator::difference_type
\internal
*/
/*!
\typedef QCborMap::Iterator::iterator_category
A synonym for \e {std::random_access_iterator_tag} indicating
this iterator is a random-access iterator.
*/
/*!
\typedef QCborMap::Iterator::reference
\internal
*/
/*!
\typedef QCborMap::Iterator::value_type
\internal
*/
/*!
\typedef QCborMap::Iterator::pointer
\internal
*/
/*!
\fn QCborMap::Iterator::Iterator()
Constructs an uninitialized iterator.
Functions like key(), value(), and operator++() must not be
called on an uninitialized iterator. Use operator=() to assign a
value to it before using it.
\sa QCborMap::begin(), QCborMap::end()
*/
/*!
\fn QCborMap::Iterator::Iterator(const Iterator &other)
Constructs an iterator as a copy of \a other.
*/
/*!
\fn QCborMap::Iterator &QCborMap::Iterator::operator=(const Iterator &other)
Makes this iterator a copy of \a other and returns a reference to this
iterator.
*/
/*!
\fn QCborValue QCborMap::Iterator::key() const
Returns the current item's key.
There is no direct way of changing an item's key through an iterator,
although it can be done by calling QCborMap::erase() followed by
QCborMap::insert().
\sa value()
*/
/*!
\fn QCborValueRef QCborMap::Iterator::value() const
Returns a modifiable reference to the current item's value.
You can change the value for a key by using value() on the left side of an
assignment.
The return value is of type QCborValueRef, a helper class for QCborArray
and QCborMap. When you get an object of type QCborValueRef, you can use it
as if it were a reference to a QCborValue. If you assign to it, the
assignment will apply to the element in the QCborArray or QCborMap from
which you got the reference.
\sa key(), operator*()
*/
/*!
\fn QCborMap::Iterator::value_type QCborMap::Iterator::operator*() const
Returns a pair containing the current item's key and a modifiable reference
to the current item's value.
The second element of the pair is of type QCborValueRef, a helper class for
QCborArray and QCborMap. When you get an object of type QCborValueRef, you
can use it as if it were a reference to a QCborValue. If you assign to it,
the assignment will apply to the element in the QCborArray or QCborMap from
which you got the reference.
\sa key(), value()
*/
/*!
\fn QCborValueRef *QCborMap::Iterator::operator->() const
Returns a pointer to a modifiable reference to the current pair's value.
*/
/*!
\fn bool QCborMap::Iterator::operator==(const Iterator &other) const
\fn bool QCborMap::Iterator::operator==(const ConstIterator &other) const
Returns \c true if \a other points to the same entry in the map as this
iterator; otherwise returns \c false.
\sa operator!=()
*/
/*!
\fn bool QCborMap::Iterator::operator!=(const Iterator &other) const
\fn bool QCborMap::Iterator::operator!=(const ConstIterator &other) const
Returns \c true if \a other points to a different entry in the map than
this iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
\fn bool QCborMap::Iterator::operator<(const Iterator& other) const
\fn bool QCborMap::Iterator::operator<(const ConstIterator& other) const
Returns \c true if the entry in the map pointed to by this iterator
occurs before the entry pointed to by the \a other iterator.
*/
/*!
\fn bool QCborMap::Iterator::operator<=(const Iterator& other) const
\fn bool QCborMap::Iterator::operator<=(const ConstIterator& other) const
Returns \c true if the entry in the map pointed to by this iterator
occurs before or is the same entry as is pointed to by the \a other
iterator.
*/
/*!
\fn bool QCborMap::Iterator::operator>(const Iterator& other) const
\fn bool QCborMap::Iterator::operator>(const ConstIterator& other) const
Returns \c true if the entry in the map pointed to by this iterator
occurs after the entry pointed to by the \a other iterator.
*/
/*!
\fn bool QCborMap::Iterator::operator>=(const Iterator& other) const
\fn bool QCborMap::Iterator::operator>=(const ConstIterator& other) const
Returns \c true if the entry in the map pointed to by this iterator
occurs after or is the same entry as is pointed to by the \a other
iterator.
*/
/*!
\fn QCborMap::Iterator &QCborMap::Iterator::operator++()
The prefix ++ operator, \c{++i}, advances the iterator to the next item in
the map and returns this iterator.
Calling this function on QCborMap::end() leads to undefined results.
\sa operator--()
*/
/*!
\fn QCborMap::Iterator QCborMap::Iterator::operator++(int)
\overload
The postfix ++ operator, \c{i++}, advances the iterator to the next item in
the map and returns an iterator to the previously current item.
*/
/*!
\fn QCborMap::Iterator QCborMap::Iterator::operator--()
The prefix -- operator, \c{--i}, makes the preceding item current and
returns this iterator.
Calling this function on QCborMap::begin() leads to undefined results.
\sa operator++()
*/
/*!
\fn QCborMap::Iterator QCborMap::Iterator::operator--(int)
\overload
The postfix -- operator, \c{i--}, makes the preceding item current and
returns an iterator pointing to the previously current item.
*/
/*!
\fn QCborMap::Iterator QCborMap::Iterator::operator+(qsizetype j) const
Returns an iterator to the item at \a j positions forward from this
iterator. If \a j is negative, the iterator goes backward.
\sa operator-()
*/
/*!
\fn QCborMap::Iterator QCborMap::Iterator::operator-(qsizetype j) const
Returns an iterator to the item at \a j positions backward from this
iterator. If \a j is negative, the iterator goes forward.
\sa operator+()
*/
/*!
\fn qsizetype QCborMap::Iterator::operator-(QCborMap::Iterator j) const
Returns the position of the item at iterator \a j relative to the item
at this iterator. If the item at \a j is forward of this time, the returned
value is negative.
\sa operator+()
*/
/*!
\fn QCborMap::Iterator &QCborMap::Iterator::operator+=(qsizetype j)
Advances the iterator by \a j items. If \a j is negative, the iterator goes
backward. Returns a reference to this iterator.
\sa operator-=(), operator+()
*/
/*!
\fn QCborMap::Iterator &QCborMap::Iterator::operator-=(qsizetype j)
Makes the iterator go back by \a j items. If \a j is negative, the iterator
goes forward. Returns a reference to this iterator.
\sa operator+=(), operator-()
*/
/*!
\class QCborMap::ConstIterator
\inmodule QtCore
\ingroup cbor
\since 5.12
\brief The QCborMap::ConstIterator class provides an STL-style const iterator for QCborMap.
QCborMap::ConstIterator allows you to iterate over a QCborMap. If you want
to modify the QCborMap as you iterate over it, you must use
QCborMap::Iterator instead. It is generally good practice to use
QCborMap::ConstIterator, even on a non-const QCborMap, when you don't need
to change the QCborMap through the iterator. Const iterators are slightly
faster and improve code readability.
You must initialize the iterator using a QCborMap function like
QCborMap::begin(), QCborMap::end(), or QCborMap::find() before you can
start iterating..
Multiple iterators can be used on the same object. Existing iterators
will however become dangling if the object gets modified.
\sa QCborMap::Iterator
*/
/*!
\typedef QCborMap::ConstIterator::difference_type
\internal
*/
/*!
\typedef QCborMap::ConstIterator::iterator_category
A synonym for \e {std::random_access_iterator_tag} indicating
this iterator is a random-access iterator.
*/
/*!
\typedef QCborMap::ConstIterator::reference
\internal
*/
/*!
\typedef QCborMap::ConstIterator::value_type
\internal
*/
/*!
\typedef QCborMap::ConstIterator::pointer
\internal
*/
/*!
\fn QCborMap::ConstIterator::ConstIterator()
Constructs an uninitialized iterator.
Functions like key(), value(), and operator++() must not be
called on an uninitialized iterator. Use operator=() to assign a
value to it before using it.
\sa QCborMap::constBegin(), QCborMap::constEnd()
*/
/*!
\fn QCborMap::ConstIterator::ConstIterator(const ConstIterator &other)
Constructs an iterator as a copy of \a other.
*/
/*!
\fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator=(const ConstIterator &other)
Makes this iterator a copy of \a other and returns a reference to this
iterator.
*/
/*!
\fn QString QCborMap::ConstIterator::key() const
Returns the current item's key.
\sa value()
*/
/*!
\fn QCborValue QCborMap::ConstIterator::value() const
Returns the current item's value.
\sa key(), operator*()
*/
/*!
\fn QCborMap::ConstIterator::value_type QCborMap::ConstIterator::operator*() const
Returns a pair containing the curent item's key and value.
\sa key(), value()
*/
/*!
\fn const QCborValueRef *QCborMap::ConstIterator::operator->() const
Returns a pointer to the current pair's value.
*/
/*!
\fn bool QCborMap::ConstIterator::operator==(const ConstIterator &other) const
\fn bool QCborMap::ConstIterator::operator==(const Iterator &other) const
Returns \c true if \a other points to the same entry in the map as this
iterator; otherwise returns \c false.
\sa operator!=()
*/
/*!
\fn bool QCborMap::ConstIterator::operator!=(const ConstIterator &other) const
\fn bool QCborMap::ConstIterator::operator!=(const Iterator &other) const
Returns \c true if \a other points to a different entry in the map than
this iterator; otherwise returns \c false.
\sa operator==()
*/
/*!
\fn bool QCborMap::ConstIterator::operator<(const Iterator &other) const
\fn bool QCborMap::ConstIterator::operator<(const ConstIterator &other) const
Returns \c true if the entry in the map pointed to by this iterator
occurs before the entry pointed to by the \a other iterator.
*/
/*!
\fn bool QCborMap::ConstIterator::operator<=(const Iterator &other) const
\fn bool QCborMap::ConstIterator::operator<=(const ConstIterator &other) const
Returns \c true if the entry in the map pointed to by this iterator
occurs before or is the same entry as is pointed to by the \a other
iterator.
*/
/*!
\fn bool QCborMap::ConstIterator::operator>(const Iterator &other) const
\fn bool QCborMap::ConstIterator::operator>(const ConstIterator &other) const
Returns \c true if the entry in the map pointed to by this iterator
occurs after the entry pointed to by the \a other iterator.
*/
/*!
\fn bool QCborMap::ConstIterator::operator>=(const Iterator &other) const
\fn bool QCborMap::ConstIterator::operator>=(const ConstIterator &other) const
Returns \c true if the entry in the map pointed to by this iterator
occurs after or is the same entry as is pointed to by the \a other
iterator.
*/
/*!
\fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator++()
The prefix ++ operator, \c{++i}, advances the iterator to the next item in
the map and returns this iterator.
Calling this function on QCborMap::end() leads to undefined results.
\sa operator--()
*/
/*!
\fn QCborMap::ConstIterator QCborMap::ConstIterator::operator++(int)
\overload
The postfix ++ operator, \c{i++}, advances the iterator to the next item in
the map and returns an iterator to the previously current item.
*/
/*!
\fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator--()
The prefix -- operator, \c{--i}, makes the preceding item current and
returns this iterator.
Calling this function on QCborMap::begin() leads to undefined results.
\sa operator++()
*/
/*!
\fn QCborMap::ConstIterator QCborMap::ConstIterator::operator--(int)
\overload
The postfix -- operator, \c{i--}, makes the preceding item current and
returns an iterator pointing to the previously current item.
*/
/*!
\fn QCborMap::ConstIterator QCborMap::ConstIterator::operator+(qsizetype j) const
Returns an iterator to the item at \a j positions forward from this
iterator. If \a j is negative, the iterator goes backward.
\sa operator-()
*/
/*!
\fn QCborMap::ConstIterator QCborMap::ConstIterator::operator-(qsizetype j) const
Returns an iterator to the item at \a j positions backward from this
iterator. If \a j is negative, the iterator goes forward.
\sa operator+()
*/
/*!
\fn qsizetype QCborMap::ConstIterator::operator-(QCborMap::ConstIterator j) const
Returns the position of the item at iterator \a j relative to the item
at this iterator. If the item at \a j is forward of this time, the returned
value is negative.
\sa operator+()
*/
/*!
\fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator+=(qsizetype j)
Advances the iterator by \a j items. If \a j is negative, the iterator goes
backward. Returns a reference to this iterator.
\sa operator-=(), operator+()
*/
/*!
\fn QCborMap::ConstIterator &QCborMap::ConstIterator::operator-=(qsizetype j)
Makes the iterator go back by \a j items. If \a j is negative, the iterator
goes forward. Returns a reference to this iterator.
\sa operator+=(), operator-()
*/
uint qHash(const QCborMap &map, uint seed)
{
return qHashRange(map.begin(), map.end(), seed);
}
#if !defined(QT_NO_DEBUG_STREAM)
QDebug operator<<(QDebug dbg, const QCborMap &m)
{
QDebugStateSaver saver(dbg);
dbg.nospace() << "QCborMap{";
const char *open = "{";
for (auto pair : m) {
dbg << open << pair.first << ", " << pair.second << '}';
open = ", {";
}
return dbg << '}';
}
#endif
#ifndef QT_NO_DATASTREAM
QDataStream &operator<<(QDataStream &stream, const QCborMap &value)
{
stream << value.toCborValue().toCbor();
return stream;
}
QDataStream &operator>>(QDataStream &stream, QCborMap &value)
{
QByteArray buffer;
stream >> buffer;
QCborParserError parseError{};
value = QCborValue::fromCbor(buffer, &parseError).toMap();
if (parseError.error)
stream.setStatus(QDataStream::ReadCorruptData);
return stream;
}
#endif
QT_END_NAMESPACE