diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-02-04 15:49:32 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-02-07 12:28:26 +0000 |
commit | 5cf308cd17f403ac07fbd239c5bea674302a445e (patch) | |
tree | c7b82426852e9f80f16e1afd868a413a262addd1 /src/qml/qml/ftw | |
parent | 540f5b272933b0c8e377b811c85ed2478bb98997 (diff) |
Add a mutable iterator to QStringHash
And use that in QQmlTypeModule to get rid of a const_cast.
Change-Id: Ifbb39293b6f0e159355dd7780febba0eed149025
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml/qml/ftw')
-rw-r--r-- | src/qml/qml/ftw/qlinkedstringhash_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/ftw/qstringhash_p.h | 62 |
2 files changed, 54 insertions, 10 deletions
diff --git a/src/qml/qml/ftw/qlinkedstringhash_p.h b/src/qml/qml/ftw/qlinkedstringhash_p.h index c5d428119f..06491139e0 100644 --- a/src/qml/qml/ftw/qlinkedstringhash_p.h +++ b/src/qml/qml/ftw/qlinkedstringhash_p.h @@ -65,7 +65,7 @@ public: using typename QStringHash<T>::mapped_type; using ConstIteratorData = QStringHashData::IteratorData<const QLinkedStringHash>; - using ConstIterator = typename QStringHash<T>::template Iterator<ConstIteratorData>; + using ConstIterator = typename QStringHash<T>::template Iterator<ConstIteratorData, const T>; void linkAndReserve(const QLinkedStringHash<T> &other, int additionalReserve) { diff --git a/src/qml/qml/ftw/qstringhash_p.h b/src/qml/qml/ftw/qstringhash_p.h index 7e1a5dfb4d..f974c49fe0 100644 --- a/src/qml/qml/ftw/qstringhash_p.h +++ b/src/qml/qml/ftw/qstringhash_p.h @@ -170,6 +170,10 @@ public: template<typename StringHash> struct IteratorData { IteratorData(QStringHashNode *n = nullptr, StringHash *p = nullptr) : n(n), p(p) {} + + template<typename OtherData> + IteratorData(const OtherData &other) : n(other.n), p(other.p) {} + QStringHashNode *n; StringHash *p; }; @@ -303,7 +307,7 @@ public: inline int numBuckets() const; - template<typename Data> + template<typename Data, typename Value> class Iterator { public: inline Iterator() = default; @@ -322,25 +326,26 @@ public: inline bool equals(const K &key) const { return d.n->equals(key); } inline QHashedString key() const { return static_cast<Node *>(d.n)->key(); } - inline const T &value() const { return static_cast<Node *>(d.n)->value; } - inline const T &operator*() const { return static_cast<Node *>(d.n)->value; } + inline Value &value() const { return static_cast<Node *>(d.n)->value; } + inline Value &operator*() const { return static_cast<Node *>(d.n)->value; } Node *node() const { return static_cast<Node *>(d.n); } private: Data d; }; - using ConstIterator = Iterator<ConstIteratorData>; + using MutableIterator = Iterator<MutableIteratorData, T>; + using ConstIterator = Iterator<ConstIteratorData, const T>; template<typename K> inline void insert(const K &, const T &); - - inline void insert(const ConstIterator &); + inline void insert(const MutableIterator &); + inline void insert(const ConstIterator &); template<typename K> inline T *value(const K &) const; - inline T *value(const QV4::String *string) const; + inline T *value(const MutableIterator &) const; inline T *value(const ConstIterator &) const; template<typename K> @@ -349,8 +354,16 @@ public: template<typename K> inline T &operator[](const K &); + inline MutableIterator begin(); inline ConstIterator begin() const; + inline ConstIterator constBegin() const { return begin(); } + + inline MutableIterator end(); inline ConstIterator end() const; + inline ConstIterator constEnd() const { return end(); } + + template<typename K> + inline MutableIterator find(const K &); template<typename K> inline ConstIterator find(const K &) const; @@ -632,6 +645,12 @@ void QStringHash<T>::insert(const K &key, const T &value) } template<class T> +void QStringHash<T>::insert(const MutableIterator &iter) +{ + insert(iter.key(), iter.value()); +} + +template<class T> void QStringHash<T>::insert(const ConstIterator &iter) { insert(iter.key(), iter.value()); @@ -658,11 +677,16 @@ T *QStringHash<T>::value(const K &key) const return n?&n->value:nullptr; } +template<typename T> +T *QStringHash<T>::value(const MutableIterator &iter) const +{ + return value(iter.node()->key()); +} + template<class T> T *QStringHash<T>::value(const ConstIterator &iter) const { - Node *n = iter.node(); - return value(n->key()); + return value(iter.node()->key()); } template<class T> @@ -703,12 +727,24 @@ void QStringHash<T>::reserve(int n) } template<class T> +typename QStringHash<T>::MutableIterator QStringHash<T>::begin() +{ + return MutableIterator(iterateFirst<QStringHash<T>, MutableIteratorData>(this)); +} + +template<class T> typename QStringHash<T>::ConstIterator QStringHash<T>::begin() const { return ConstIterator(iterateFirst<const QStringHash<T>, ConstIteratorData>(this)); } template<class T> +typename QStringHash<T>::MutableIterator QStringHash<T>::end() +{ + return MutableIterator(); +} + +template<class T> typename QStringHash<T>::ConstIterator QStringHash<T>::end() const { return ConstIterator(); @@ -716,6 +752,14 @@ typename QStringHash<T>::ConstIterator QStringHash<T>::end() const template<class T> template<class K> +typename QStringHash<T>::MutableIterator QStringHash<T>::find(const K &key) +{ + Node *n = findNode(key); + return n ? MutableIterator(MutableIteratorData(n, this)) : MutableIterator(); +} + +template<class T> +template<class K> typename QStringHash<T>::ConstIterator QStringHash<T>::find(const K &key) const { Node *n = findNode(key); |