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>; QtPrivate::QExplicitlySharedDataPointerV2 d; + friend class QMultiMap; + public: using key_type = Key; using mapped_type = T; @@ -778,6 +780,35 @@ public: qSwap(d, other.d); } + explicit QMultiMap(const QMap &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 &&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 &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 QMultiMap::QMultiMap(const QMap &other) + \since 6.0 + + Constructs a multi map as a copy of \a other. +*/ + +/*! \fn template QMultiMap::QMultiMap(QMap &&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 QMultiMap::QMultiMap(const std::multimap &other) Constructs a copy of \a other.