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 | |
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')
-rw-r--r-- | src/qml/qml/ftw/qlinkedstringhash_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/ftw/qstringhash_p.h | 62 | ||||
-rw-r--r-- | src/qml/qml/qqmlimport.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmltypemodule.cpp | 6 |
4 files changed, 58 insertions, 16 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); diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp index 2189a49d16..5b22d8c6ed 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp @@ -2256,8 +2256,8 @@ bool QQmlImportDatabase::importDynamicPlugin(const QString &filePath, const QStr void QQmlImportDatabase::clearDirCache() { - QStringHash<QmldirCache *>::ConstIterator itr = qmldirCache.begin(); - while (itr != qmldirCache.end()) { + QStringHash<QmldirCache *>::ConstIterator itr = qmldirCache.constBegin(); + while (itr != qmldirCache.constEnd()) { QmldirCache *cache = *itr; do { QmldirCache *nextCache = cache->next; diff --git a/src/qml/qml/qqmltypemodule.cpp b/src/qml/qml/qqmltypemodule.cpp index 35be51160f..05264abb1d 100644 --- a/src/qml/qml/qqmltypemodule.cpp +++ b/src/qml/qml/qqmltypemodule.cpp @@ -94,10 +94,8 @@ void QQmlTypeModulePrivate::add(QQmlTypePrivate *type) void QQmlTypeModulePrivate::remove(const QQmlTypePrivate *type) { - for (TypeHash::ConstIterator elementIt = typeHash.begin(); elementIt != typeHash.end();) { - QList<QQmlTypePrivate *> &list = const_cast<QList<QQmlTypePrivate *> &>(elementIt.value()); - - QQmlMetaType::removeQQmlTypePrivate(list, type); + for (TypeHash::MutableIterator elementIt = typeHash.begin(); elementIt != typeHash.end();) { + QQmlMetaType::removeQQmlTypePrivate(elementIt.value(), type); #if 0 if (list.isEmpty()) |