298 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
300 friend class QMultiMap<
Key,
T>;
320 insert(p.first, p.second);
323 explicit QMap(
const std::map<Key, T> &other)
328 explicit QMap(std::map<Key, T> &&other)
346 return std::move(d->m);
354 template <
typename AKey = Key,
typename AT = T,
355 QTypeTraits::compare_eq_result_container<QMap, AKey, AT> =
true>
363 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
365 QT_DECLARE_EQUALITY_OPERATORS_HELPER(
QMap,
QMap, ,
noexcept(
false),
366 template <
typename AKey = Key,
typename AT = T,
367 QTypeTraits::compare_eq_result_container<QMap, AKey, AT> =
true>)
369 template <
typename AKey =
Key,
typename AT =
T,
379 template <
typename AKey =
Key,
typename AT =
T,
496#ifdef __cpp_lib_node_extract
597 friend class QMap<Key, T>;
598 friend class const_iterator;
600 typename Map::iterator i;
601 explicit iterator(
typename Map::iterator it) : i(it) {}
603 using iterator_category =
std::bidirectional_iterator_tag;
604 using difference_type = qptrdiff;
605 using value_type = T;
607 using reference = T &;
609 iterator() =
default;
611 const Key &key()
const {
return i->first; }
612 T &value()
const {
return i->second; }
613 T &operator*()
const {
return i->second; }
614 T *operator->()
const {
return &i->second; }
615 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
616 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
618 iterator &operator++()
623 iterator operator++(
int)
629 iterator &operator--()
634 iterator operator--(
int)
641#if QT_DEPRECATED_SINCE(6
, 0
)
642 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
644 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
646 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
648 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
650 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
651 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
653 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
654 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
656 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
658 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
660 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
662 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
668 friend class QMap<Key, T>;
669 typename Map::const_iterator i;
670 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
673 using iterator_category =
std::bidirectional_iterator_tag;
674 using difference_type = qptrdiff;
675 using value_type = T;
676 using pointer =
const T *;
677 using reference =
const T &;
679 const_iterator() =
default;
680 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
682 const Key &key()
const {
return i->first; }
683 const T &value()
const {
return i->second; }
684 const T &operator*()
const {
return i->second; }
685 const T *operator->()
const {
return &i->second; }
686 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
687 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
689 const_iterator &operator++()
694 const_iterator operator++(
int)
696 const_iterator r = *
this;
700 const_iterator &operator--()
705 const_iterator operator--(
int)
707 const_iterator r = *
this;
712#if QT_DEPRECATED_SINCE(6
, 0
)
713 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
715 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
717 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
719 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
721 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
722 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
724 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
725 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
727 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
729 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
731 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
733 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
742 typedef typename const_iterator::iterator_category iterator_category;
743 typedef typename const_iterator::difference_type difference_type;
744 typedef Key value_type;
745 typedef const Key *pointer;
746 typedef const Key &reference;
748 key_iterator() =
default;
749 explicit key_iterator(const_iterator o) : i(o) { }
751 const Key &operator*()
const {
return i.key(); }
752 const Key *operator->()
const {
return &i.key(); }
753 bool operator==(key_iterator o)
const {
return i == o.i; }
754 bool operator!=(key_iterator o)
const {
return i != o.i; }
756 inline key_iterator &operator++() { ++i;
return *
this; }
757 inline key_iterator operator++(
int) {
return key_iterator(i++);}
758 inline key_iterator &operator--() { --i;
return *
this; }
759 inline key_iterator operator--(
int) {
return key_iterator(i--); }
760 const_iterator base()
const {
return i; }
763 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
764 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
767 iterator begin() { detach();
return iterator(d->m.begin()); }
768 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
769 const_iterator constBegin()
const {
return begin(); }
770 const_iterator cbegin()
const {
return begin(); }
771 iterator end() { detach();
return iterator(d->m.end()); }
772 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
773 const_iterator constEnd()
const {
return end(); }
774 const_iterator cend()
const {
return end(); }
775 key_iterator keyBegin()
const {
return key_iterator(begin()); }
776 key_iterator keyEnd()
const {
return key_iterator(end()); }
777 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
778 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
779 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
780 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
781 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
782 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
783 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMap &>(*
this); }
784 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMap &>(*
this); }
785 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
786 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
788 iterator erase(const_iterator it)
790 return erase(it,
std::next(it));
793 iterator erase(const_iterator afirst, const_iterator alast)
799 return iterator(d->m.erase(afirst.i, alast.i));
801 auto result = d->erase(afirst.i, alast.i);
802 d.reset(result.data);
803 return iterator(result.it);
807 typedef iterator Iterator;
808 typedef const_iterator ConstIterator;
810 iterator find(
const Key &key)
812 const auto hold = referenceHoldingDetach();
813 return iterator(d->m.find(key));
816 const_iterator find(
const Key &key)
const
819 return const_iterator();
820 return const_iterator(d->m.find(key));
823 const_iterator constFind(
const Key &key)
const
828 iterator lowerBound(
const Key &key)
830 const auto hold = referenceHoldingDetach();
831 return iterator(d->m.lower_bound(key));
834 const_iterator lowerBound(
const Key &key)
const
837 return const_iterator();
838 return const_iterator(d->m.lower_bound(key));
841 iterator upperBound(
const Key &key)
843 const auto hold = referenceHoldingDetach();
844 return iterator(d->m.upper_bound(key));
847 const_iterator upperBound(
const Key &key)
const
850 return const_iterator();
851 return const_iterator(d->m.upper_bound(key));
854 iterator insert(
const Key &key,
const T &value)
856 const auto hold = referenceHoldingDetachExcept(key);
857 return iterator(d->m.insert_or_assign(key, value).first);
860 iterator insert(const_iterator pos,
const Key &key,
const T &value)
864 return iterator(d->m.emplace(key, value).first);
865 }
else if (d.isShared()) {
866 auto posDistance =
std::distance(d->m.cbegin(), pos.i);
867 const auto hold = referenceHoldingDetachExcept(key);
868 auto dpos =
std::next(d->m.cbegin(), posDistance);
869 return iterator(d->m.insert_or_assign(dpos, key, value));
871 return iterator(d->m.insert_or_assign(pos.i, key, value));
874 void insert(
const QMap<Key, T> &map)
885 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newD(
new MapData);
886 const auto commit = qScopeGuard([&] { newD.swap(d); });
887 newD->fillWithMergeOf(d->m, map.d->m);
891#ifdef __cpp_lib_node_extract
893 auto copy = map.d->m;
895 d->m = std::move(copy);
897 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newD(
new MapData);
898 const auto commit = qScopeGuard([&] { newD.swap(d); });
899 newD->fillWithMergeOf(d->m, map.d->m);
904 void insert(
QMap<Key, T> &&map)
906 if (map.isEmpty() || map.d.isShared()) {
913 const auto commit = qScopeGuard([&] { map
.swap(*
this); });
918 map.d->insertMap(d->m);
922#ifdef __cpp_lib_node_extract
923 map.d->m.merge(
std::move(d->m));
926 map.d->insertMap(d->m);
932 inline bool empty()
const
937 std::pair<iterator, iterator> equal_range(
const Key &akey)
939 const auto hold = referenceHoldingDetach();
940 auto result = d->m.equal_range(akey);
941 return {iterator(result.first), iterator(result.second)};
944 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
948 auto result = d->m.equal_range(akey);
949 return {const_iterator(result.first), const_iterator(result.second)};
956# if defined(Q_CC_GHS) || defined (Q_CC_MSVC)
966 qHash(
const M &key, size_t seed = 0)
972 return std::accumulate(key.d->m.begin(), key.d->m.end(), seed,
973 QtPrivate::QHashCombine{seed});
995 using Map = std::multimap<Key, T>;
996 using MapData = QMapData<Map>;
997 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
1000 using key_type = Key;
1001 using mapped_type = T;
1002 using difference_type = qptrdiff;
1003 using size_type = qsizetype;
1005 QMultiMap() =
default;
1009 QMultiMap(std::initializer_list<std::pair<Key,T>> list)
1011 for (
auto &p : list)
1012 insert(p.first, p.second);
1015 void swap(QMultiMap<Key, T> &other)
noexcept
1020 explicit QMultiMap(
const QMap<Key, T> &other)
1021 : d(other.isEmpty() ?
nullptr :
new MapData)
1025 d->m.insert(other.d->m.begin(),
1030 explicit QMultiMap(QMap<Key, T> &&other)
1031 : d(other.isEmpty() ?
nullptr :
new MapData)
1035 if (other.d.isShared()) {
1036 d->m.insert(other.d->m.begin(),
1039#ifdef __cpp_lib_node_extract
1040 d->m.merge(std::move(other.d->m));
1042 d->m.insert(std::make_move_iterator(other.d->m.begin()),
1043 std::make_move_iterator(other.d->m.end()));
1049 explicit QMultiMap(
const std::multimap<Key, T> &other)
1050 : d(other.empty() ?
nullptr :
new MapData(other))
1054 explicit QMultiMap(std::multimap<Key, T> &&other)
1055 : d(other.empty() ?
nullptr :
new MapData(std::move(other)))
1060 Q_DECL_DEPRECATED_X(
"Use toStdMultiMap instead")
1061 std::multimap<Key, T> toStdMap()
const
1063 return toStdMultiMap();
1066 std::multimap<Key, T> toStdMultiMap()
const &
1073 std::multimap<Key, T> toStdMultiMap() &&
1079 return std::move(d->m);
1087 template <
typename AKey = Key,
typename AT = T,
1088 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>
1089 friend bool comparesEqual(
const QMultiMap &lhs,
const QMultiMap &rhs)
1096 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
1098 QT_DECLARE_EQUALITY_OPERATORS_HELPER(QMultiMap, QMultiMap, ,
noexcept(
false),
1099 template <
typename AKey = Key,
typename AT = T,
1100 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>)
1102 template <
typename AKey = Key,
typename AT = T,
1103 QtPrivate::if_map_has_relational_operators<QMultiMap, AKey, AT> =
true>
1104 friend auto compareThreeWay(
const QMultiMap &lhs,
const QMultiMap &rhs)
1106 return QtOrderingPrivate::lexicographicalCompareThreeWay(lhs.constKeyValueBegin(),
1107 lhs.constKeyValueEnd(),
1108 rhs.constKeyValueBegin(),
1109 rhs.constKeyValueEnd());
1111 QT_DECLARE_ORDERING_HELPER_AUTO(QMultiMap, QMultiMap, ,
noexcept(
false),
1112 template <
typename AKey = Key,
typename AT = T,
1113 QtPrivate::if_map_has_relational_operators<QMultiMap, AKey, AT> =
true>)
1116 friend bool operator==(
const QMultiMap &lhs,
const QMultiMap &rhs);
1117 friend bool operator!=(
const QMultiMap &lhs,
const QMultiMap &rhs);
1118 friend bool operator<(
const QMultiMap &lhs,
const QMultiMap &rhs);
1119 friend bool operator>(
const QMultiMap &lhs,
const QMultiMap &rhs);
1120 friend bool operator<=(
const QMultiMap &lhs,
const QMultiMap &rhs);
1121 friend bool operator>=(
const QMultiMap &lhs,
const QMultiMap &rhs);
1122 friend auto operator<=>(
const QMultiMap &lhs,
const QMultiMap &rhs);
1125 size_type size()
const {
return d ? size_type(d->m.size()) : size_type(0); }
1128 bool isEmpty()
const {
return d ? d->m.empty() :
true; }
1135 d.reset(
new MapData);
1140 [[nodiscard]] QMultiMap referenceHoldingDetach()
1143 d.reset(
new MapData);
1144 }
else if (d.isShared()) {
1153 [[nodiscard]] QMultiMap referenceHoldingDetachExceptFor(
const typename Map::iterator &skipit)
1155 Q_ASSERT(d.isShared());
1157 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newData(
new MapData);
1158 newData->copyExceptFor(d->m, skipit);
1163 bool isDetached()
const noexcept
1165 return d ? !d.isShared() :
false;
1168 bool isSharedWith(
const QMultiMap<Key, T> &other)
const noexcept
1170 return d == other.d;
1184 size_type remove(
const Key &key)
1190 return size_type(d->m.erase(key));
1192 MapData *newData =
new MapData;
1193 size_type result = newData->copyIfNotEquivalentTo(d->m, key).count;
1200 size_type remove(
const Key &key,
const T &value)
1205 size_type result = 0;
1206 const auto &keyCompare = d->m.key_comp();
1209 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newData(
new MapData);
1210 const auto keep = [&newData](
auto it) { newData->m.insert(newData->m.cend(), *it); };
1212 auto it = d->m.cbegin();
1213 const auto end = d->m.cend();
1214 for (; it != end && keyCompare(it->first, key); ++it)
1217 for (; it != end && !keyCompare(key, it->first); ++it) {
1218 if (!(it->second == value))
1223 for (; it != end; ++it)
1232 auto [i, e] = d->m.equal_range(key);
1238 const T valueCopy = value;
1240 if (i->second == valueCopy) {
1251 template <
typename Predicate>
1252 size_type removeIf(Predicate pred)
1254 return QtPrivate::associative_erase_if(*
this, pred);
1257 T take(
const Key &key)
1263 auto i = d->m.find(key);
1264 const auto hold = referenceHoldingDetachExceptFor(i);
1268#ifdef __cpp_lib_node_extract
1269 if (
const auto node = d->m.extract(key))
1270 return std::move(node.mapped());
1272 auto i = d->m.find(key);
1273 if (i != d->m.end()) {
1275 T result(std::move(i->second));
1283 bool contains(
const Key &key)
const
1287 auto i = d->m.find(key);
1288 return i != d->m.end();
1291 bool contains(
const Key &key,
const T &value)
const
1293 return find(key, value) != end();
1296 Key key(
const T &value,
const Key &defaultKey = Key())
const
1301 return d->key(value, defaultKey);
1304 T value(
const Key &key,
const T &defaultValue = T())
const
1307 return defaultValue;
1308 const auto i = d->m.find(key);
1309 if (i != d->m.cend())
1311 return defaultValue;
1314 QList<Key> keys()
const
1321 QList<Key> keys(
const T &value)
const
1325 return d->keys(value);
1328 QList<Key> uniqueKeys()
const
1334 result.reserve(size());
1336 std::unique_copy(keyBegin(), keyEnd(),
1337 std::back_inserter(result));
1339 result.shrink_to_fit();
1343 QList<T> values()
const
1350 QList<T> values(
const Key &key)
const
1353 const auto range = equal_range(key);
1354 result.reserve(std::distance(range.first, range.second));
1355 std::copy(range.first, range.second, std::back_inserter(result));
1359 size_type count(
const Key &key)
const
1363 return d->count(key);
1366 size_type count(
const Key &key,
const T &value)
const
1372 auto range = d->m.equal_range(key);
1374 return size_type(std::count_if(range.first,
1376 MapData::valueIsEqualTo(value)));
1379 inline const Key &firstKey()
const { Q_ASSERT(!isEmpty());
return constBegin().key(); }
1380 inline const Key &lastKey()
const { Q_ASSERT(!isEmpty());
return std::next(constEnd(), -1).key(); }
1382 inline T &first() { Q_ASSERT(!isEmpty());
return *begin(); }
1383 inline const T &first()
const { Q_ASSERT(!isEmpty());
return *constBegin(); }
1384 inline T &last() { Q_ASSERT(!isEmpty());
return *std::next(end(), -1); }
1385 inline const T &last()
const { Q_ASSERT(!isEmpty());
return *std::next(constEnd(), -1); }
1387 class const_iterator;
1391 friend class QMultiMap<Key, T>;
1392 friend class const_iterator;
1394 typename Map::iterator i;
1395 explicit iterator(
typename Map::iterator it) : i(it) {}
1397 using iterator_category = std::bidirectional_iterator_tag;
1398 using difference_type = qptrdiff;
1399 using value_type = T;
1400 using pointer = T *;
1401 using reference = T &;
1403 iterator() =
default;
1405 const Key &key()
const {
return i->first; }
1406 T &value()
const {
return i->second; }
1407 T &operator*()
const {
return i->second; }
1408 T *operator->()
const {
return &i->second; }
1409 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
1410 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
1412 iterator &operator++()
1417 iterator operator++(
int)
1423 iterator &operator--()
1428 iterator operator--(
int)
1435#if QT_DEPRECATED_SINCE(6
, 0
)
1436 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1438 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
1440 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1442 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
1444 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1445 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1447 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1448 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1450 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1452 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
1454 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1456 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
1460 class const_iterator
1462 friend class QMultiMap<Key, T>;
1463 typename Map::const_iterator i;
1464 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
1467 using iterator_category = std::bidirectional_iterator_tag;
1468 using difference_type = qptrdiff;
1469 using value_type = T;
1470 using pointer =
const T *;
1471 using reference =
const T &;
1473 const_iterator() =
default;
1474 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
1476 const Key &key()
const {
return i->first; }
1477 const T &value()
const {
return i->second; }
1478 const T &operator*()
const {
return i->second; }
1479 const T *operator->()
const {
return &i->second; }
1480 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
1481 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
1483 const_iterator &operator++()
1488 const_iterator operator++(
int)
1490 const_iterator r = *
this;
1494 const_iterator &operator--()
1499 const_iterator operator--(
int)
1501 const_iterator r = *
this;
1506#if QT_DEPRECATED_SINCE(6
, 0
)
1507 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1509 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
1511 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1513 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
1515 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1516 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1518 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1519 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1521 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1523 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
1525 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1527 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
1536 typedef typename const_iterator::iterator_category iterator_category;
1537 typedef typename const_iterator::difference_type difference_type;
1538 typedef Key value_type;
1539 typedef const Key *pointer;
1540 typedef const Key &reference;
1542 key_iterator() =
default;
1543 explicit key_iterator(const_iterator o) : i(o) { }
1545 const Key &operator*()
const {
return i.key(); }
1546 const Key *operator->()
const {
return &i.key(); }
1547 bool operator==(key_iterator o)
const {
return i == o.i; }
1548 bool operator!=(key_iterator o)
const {
return i != o.i; }
1550 inline key_iterator &operator++() { ++i;
return *
this; }
1551 inline key_iterator operator++(
int) {
return key_iterator(i++);}
1552 inline key_iterator &operator--() { --i;
return *
this; }
1553 inline key_iterator operator--(
int) {
return key_iterator(i--); }
1554 const_iterator base()
const {
return i; }
1557 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
1558 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
1561 iterator begin() { detach();
return iterator(d->m.begin()); }
1562 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
1563 const_iterator constBegin()
const {
return begin(); }
1564 const_iterator cbegin()
const {
return begin(); }
1565 iterator end() { detach();
return iterator(d->m.end()); }
1566 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
1567 const_iterator constEnd()
const {
return end(); }
1568 const_iterator cend()
const {
return end(); }
1569 key_iterator keyBegin()
const {
return key_iterator(begin()); }
1570 key_iterator keyEnd()
const {
return key_iterator(end()); }
1571 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
1572 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
1573 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
1574 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
1575 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
1576 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
1577 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMultiMap &>(*
this); }
1578 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMultiMap &>(*
this); }
1579 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1580 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1582 iterator erase(const_iterator it)
1584 return erase(it, std::next(it));
1587 iterator erase(const_iterator afirst, const_iterator alast)
1593 return iterator(d->m.erase(afirst.i, alast.i));
1595 auto result = d->erase(afirst.i, alast.i);
1596 d.reset(result.data);
1597 return iterator(result.it);
1601 typedef iterator Iterator;
1602 typedef const_iterator ConstIterator;
1604 size_type count()
const
1609 iterator find(
const Key &key)
1611 const auto hold = referenceHoldingDetach();
1612 return iterator(d->m.find(key));
1615 const_iterator find(
const Key &key)
const
1618 return const_iterator();
1619 return const_iterator(d->m.find(key));
1622 const_iterator constFind(
const Key &key)
const
1627 iterator find(
const Key &key,
const T &value)
1629 const auto hold = referenceHoldingDetach();
1631 auto range = d->m.equal_range(key);
1632 auto i = std::find_if(range.first, range.second,
1633 MapData::valueIsEqualTo(value));
1635 if (i != range.second)
1637 return iterator(d->m.end());
1640 const_iterator find(
const Key &key,
const T &value)
const
1643 return const_iterator();
1645 auto range = d->m.equal_range(key);
1646 auto i = std::find_if(range.first, range.second,
1647 MapData::valueIsEqualTo(value));
1649 if (i != range.second)
1650 return const_iterator(i);
1651 return const_iterator(d->m.end());
1654 const_iterator constFind(
const Key &key,
const T &value)
const
1656 return find(key, value);
1659 iterator lowerBound(
const Key &key)
1661 const auto hold = referenceHoldingDetach();
1662 return iterator(d->m.lower_bound(key));
1665 const_iterator lowerBound(
const Key &key)
const
1668 return const_iterator();
1669 return const_iterator(d->m.lower_bound(key));
1672 iterator upperBound(
const Key &key)
1674 const auto hold = referenceHoldingDetach();
1675 return iterator(d->m.upper_bound(key));
1678 const_iterator upperBound(
const Key &key)
const
1681 return const_iterator();
1682 return const_iterator(d->m.upper_bound(key));
1685 iterator insert(
const Key &key,
const T &value)
1687 const auto hold = referenceHoldingDetach();
1690 auto i = d->m.lower_bound(key);
1691 return iterator(d->m.insert(i, {key, value}));
1694 iterator insert(const_iterator pos,
const Key &key,
const T &value)
1697 d.reset(
new MapData);
1698 return iterator(d->m.insert({ key, value }));
1699 }
else if (d.isShared()) {
1700 auto posDistance = std::distance(d->m.cbegin(), pos.i);
1701 auto hold = referenceHoldingDetach();
1702 auto dpos = std::next(d->m.cbegin(), posDistance);
1703 return iterator(d->m.insert(dpos, {key, value}));
1706 return iterator(d->m.insert(pos.i, {key, value}));
1709#if QT_DEPRECATED_SINCE(6
, 0
)
1710 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1711 iterator insertMulti(
const Key &key,
const T &value)
1713 return insert(key, value);
1715 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1716 iterator insertMulti(const_iterator pos,
const Key &key,
const T &value)
1718 return insert(pos, key, value);
1721 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1722 void insert(
const QMultiMap<Key, T> &map)
1727 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1728 void insert(QMultiMap<Key, T> &&map)
1730 unite(std::move(map));
1734 iterator replace(
const Key &key,
const T &value)
1737 d.reset(
new MapData);
1738 return iterator(d->m.insert({ key, value }));
1740 auto i = d->m.find(key);
1742 const auto hold = referenceHoldingDetachExceptFor(i);
1743 return iterator(d->m.insert({ key, value }));
1748 if (i != d->m.end())
1751 i = d->m.insert({key, value});
1758 inline bool empty()
const {
return isEmpty(); }
1760 std::pair<iterator, iterator> equal_range(
const Key &akey)
1762 const auto hold = referenceHoldingDetach();
1763 auto result = d->m.equal_range(akey);
1764 return {iterator(result.first), iterator(result.second)};
1767 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
1771 auto result = d->m.equal_range(akey);
1772 return {const_iterator(result.first), const_iterator(result.second)};
1775 QMultiMap &unite(
const QMultiMap &other)
1777 if (other.isEmpty())
1782 auto copy = other.d->m;
1783#ifdef __cpp_lib_node_extract
1784 copy.merge(std::move(d->m));
1786 copy.insert(std::make_move_iterator(d->m.begin()),
1787 std::make_move_iterator(d->m.end()));
1789 d->m = std::move(copy);
1793 QMultiMap &unite(QMultiMap<Key, T> &&other)
1795 if (!other.d || other.d->m.empty())
1798 if (other.d.isShared()) {
1806#ifdef __cpp_lib_node_extract
1807 other.d->m.merge(std::move(d->m));
1809 other.d->m.insert(std::make_move_iterator(d->m.begin()),
1810 std::make_move_iterator(d->m.end()));
1812 *
this = std::move(other);