Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-16 09:04:20

0001 // Copyright (C) 2022 Intel Corporation.
0002 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
0003 
0004 #ifndef QCBORMAP_H
0005 #define QCBORMAP_H
0006 
0007 #include <QtCore/qcborvalue.h>
0008 #include <QtCore/qpair.h>
0009 
0010 #include <initializer_list>
0011 
0012 QT_BEGIN_NAMESPACE
0013 
0014 class QJsonObject;
0015 class QDataStream;
0016 
0017 namespace QJsonPrivate { class Variant; }
0018 
0019 class QCborContainerPrivate;
0020 class Q_CORE_EXPORT QCborMap
0021 {
0022 public:
0023     typedef std::pair<QCborValue, QCborValue> value_type;
0024     typedef QCborValue key_type;
0025     typedef QCborValue mapped_type;
0026     typedef qsizetype size_type;
0027 
0028     class ConstIterator;
0029     class Iterator {
0030         QCborValueRef item {};      // points to the value
0031         friend class ConstIterator;
0032         friend class QCborMap;
0033         Iterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
0034     public:
0035         typedef std::random_access_iterator_tag iterator_category;
0036         typedef qsizetype difference_type;
0037         typedef std::pair<QCborValueConstRef, QCborValueRef> value_type;
0038         typedef std::pair<QCborValueConstRef, QCborValueRef> reference;
0039         typedef std::pair<QCborValueConstRef, QCborValueRef> pointer;
0040 
0041         constexpr Iterator() = default;
0042         constexpr Iterator(const Iterator &) = default;
0043         ~Iterator() = default;
0044         Iterator &operator=(const Iterator &other)
0045         {
0046             // rebind the reference
0047             item.d = other.item.d;
0048             item.i = other.item.i;
0049             return *this;
0050         }
0051 
0052         value_type operator*() const { return { QCborValueRef{item.d, item.i - 1}, item }; }
0053         value_type operator[](qsizetype j) const { return *(*this + j); }
0054         QCborValueRef *operator->() { return &item; }
0055         const QCborValueConstRef *operator->() const { return &item; }
0056 #if QT_VERSION >= QT_VERSION_CHECK(7,0,0)
0057         QCborValueConstRef
0058 #else
0059         QCborValue
0060 #endif
0061         key() const { return QCborValueRef(item.d, item.i - 1); }
0062         QCborValueRef value() const { return item; }
0063 
0064 #if QT_CORE_REMOVED_SINCE(6, 8)
0065         bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
0066         bool operator!=(const Iterator &o) const { return !operator==(o); }
0067         bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
0068         bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
0069         bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
0070         bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
0071         bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
0072         bool operator!=(const ConstIterator &o) const { return !operator==(o); }
0073         bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
0074         bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
0075         bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
0076         bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
0077 #endif
0078         Iterator &operator++() { item.i += 2; return *this; }
0079         Iterator operator++(int) { Iterator n = *this; item.i += 2; return n; }
0080         Iterator &operator--() { item.i -= 2; return *this; }
0081         Iterator operator--(int) { Iterator n = *this; item.i -= 2; return n; }
0082         Iterator &operator+=(qsizetype j) { item.i += 2 * j; return *this; }
0083         Iterator &operator-=(qsizetype j) { item.i -= 2 * j; return *this; }
0084         Iterator operator+(qsizetype j) const { return Iterator({ item.d, item.i + 2 * j }); }
0085         Iterator operator-(qsizetype j) const { return Iterator({ item.d, item.i - 2 * j }); }
0086         qsizetype operator-(Iterator j) const { return (item.i - j.item.i) / 2; }
0087 
0088     private:
0089         // Helper functions
0090         static bool comparesEqual_helper(const Iterator &lhs, const Iterator &rhs) noexcept
0091         {
0092             return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
0093         }
0094 
0095         static bool comparesEqual_helper(const Iterator &lhs, const ConstIterator &rhs) noexcept
0096         {
0097             return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
0098         }
0099 
0100         static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs,
0101                                                           const Iterator &rhs)
0102         {
0103             Q_ASSERT(lhs.item.d == rhs.item.d);
0104             return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
0105         }
0106 
0107         static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs,
0108                                                           const ConstIterator &rhs)
0109         {
0110             Q_ASSERT(lhs.item.d == rhs.item.d);
0111             return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
0112         }
0113 
0114         // Compare friends
0115         friend bool comparesEqual(const Iterator &lhs, const Iterator &rhs) noexcept
0116         {
0117             return comparesEqual_helper(lhs, rhs);
0118         }
0119         friend Qt::strong_ordering compareThreeWay(const Iterator &lhs,
0120                                                    const Iterator &rhs)
0121         {
0122             return compareThreeWay_helper(lhs, rhs);
0123         }
0124         Q_DECLARE_STRONGLY_ORDERED_NON_NOEXCEPT(Iterator)
0125         friend bool comparesEqual(const Iterator &lhs, const ConstIterator &rhs) noexcept
0126         {
0127             return comparesEqual_helper(lhs, rhs);
0128         }
0129         friend Qt::strong_ordering compareThreeWay(const Iterator &lhs,
0130                                                    const ConstIterator &rhs)
0131         {
0132             return compareThreeWay_helper(lhs, rhs);
0133         }
0134         Q_DECLARE_STRONGLY_ORDERED_NON_NOEXCEPT(Iterator, ConstIterator)
0135     };
0136 
0137     class ConstIterator {
0138         QCborValueConstRef item;     // points to the value
0139         friend class Iterator;
0140         friend class QCborMap;
0141         friend class QCborValue;
0142         friend class QCborValueRef;
0143         constexpr ConstIterator(QCborValueConstRef it) : item{it} {}
0144         ConstIterator(QCborContainerPrivate *dd, qsizetype ii) : item(dd, ii) {}
0145     public:
0146         typedef std::random_access_iterator_tag iterator_category;
0147         typedef qsizetype difference_type;
0148         typedef std::pair<QCborValueConstRef, QCborValueConstRef> value_type;
0149         typedef std::pair<QCborValueConstRef, QCborValueConstRef> reference;
0150         typedef std::pair<QCborValueConstRef, QCborValueConstRef> pointer;
0151 
0152         constexpr ConstIterator() = default;
0153         constexpr ConstIterator(const ConstIterator &) = default;
0154         ~ConstIterator() = default;
0155         ConstIterator &operator=(const ConstIterator &other)
0156         {
0157             // rebind the reference
0158             item.d = other.item.d;
0159             item.i = other.item.i;
0160             return *this;
0161         }
0162 
0163         value_type operator*() const { return { QCborValueRef(item.d, item.i - 1), item }; }
0164         value_type operator[](qsizetype j) const { return *(*this + j); }
0165         const QCborValueConstRef *operator->() const { return &item; }
0166 #if QT_VERSION >= QT_VERSION_CHECK(7,0,0)
0167         QCborValueConstRef
0168 #else
0169         QCborValue
0170 #endif
0171         key() const { return QCborValueRef(item.d, item.i - 1); }
0172         QCborValueConstRef value() const { return item; }
0173 
0174 #if QT_CORE_REMOVED_SINCE(6, 8)
0175         bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
0176         bool operator!=(const Iterator &o) const { return !operator==(o); }
0177         bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
0178         bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
0179         bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
0180         bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
0181         bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; }
0182         bool operator!=(const ConstIterator &o) const { return !operator==(o); }
0183         bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; }
0184         bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; }
0185         bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; }
0186         bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; }
0187 #endif
0188         ConstIterator &operator++() { item.i += 2; return *this; }
0189         ConstIterator operator++(int) { ConstIterator n = *this; item.i += 2; return n; }
0190         ConstIterator &operator--() { item.i -= 2; return *this; }
0191         ConstIterator operator--(int) { ConstIterator n = *this; item.i -= 2; return n; }
0192         ConstIterator &operator+=(qsizetype j) { item.i += 2 * j; return *this; }
0193         ConstIterator &operator-=(qsizetype j) { item.i -= 2 * j; return *this; }
0194         ConstIterator operator+(qsizetype j) const { return ConstIterator{ item.d, item.i + 2 * j }; }
0195         ConstIterator operator-(qsizetype j) const { return ConstIterator{ item.d, item.i - 2 * j }; }
0196         qsizetype operator-(ConstIterator j) const { return (item.i - j.item.i) / 2; }
0197     private:
0198         // Helper functions
0199         static bool comparesEqual_helper(const ConstIterator &lhs,
0200                                          const ConstIterator &rhs) noexcept
0201         {
0202             return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i;
0203         }
0204         static Qt::strong_ordering compareThreeWay_helper(const ConstIterator &lhs,
0205                                                           const ConstIterator &rhs)
0206         {
0207             Q_ASSERT(lhs.item.d == rhs.item.d);
0208             return Qt::compareThreeWay(lhs.item.i, rhs.item.i);
0209         }
0210 
0211         // Compare friends
0212         friend bool comparesEqual(const ConstIterator &lhs, const ConstIterator &rhs) noexcept
0213         {
0214             return comparesEqual_helper(lhs, rhs);
0215         }
0216         friend Qt::strong_ordering compareThreeWay(const ConstIterator &lhs,
0217                                                    const ConstIterator &rhs)
0218         {
0219             return compareThreeWay_helper(lhs, rhs);
0220         }
0221         Q_DECLARE_STRONGLY_ORDERED_NON_NOEXCEPT(ConstIterator)
0222     };
0223 
0224     QCborMap()  noexcept;
0225     QCborMap(const QCborMap &other) noexcept;
0226     QCborMap &operator=(const QCborMap &other) noexcept;
0227     QCborMap(std::initializer_list<value_type> args)
0228         : QCborMap()
0229     {
0230         detach(args.size());
0231         for (const auto &pair : args)
0232            insert(pair.first, pair.second);
0233     }
0234     ~QCborMap();
0235 
0236     void swap(QCborMap &other) noexcept
0237     {
0238         d.swap(other.d);
0239     }
0240 
0241     QCborValue toCborValue() const { return *this; }
0242 
0243     qsizetype size() const noexcept Q_DECL_PURE_FUNCTION;
0244     bool isEmpty() const { return size() == 0; }
0245     void clear();
0246     QList<QCborValue> keys() const;
0247 
0248     QCborValue value(qint64 key) const
0249     { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
0250     QCborValue value(QLatin1StringView key) const
0251     { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
0252     QCborValue value(const QString & key) const
0253     { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
0254     QCborValue value(const QCborValue &key) const
0255     { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
0256 #if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
0257     template<size_t N> QT_ASCII_CAST_WARN const QCborValue value(const char (&key)[N]) const
0258     { return value(QString::fromUtf8(key, N - 1)); }
0259 #endif
0260     const QCborValue operator[](qint64 key) const
0261     { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
0262     const QCborValue operator[](QLatin1StringView key) const
0263     { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
0264     const QCborValue operator[](const QString & key) const
0265     { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
0266     const QCborValue operator[](const QCborValue &key) const
0267     { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); }
0268 #if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
0269     template<size_t N> QT_ASCII_CAST_WARN const QCborValue operator[](const char (&key)[N]) const
0270     { return operator[](QString::fromUtf8(key, N - 1)); }
0271 #endif
0272     QCborValueRef operator[](qint64 key);
0273     QCborValueRef operator[](QLatin1StringView key);
0274     QCborValueRef operator[](const QString & key);
0275     QCborValueRef operator[](const QCborValue &key);
0276 
0277     QCborValue take(qint64 key)
0278     { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); }
0279     QCborValue take(QLatin1StringView key)
0280     { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); }
0281     QCborValue take(const QString &key)
0282     { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); }
0283     QCborValue take(const QCborValue &key)
0284     { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); }
0285     void remove(qint64 key)
0286     { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); }
0287     void remove(QLatin1StringView key)
0288     { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); }
0289     void remove(const QString & key)
0290     { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); }
0291     void remove(const QCborValue &key)
0292     { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); }
0293     bool contains(qint64 key) const
0294     { const_iterator it = find(key); return !comparesEqual(it, end()); }
0295     bool contains(QLatin1StringView key) const
0296     { const_iterator it = find(key); return !comparesEqual(it, end()); }
0297     bool contains(const QString & key) const
0298     { const_iterator it = find(key); return !comparesEqual(it, end()); }
0299     bool contains(const QCborValue &key) const
0300     { const_iterator it = find(key); return !comparesEqual(it, end()); }
0301 
0302     int compare(const QCborMap &other) const noexcept Q_DECL_PURE_FUNCTION;
0303 #if QT_CORE_REMOVED_SINCE(6, 8)
0304     bool operator==(const QCborMap &other) const noexcept
0305     { return compare(other) == 0; }
0306     bool operator!=(const QCborMap &other) const noexcept
0307     { return !operator==(other); }
0308     bool operator<(const QCborMap &other) const
0309     { return compare(other) < 0; }
0310 #endif
0311 
0312     typedef Iterator iterator;
0313     typedef ConstIterator const_iterator;
0314     iterator begin() { detach(); return iterator{d.data(), 1}; }
0315     const_iterator constBegin() const { return const_iterator{d.data(), 1}; }
0316     const_iterator begin() const { return constBegin(); }
0317     const_iterator cbegin() const { return constBegin(); }
0318     iterator end() { detach(); return iterator{d.data(), 2 * size() + 1}; }
0319     const_iterator constEnd() const { return const_iterator{d.data(), 2 * size() + 1}; }
0320     const_iterator end() const { return constEnd(); }
0321     const_iterator cend() const { return constEnd(); }
0322     iterator erase(iterator it);
0323     iterator erase(const_iterator it) { return erase(iterator{ it.item.d, it.item.i }); }
0324     QCborValue extract(iterator it);
0325     QCborValue extract(const_iterator it) { return extract(iterator{ it.item.d, it.item.i }); }
0326     bool empty() const { return isEmpty(); }
0327 
0328     iterator find(qint64 key);
0329     iterator find(QLatin1StringView key);
0330     iterator find(const QString & key);
0331     iterator find(const QCborValue &key);
0332     const_iterator constFind(qint64 key) const;
0333     const_iterator constFind(QLatin1StringView key) const;
0334     const_iterator constFind(const QString & key) const;
0335     const_iterator constFind(const QCborValue &key) const;
0336     const_iterator find(qint64 key) const { return constFind(key); }
0337     const_iterator find(QLatin1StringView key) const { return constFind(key); }
0338     const_iterator find(const QString & key) const { return constFind(key); }
0339     const_iterator find(const QCborValue &key) const { return constFind(key); }
0340 
0341     iterator insert(qint64 key, const QCborValue &value_)
0342     {
0343         QCborValueRef v = operator[](key);  // detaches
0344         v = value_;
0345         return { d.data(), v.i };
0346     }
0347     iterator insert(QLatin1StringView key, const QCborValue &value_)
0348     {
0349         QCborValueRef v = operator[](key);  // detaches
0350         v = value_;
0351         return { d.data(), v.i };
0352     }
0353     iterator insert(const QString &key, const QCborValue &value_)
0354     {
0355         QCborValueRef v = operator[](key);  // detaches
0356         v = value_;
0357         return { d.data(), v.i };
0358     }
0359     iterator insert(const QCborValue &key, const QCborValue &value_)
0360     {
0361         QCborValueRef v = operator[](key);  // detaches
0362         v = value_;
0363         return { d.data(), v.i };
0364     }
0365     iterator insert(value_type v) { return insert(v.first, v.second); }
0366 
0367     static QCborMap fromVariantMap(const QVariantMap &map);
0368     static QCborMap fromVariantHash(const QVariantHash &hash);
0369     static QCborMap fromJsonObject(const QJsonObject &o);
0370     static QCborMap fromJsonObject(QJsonObject &&o) noexcept;
0371     QVariantMap toVariantMap() const;
0372     QVariantHash toVariantHash() const;
0373     QJsonObject toJsonObject() const;
0374 
0375 private:
0376     friend class QCborContainerPrivate;
0377     friend class QCborValue;
0378     friend class QCborValueRef;
0379     friend class QJsonPrivate::Variant;
0380     void detach(qsizetype reserve = 0);
0381 
0382     friend Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool
0383     comparesEqual(const QCborMap &lhs, const QCborMap &rhs) noexcept;
0384     friend Qt::strong_ordering compareThreeWay(const QCborMap &lhs,
0385                                                const QCborMap &rhs) noexcept
0386     {
0387         int c = lhs.compare(rhs);
0388         return Qt::compareThreeWay(c, 0);
0389     }
0390     Q_DECLARE_STRONGLY_ORDERED(QCborMap)
0391 
0392     static Q_DECL_PURE_FUNCTION bool
0393     comparesEqual_helper(const QCborMap &lhs, const QCborValue &rhs) noexcept;
0394     static Q_DECL_PURE_FUNCTION Qt::strong_ordering
0395     compareThreeWay_helper(const QCborMap &lhs, const QCborValue &rhs) noexcept;
0396     friend bool comparesEqual(const QCborMap &lhs,
0397                               const QCborValue &rhs) noexcept
0398     {
0399         return comparesEqual_helper(lhs, rhs);
0400     }
0401     friend Qt::strong_ordering compareThreeWay(const QCborMap &lhs,
0402                                                const QCborValue &rhs) noexcept
0403     {
0404         return compareThreeWay_helper(lhs, rhs);
0405     }
0406     Q_DECLARE_STRONGLY_ORDERED(QCborMap, QCborValue)
0407 
0408     static Q_DECL_PURE_FUNCTION bool
0409     comparesEqual_helper(const QCborMap &lhs, QCborValueConstRef rhs) noexcept;
0410     static Q_DECL_PURE_FUNCTION Qt::strong_ordering
0411     compareThreeWay_helper(const QCborMap &lhs, QCborValueConstRef rhs) noexcept;
0412     friend bool comparesEqual(const QCborMap &lhs,
0413                               const QCborValueConstRef &rhs) noexcept
0414     {
0415         return comparesEqual_helper(lhs, rhs);
0416     }
0417     friend Qt::strong_ordering compareThreeWay(const QCborMap &lhs,
0418                                                const QCborValueConstRef &rhs) noexcept
0419     {
0420         return compareThreeWay_helper(lhs, rhs);
0421     }
0422     Q_DECLARE_STRONGLY_ORDERED(QCborMap, QCborValueConstRef)
0423 
0424     explicit QCborMap(QCborContainerPrivate &dd) noexcept;
0425     QExplicitlySharedDataPointer<QCborContainerPrivate> d;
0426 };
0427 
0428 Q_DECLARE_SHARED(QCborMap)
0429 
0430 inline QCborValue::QCborValue(QCborMap &&m)
0431     : n(-1), container(m.d.take()), t(Map)
0432 {
0433 }
0434 
0435 #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
0436 inline QCborMap QCborValueRef::toMap() const
0437 {
0438     return concrete().toMap();
0439 }
0440 
0441 inline QCborMap QCborValueRef::toMap(const QCborMap &m) const
0442 {
0443     return concrete().toMap(m);
0444 }
0445 #endif
0446 
0447 inline QCborMap QCborValueConstRef::toMap() const
0448 {
0449     return concrete().toMap();
0450 }
0451 
0452 inline QCborMap QCborValueConstRef::toMap(const QCborMap &m) const
0453 {
0454     return concrete().toMap(m);
0455 }
0456 
0457 Q_CORE_EXPORT size_t qHash(const QCborMap &map, size_t seed = 0);
0458 
0459 #if !defined(QT_NO_DEBUG_STREAM)
0460 Q_CORE_EXPORT QDebug operator<<(QDebug, const QCborMap &m);
0461 #endif
0462 
0463 #ifndef QT_NO_DATASTREAM
0464 #if QT_CONFIG(cborstreamwriter)
0465 Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QCborMap &);
0466 #endif
0467 Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QCborMap &);
0468 #endif
0469 
0470 
0471 QT_END_NAMESPACE
0472 
0473 #endif // QCBORMAP_H