Qt 6: Deprecate QHash::insertMulti

[ChangeLog][QtCore][QHash] insertMulti(), unite() and
values(const Key &key) are now deprecated. Please use
QMultiHash instead.

Change-Id: Ic14907fd5fd38d585708e2dcf2c0200d221ebb25
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Lars Knoll 2018-11-26 10:37:10 +01:00 committed by Mårten Nordheim
parent c7e35ffe69
commit 9c124b1b0a
7 changed files with 217 additions and 160 deletions

View File

@ -119,22 +119,6 @@ hash.insert("plenty", 2000);
//! [9] //! [9]
//! [10]
QList<int> values = hash.values("plenty");
for (int i = 0; i < values.size(); ++i)
cout << values.at(i) << Qt::endl;
//! [10]
//! [11]
QHash<QString, int>::iterator i = hash.find("plenty");
while (i != hash.end() && i.key() == "plenty") {
cout << i.value() << Qt::endl;
++i;
}
//! [11]
//! [12] //! [12]
QHash<QString, int> hash; QHash<QString, int> hash;
... ...

View File

@ -972,7 +972,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
const QVariantMap *map = v_cast<QVariantMap>(d); const QVariantMap *map = v_cast<QVariantMap>(d);
const auto end = map->end(); const auto end = map->end();
for (auto it = map->begin(); it != end; ++it) for (auto it = map->begin(); it != end; ++it)
hash->insertMulti(it.key(), it.value()); static_cast<QMultiHash<QString, QVariant> *>(hash)->insert(it.key(), it.value());
#ifndef QT_BOOTSTRAPPED #ifndef QT_BOOTSTRAPPED
} else if (d->type == QMetaType::QCborValue) { } else if (d->type == QMetaType::QCborValue) {
if (!v_cast<QCborValue>(d)->isMap()) if (!v_cast<QCborValue>(d)->isMap())

View File

@ -825,7 +825,7 @@ namespace QtPrivate {
QVariantHash l; QVariantHash l;
l.reserve(iter.size()); l.reserve(iter.size());
for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it) for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it)
l.insertMulti(it.key().toString(), it.value()); static_cast<QMultiHash<QString, QVariant> &>(l).insert(it.key().toString(), it.value());
return l; return l;
} }
return QVariantValueHelper<QVariantHash>::invoke(v); return QVariantValueHelper<QVariantHash>::invoke(v);

View File

@ -301,7 +301,10 @@ QDataStream &readAssociativeContainer(QDataStream &s, Container &c)
c.clear(); c.clear();
break; break;
} }
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
c.insertMulti(k, t); c.insertMulti(k, t);
QT_WARNING_POP
} }
return s; return s;

View File

@ -1120,21 +1120,6 @@ uint qHash(long double key, uint seed) noexcept
\snippet code/src_corelib_tools_qhash.cpp 9 \snippet code/src_corelib_tools_qhash.cpp 9
However, you can store multiple values per key by using
insertMulti() instead of insert() (or using the convenience
subclass QMultiHash). If you want to retrieve all
the values for a single key, you can use values(const Key &key),
which returns a QList<T>:
\snippet code/src_corelib_tools_qhash.cpp 10
The items that share the same key are available from most
recently to least recently inserted. A more efficient approach is
to call find() to get the iterator for the first item with a key
and iterate from there:
\snippet code/src_corelib_tools_qhash.cpp 11
If you only need to extract the values from a hash (not the keys), If you only need to extract the values from a hash (not the keys),
you can also use \l{foreach}: you can also use \l{foreach}:
@ -1435,9 +1420,8 @@ uint qHash(long double key, uint seed) noexcept
/*! \fn template <class Key, class T> int QHash<Key, T>::remove(const Key &key) /*! \fn template <class Key, class T> int QHash<Key, T>::remove(const Key &key)
Removes all the items that have the \a key from the hash. Removes all the items that have the \a key from the hash.
Returns the number of items removed which is usually 1 but will Returns the number of items removed which is 1 if the key exists in the hash,
be 0 if the key isn't in the hash, or greater than 1 if and 0 otherwise.
insertMulti() has been used with the \a key.
\sa clear(), take(), QMultiHash::remove() \sa clear(), take(), QMultiHash::remove()
*/ */
@ -1507,27 +1491,25 @@ uint qHash(long double key, uint seed) noexcept
/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::uniqueKeys() const /*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::uniqueKeys() const
\since 4.2 \since 4.2
\obsolete
Returns a list containing all the keys in the map. Keys that occur multiple Returns a list containing all the keys in the map. Keys that occur multiple
times in the map (because items were inserted with insertMulti(), or times in the map (because items were inserted with insertMulti(), or
unite() was used) occur only once in the returned list. unite() was used) occur only once in the returned list.
\sa keys(), values() \sa QMultiHash::uniqueKeys()
*/ */
/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::keys() const /*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::keys() const
Returns a list containing all the keys in the hash, in an Returns a list containing all the keys in the hash, in an
arbitrary order. Keys that occur multiple times in the hash arbitrary order. Keys that occur multiple times in the hash
(because items were inserted with insertMulti(), or unite() was (because the method is operating on a QMultiHash) also occur
used) also occur multiple times in the list. multiple times in the list.
To obtain a list of unique keys, where each key from the map only
occurs once, use uniqueKeys().
The order is guaranteed to be the same as that used by values(). The order is guaranteed to be the same as that used by values().
\sa uniqueKeys(), values(), key() \sa QMultiMap::uniqueKeys(), values(), key()
*/ */
/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::keys(const T &value) const /*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::keys(const T &value) const
@ -1555,7 +1537,7 @@ uint qHash(long double key, uint seed) noexcept
*/ */
/*! \fn template <class Key, class T> QList<T> QHash<Key, T>::values(const Key &key) const /*! \fn template <class Key, class T> QList<T> QHash<Key, T>::values(const Key &key) const
\obsolete
\overload \overload
Returns a list of all the values associated with the \a key, Returns a list of all the values associated with the \a key,
@ -1592,6 +1574,7 @@ uint qHash(long double key, uint seed) noexcept
*/ */
/*! \fn template <class Key, class T> int QHash<Key, T>::count(const Key &key) const /*! \fn template <class Key, class T> int QHash<Key, T>::count(const Key &key) const
\obsolete
Returns the number of items associated with the \a key. Returns the number of items associated with the \a key.
@ -1803,8 +1786,6 @@ uint qHash(long double key, uint seed) noexcept
If there are multiple items with the \a key, the most If there are multiple items with the \a key, the most
recently inserted item's value is replaced with \a value. recently inserted item's value is replaced with \a value.
\sa insertMulti()
*/ */
/*! \fn template <class Key, class T> void QHash<Key, T>::insert(const QHash &other) /*! \fn template <class Key, class T> void QHash<Key, T>::insert(const QHash &other)
@ -1820,6 +1801,7 @@ uint qHash(long double key, uint seed) noexcept
*/ */
/*! \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::insertMulti(const Key &key, const T &value) /*! \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::insertMulti(const Key &key, const T &value)
\obsolete
Inserts a new item with the \a key and a value of \a value. Inserts a new item with the \a key and a value of \a value.
@ -1828,16 +1810,17 @@ uint qHash(long double key, uint seed) noexcept
different from insert(), which overwrites the value of an different from insert(), which overwrites the value of an
existing item.) existing item.)
This function is obsolete. Use QMultiHash or QMultiMap instead.
\sa insert(), values() \sa insert(), values()
*/ */
/*! \fn template <class Key, class T> QHash &QHash<Key, T>::unite(const QHash &other) /*! \fn template <class Key, class T> QHash &QHash<Key, T>::unite(const QHash &other)
\obsolete
Inserts all the items in the \a other hash into this hash. If a Inserts all the items in the \a other hash into this hash. If a
key is common to both hashes, the resulting hash will contain the key is common to both hashes, the resulting hash will contain the
key multiple times. key multiple times.
\sa insertMulti()
*/ */
/*! \fn template <class Key, class T> bool QHash<Key, T>::empty() const /*! \fn template <class Key, class T> bool QHash<Key, T>::empty() const
@ -1978,10 +1961,7 @@ uint qHash(long double key, uint seed) noexcept
\snippet code/src_corelib_tools_qhash.cpp 17 \snippet code/src_corelib_tools_qhash.cpp 17
Unlike QMap, which orders its items by key, QHash stores its Unlike QMap, which orders its items by key, QHash stores its
items in an arbitrary order. The only guarantee is that items that items in an arbitrary order.
share the same key (because they were inserted using
QHash::insertMulti()) will appear consecutively, from the most
recently to the least recently inserted value.
Let's see a few examples of things we can do with a Let's see a few examples of things we can do with a
QHash::iterator that we cannot do with a QHash::const_iterator. QHash::iterator that we cannot do with a QHash::const_iterator.
@ -2048,7 +2028,7 @@ uint qHash(long double key, uint seed) noexcept
There is no direct way of changing an item's key through an There is no direct way of changing an item's key through an
iterator, although it can be done by calling QHash::erase() iterator, although it can be done by calling QHash::erase()
followed by QHash::insert() or QHash::insertMulti(). followed by QHash::insert().
\sa value() \sa value()
*/ */
@ -2210,7 +2190,7 @@ uint qHash(long double key, uint seed) noexcept
Unlike QMap, which orders its items by key, QHash stores its Unlike QMap, which orders its items by key, QHash stores its
items in an arbitrary order. The only guarantee is that items that items in an arbitrary order. The only guarantee is that items that
share the same key (because they were inserted using share the same key (because they were inserted using
QHash::insertMulti()) will appear consecutively, from the most a QMultiHash) will appear consecutively, from the most
recently to the least recently inserted value. recently to the least recently inserted value.
Multiple iterators can be used on the same hash. However, be aware Multiple iterators can be used on the same hash. However, be aware
@ -2543,18 +2523,22 @@ uint qHash(long double key, uint seed) noexcept
It inherits QHash and extends it with a few convenience functions It inherits QHash and extends it with a few convenience functions
that make it more suitable than QHash for storing multi-valued that make it more suitable than QHash for storing multi-valued
hashes. A multi-valued hash is a hash that allows multiple values hashes. A multi-valued hash is a hash that allows multiple values
with the same key; QHash normally doesn't allow that, unless you with the same key.
call QHash::insertMulti().
Because QMultiHash inherits QHash, all of QHash's functionality also Because QMultiHash inherits QHash, all of QHash's functionality also
applies to QMultiHash. For example, you can use isEmpty() to test applies to QMultiHash. For example, you can use isEmpty() to test
whether the hash is empty, and you can traverse a QMultiHash using whether the hash is empty, and you can traverse a QMultiHash using
QHash's iterator classes (for example, QHashIterator). But in QHash's iterator classes (for example, QHashIterator). But opposed to
addition, it provides an insert() function that corresponds to QHash, it provides an insert() function will allow the insertion of
QHash::insertMulti(), and a replace() function that corresponds to multiple items with the same key. The replace() function corresponds to
QHash::insert(). It also provides convenient operator+() and QHash::insert(). It also provides convenient operator+() and
operator+=(). operator+=().
Unlike QMultiMap, QMultiHash does not provide and ordering of the
inserted items. The only guarantee is that items that
share the same key will appear consecutively, from the most
recently to the least recently inserted value.
Example: Example:
\snippet code/src_corelib_tools_qhash.cpp 24 \snippet code/src_corelib_tools_qhash.cpp 24
@ -2645,7 +2629,8 @@ uint qHash(long double key, uint seed) noexcept
\sa replace() \sa replace()
*/ */
/*! \fn template <class Key, class T> QMultiHash &QMultiHash<Key, T>::operator+=(const QMultiHash &other) /*! \fn template <class Key, class T> QMultiHash &QMultiHash<Key, T>::unite(const QMultiHash &other)
\since 5.13
Inserts all the items in the \a other hash into this hash Inserts all the items in the \a other hash into this hash
and returns a reference to this hash. and returns a reference to this hash.
@ -2653,6 +2638,32 @@ uint qHash(long double key, uint seed) noexcept
\sa insert() \sa insert()
*/ */
/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::uniqueKeys() const
\since 5.13
Returns a list containing all the keys in the map. Keys that occur multiple
times in the map occur only once in the returned list.
\sa keys(), values()
*/
/*! \fn template <class Key, class T> QList<T> QMultiHash<Key, T>::values(const Key &key) const
\overload
Returns a list of all the values associated with the \a key,
from the most recently inserted to the least recently inserted.
\sa count(), insert()
*/
/*! \fn template <class Key, class T> QMultiHash &QMultiHash<Key, T>::operator+=(const QMultiHash &other)
Inserts all the items in the \a other hash into this hash
and returns a reference to this hash.
\sa unit(), insert()
*/
/*! \fn template <class Key, class T> QMultiHash QMultiHash<Key, T>::operator+(const QMultiHash &other) const /*! \fn template <class Key, class T> QMultiHash QMultiHash<Key, T>::operator+(const QMultiHash &other) const
Returns a hash that contains all the items in this hash in Returns a hash that contains all the items in this hash in
@ -2682,6 +2693,13 @@ uint qHash(long double key, uint seed) noexcept
\sa QHash::remove() \sa QHash::remove()
*/ */
/*! \fn template <class Key, class T> int QMultiHash<Key, T>::count(const Key &key) const
Returns the number of items associated with the \a key.
\sa contains(), insert()
*/
/*! /*!
\fn template <class Key, class T> int QMultiHash<Key, T>::count(const Key &key, const T &value) const \fn template <class Key, class T> int QMultiHash<Key, T>::count(const Key &key, const T &value) const
\since 4.3 \since 4.3

View File

@ -308,12 +308,14 @@ public:
T &operator[](const Key &key); T &operator[](const Key &key);
const T operator[](const Key &key) const; const T operator[](const Key &key) const;
QList<Key> uniqueKeys() const;
QList<Key> keys() const; QList<Key> keys() const;
QList<Key> keys(const T &value) const; QList<Key> keys(const T &value) const;
QList<T> values() const; QList<T> values() const;
QList<T> values(const Key &key) const; #if QT_DEPRECATED_SINCE(5, 15)
int count(const Key &key) const; QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") QList<Key> uniqueKeys() const;
QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") QList<T> values(const Key &key) const;
QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") int count(const Key &key) const;
#endif
class const_iterator; class const_iterator;
@ -388,6 +390,7 @@ public:
{ {
friend class iterator; friend class iterator;
friend class QHash<Key, T>; friend class QHash<Key, T>;
friend class QMultiHash<Key, T>;
friend class QSet<Key>; friend class QSet<Key>;
QHashData::Node *i; QHashData::Node *i;
@ -527,8 +530,10 @@ public:
const_iterator constFind(const Key &key) const; const_iterator constFind(const Key &key) const;
iterator insert(const Key &key, const T &value); iterator insert(const Key &key, const T &value);
void insert(const QHash &hash); void insert(const QHash &hash);
iterator insertMulti(const Key &key, const T &value); #if QT_DEPRECATED_SINCE(5, 15)
QHash &unite(const QHash &other); QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") iterator insertMulti(const Key &key, const T &value);
QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") QHash &unite(const QHash &other);
#endif
// STL compatibility // STL compatibility
typedef T mapped_type; typedef T mapped_type;
@ -570,6 +575,7 @@ private:
#endif #endif
} }
friend class QSet<Key>; friend class QSet<Key>;
friend class QMultiHash<Key, T>;
}; };
@ -607,38 +613,6 @@ QHash<Key, T>::createNode(uint ah, const Key &akey, const T &avalue, Node **anex
return node; return node;
} }
template <class Key, class T>
Q_INLINE_TEMPLATE QHash<Key, T> &QHash<Key, T>::unite(const QHash &other)
{
if (d == &QHashData::shared_null) {
*this = other;
} else {
#if QT_DEPRECATED_SINCE(5, 15)
QHash copy(other);
const_iterator it = copy.constEnd();
while (it != copy.constBegin()) {
it.i = QHashData::previousNode(it.i);
insertMulti(it.key(), it.value());
}
#else
QHash copy(other);
const_iterator it = copy.cbegin();
const const_iterator end = copy.cend();
while (it != end) {
const auto rangeStart = it++;
while (it != end && rangeStart.key() == it.key())
++it;
const qint64 last = std::distance(rangeStart, it) - 1;
for (qint64 i = last; i >= 0; --i) {
auto next = std::next(rangeStart, i);
insertMulti(next.key(), next.value());
}
}
#endif
}
return *this;
}
template <class Key, class T> template <class Key, class T>
Q_OUTOFLINE_TEMPLATE void QHash<Key, T>::freeData(QHashData *x) Q_OUTOFLINE_TEMPLATE void QHash<Key, T>::freeData(QHashData *x)
{ {
@ -697,26 +671,6 @@ Q_INLINE_TEMPLATE const T QHash<Key, T>::value(const Key &akey, const T &adefaul
} }
} }
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::uniqueKeys() const
{
QList<Key> res;
res.reserve(size()); // May be too much, but assume short lifetime
const_iterator i = begin();
if (i != end()) {
for (;;) {
const Key &aKey = i.key();
res.append(aKey);
do {
if (++i == end())
goto break_out_of_outer_loop;
} while (aKey == i.key());
}
}
break_out_of_outer_loop:
return res;
}
template <class Key, class T> template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::keys() const Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::keys() const
{ {
@ -775,32 +729,6 @@ Q_OUTOFLINE_TEMPLATE QList<T> QHash<Key, T>::values() const
return res; return res;
} }
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<T> QHash<Key, T>::values(const Key &akey) const
{
QList<T> res;
Node *node = *findNode(akey);
if (node != e) {
do {
res.append(node->value);
} while ((node = node->next) != e && node->key == akey);
}
return res;
}
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE int QHash<Key, T>::count(const Key &akey) const
{
int cnt = 0;
Node *node = *findNode(akey);
if (node != e) {
do {
++cnt;
} while ((node = node->next) != e && node->key == akey);
}
return cnt;
}
template <class Key, class T> template <class Key, class T>
Q_INLINE_TEMPLATE const T QHash<Key, T>::operator[](const Key &akey) const Q_INLINE_TEMPLATE const T QHash<Key, T>::operator[](const Key &akey) const
{ {
@ -866,18 +794,6 @@ Q_INLINE_TEMPLATE void QHash<Key, T>::insert(const QHash &hash)
} }
} }
template <class Key, class T>
Q_INLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::insertMulti(const Key &akey,
const T &avalue)
{
detach();
d->willGrow();
uint h;
Node **nextNode = findNode(akey, &h);
return iterator(createNode(h, akey, avalue, nextNode));
}
template <class Key, class T> template <class Key, class T>
Q_OUTOFLINE_TEMPLATE int QHash<Key, T>::remove(const Key &akey) Q_OUTOFLINE_TEMPLATE int QHash<Key, T>::remove(const Key &akey)
{ {
@ -1128,11 +1044,12 @@ public:
inline typename QHash<Key, T>::iterator replace(const Key &key, const T &value) inline typename QHash<Key, T>::iterator replace(const Key &key, const T &value)
{ return QHash<Key, T>::insert(key, value); } { return QHash<Key, T>::insert(key, value); }
inline typename QHash<Key, T>::iterator insert(const Key &key, const T &value) typename QHash<Key, T>::iterator insert(const Key &key, const T &value);
{ return QHash<Key, T>::insertMulti(key, value); }
inline QMultiHash &unite(const QMultiHash &other);
inline QMultiHash &operator+=(const QMultiHash &other) inline QMultiHash &operator+=(const QMultiHash &other)
{ this->unite(other); return *this; } { return unite(other); }
inline QMultiHash operator+(const QMultiHash &other) const inline QMultiHash operator+(const QMultiHash &other) const
{ QMultiHash result = *this; result += other; return result; } { QMultiHash result = *this; result += other; return result; }
@ -1141,13 +1058,27 @@ public:
using QHash<Key, T>::count; using QHash<Key, T>::count;
using QHash<Key, T>::find; using QHash<Key, T>::find;
using QHash<Key, T>::constFind; using QHash<Key, T>::constFind;
using QHash<Key, T>::values;
using QHash<Key, T>::findNode;
using QHash<Key, T>::createNode;
using QHash<Key, T>::concrete;
using QHash<Key, T>::detach;
using typename QHash<Key, T>::Node;
using typename QHash<Key, T>::iterator;
using typename QHash<Key, T>::const_iterator;
bool contains(const Key &key, const T &value) const; bool contains(const Key &key, const T &value) const;
int remove(const Key &key, const T &value); int remove(const Key &key, const T &value);
int count(const Key &key) const;
int count(const Key &key, const T &value) const; int count(const Key &key, const T &value) const;
QList<Key> uniqueKeys() const;
QList<T> values(const Key &akey) const;
typename QHash<Key, T>::iterator find(const Key &key, const T &value) { typename QHash<Key, T>::iterator find(const Key &key, const T &value) {
typename QHash<Key, T>::iterator i(find(key)); typename QHash<Key, T>::iterator i(find(key));
typename QHash<Key, T>::iterator end(this->end()); typename QHash<Key, T>::iterator end(this->end());
@ -1175,6 +1106,50 @@ private:
const T operator[](const Key &key) const; const T operator[](const Key &key) const;
}; };
template <class Key, class T>
Q_INLINE_TEMPLATE typename QHash<Key, T>::iterator QMultiHash<Key, T>::insert(const Key &akey, const T &avalue)
{
detach();
this->d->willGrow();
uint h;
Node **nextNode = findNode(akey, &h);
return iterator(createNode(h, akey, avalue, nextNode));
}
template <class Key, class T>
Q_INLINE_TEMPLATE QMultiHash<Key, T> &QMultiHash<Key, T>::unite(const QMultiHash &other)
{
if (this->d == &QHashData::shared_null) {
*this = other;
} else {
#if QT_DEPRECATED_SINCE(5, 15)
QMultiHash copy(other);
const_iterator it = copy.constEnd();
while (it != copy.constBegin()) {
it.i = QHashData::previousNode(it.i);
insert(it.key(), it.value());
}
#else
const QMultiHash copy(other);
const_iterator it = copy.cbegin();
const const_iterator end = copy.cend();
while (it != end) {
const auto rangeStart = it++;
while (it != end && rangeStart.key() == it.key())
++it;
const qint64 last = std::distance(rangeStart, it) - 1;
for (qint64 i = last; i >= 0; --i) {
auto next = std::next(rangeStart, i);
insert(next.key(), next.value());
}
}
#endif
}
return *this;
}
template <class Key, class T> template <class Key, class T>
Q_INLINE_TEMPLATE bool QMultiHash<Key, T>::contains(const Key &key, const T &value) const Q_INLINE_TEMPLATE bool QMultiHash<Key, T>::contains(const Key &key, const T &value) const
{ {
@ -1212,7 +1187,84 @@ Q_INLINE_TEMPLATE int QMultiHash<Key, T>::count(const Key &key, const T &value)
return n; return n;
} }
template<class Key, class T> template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<Key> QMultiHash<Key, T>::uniqueKeys() const
{
QList<Key> res;
res.reserve(QHash<Key, T>::size()); // May be too much, but assume short lifetime
typename QHash<Key, T>::const_iterator i = QHash<Key, T>::begin();
if (i != QHash<Key, T>::end()) {
for (;;) {
const Key &aKey = i.key();
res.append(aKey);
do {
if (++i == QHash<Key, T>::end())
goto break_out_of_outer_loop;
} while (aKey == i.key());
}
}
break_out_of_outer_loop:
return res;
}
#if QT_DEPRECATED_SINCE(5, 15)
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::insertMulti(const Key &key, const T &value) {
return static_cast<QMultiHash<Key, T> *>(this)->insert(key, value);
}
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QHash<Key, T> &QHash<Key, T>::unite(const QHash &other) {
return static_cast<QMultiHash<Key, T> *>(this)->unite(other);
}
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<T> QHash<Key, T>::values(const Key &akey) const
{
return static_cast<const QMultiHash<Key, T> *>(this)->values(akey);
}
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE int QHash<Key, T>::count(const Key &akey) const
{
return static_cast<const QMultiHash<Key, T> *>(this)->count(akey);
}
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::uniqueKeys() const
{
return static_cast<const QMultiHash<Key, T> *>(this)->uniqueKeys();
}
#endif
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<T> QMultiHash<Key, T>::values(const Key &akey) const
{
QList<T> res;
Node *node = *findNode(akey);
if (node != this->e) {
do {
res.append(node->value);
} while ((node = node->next) != this->e && node->key == akey);
}
return res;
}
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE int QMultiHash<Key, T>::count(const Key &akey) const
{
int cnt = 0;
Node *node = *findNode(akey);
if (node != this->e) {
do {
++cnt;
} while ((node = node->next) != this->e && node->key == akey);
}
return cnt;
}
template <class Key, class T>
class QHashIterator class QHashIterator
{ {
typedef typename QHash<Key, T>::const_iterator const_iterator; typedef typename QHash<Key, T>::const_iterator const_iterator;

View File

@ -370,7 +370,7 @@ inline const QDBusArgument &operator>>(const QDBusArgument &arg, QHash<Key, T> &
T value; T value;
arg.beginMapEntry(); arg.beginMapEntry();
arg >> key >> value; arg >> key >> value;
map.insertMulti(key, value); static_cast<QMultiHash<Key, T> &>(map).insert(key, value);
arg.endMapEntry(); arg.endMapEntry();
} }
arg.endMap(); arg.endMap();