QMultiMap: add constructors from QMap
We can provide those. They don't lose information, do not have the problem we face at offering ranged constructors (namely the order of duplicate keys), and have a distinct advantage over ranged constructors: a non-shared rvalue QMap can be "upgraded" to a QMultiMap without allocating memory for the multimap. Change-Id: Ic23c83927c05a210bc1f0050006c9f26365d3916 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>bb10
parent
046ad5a442
commit
7406a8b45a
|
|
@ -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))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue