diff options
-rw-r--r-- | src/corelib/tools/qmap.h | 31 | ||||
-rw-r--r-- | src/corelib/tools/qmultimap.qdoc | 13 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h index afc4ca37c4..65b3ba55db 100644 --- a/src/corelib/tools/qmap.h +++ b/src/corelib/tools/qmap.h @@ -220,6 +220,8 @@ class QMap using MapData = QMapData<std::map<Key, T>>; QtPrivate::QExplicitlySharedDataPointerV2<MapData> d; + friend class QMultiMap<Key, T>; + public: using key_type = Key; using mapped_type = T; @@ -778,6 +780,35 @@ public: qSwap(d, other.d); } + explicit QMultiMap(const QMap<Key, T> &other) + : d(other.isEmpty() ? nullptr : new MapData) + { + if (d) { + Q_ASSERT(other.d); + d->m.insert(other.d->m.begin(), + other.d->m.end()); + } + } + + explicit QMultiMap(QMap<Key, T> &&other) + : d(other.isEmpty() ? nullptr : new MapData) + { + if (d) { + Q_ASSERT(other.d); + if (other.d.isShared()) { + d->m.insert(other.d->m.begin(), + other.d->m.end()); + } else { +#ifdef __cpp_lib_node_extract + d->m.merge(std::move(other.d->m)); +#else + d->m.insert(std::make_move_iterator(other.d->m.begin()), + std::make_move_iterator(other.d->m.end())); +#endif + } + } + } + explicit QMultiMap(const std::multimap<Key, T> &other) : d(other.empty() ? nullptr : new MapData(other)) { diff --git a/src/corelib/tools/qmultimap.qdoc b/src/corelib/tools/qmultimap.qdoc index 0de4a6c8fd..9db495db1e 100644 --- a/src/corelib/tools/qmultimap.qdoc +++ b/src/corelib/tools/qmultimap.qdoc @@ -214,6 +214,19 @@ initializer list \a list. */ +/*! \fn template <class Key, class T> QMultiMap<Key, T>::QMultiMap(const QMap<Key, T> &other) + \since 6.0 + + Constructs a multi map as a copy of \a other. +*/ + +/*! \fn template <class Key, class T> QMultiMap<Key, T>::QMultiMap(QMap<Key, T> &&other) + \since 6.0 + + If \a other is shared, constructs a multi map as a copy of \a other. + Otherwise, constructs a multi map by moving the elements from \a other. +*/ + /*! \fn template <class Key, class T> QMultiMap<Key, T>::QMultiMap(const std::multimap<Key, T> &other) Constructs a copy of \a other. |