aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2019-02-04 15:49:32 +0100
committerUlf Hermann <ulf.hermann@qt.io>2019-02-07 12:28:26 +0000
commit5cf308cd17f403ac07fbd239c5bea674302a445e (patch)
treec7b82426852e9f80f16e1afd868a413a262addd1 /src/qml/qml
parent540f5b272933b0c8e377b811c85ed2478bb98997 (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.h2
-rw-r--r--src/qml/qml/ftw/qstringhash_p.h62
-rw-r--r--src/qml/qml/qqmlimport.cpp4
-rw-r--r--src/qml/qml/qqmltypemodule.cpp6
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())