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;
1005 auto findIteratorByKey(
const Key &key)
const
1007 auto i = d->m.lower_bound(key);
1008 const auto &cmp = d->m.key_comp();
1009 if (i != d->m.end() && !cmp(key, i->first))
1013 auto findIteratorByKey(
const Key &key)
1015 auto i = d->m.lower_bound(key);
1016 const auto &cmp = d->m.key_comp();
1017 if (i != d->m.end() && !cmp(key, i->first))
1023 using key_type = Key;
1024 using mapped_type = T;
1025 using difference_type = qptrdiff;
1026 using size_type = qsizetype;
1028 QMultiMap() =
default;
1032 QMultiMap(std::initializer_list<std::pair<Key,T>> list)
1034 for (
auto &p : list)
1035 insert(p.first, p.second);
1038 void swap(QMultiMap<Key, T> &other)
noexcept
1043 explicit QMultiMap(
const QMap<Key, T> &other)
1044 : d(other.isEmpty() ?
nullptr :
new MapData)
1048 d->m.insert(other.d->m.begin(),
1053 explicit QMultiMap(QMap<Key, T> &&other)
1054 : d(other.isEmpty() ?
nullptr :
new MapData)
1058 if (other.d.isShared()) {
1059 d->m.insert(other.d->m.begin(),
1062#ifdef __cpp_lib_node_extract
1063 d->m.merge(std::move(other.d->m));
1065 d->m.insert(std::make_move_iterator(other.d->m.begin()),
1066 std::make_move_iterator(other.d->m.end()));
1072 explicit QMultiMap(
const std::multimap<Key, T> &other)
1073 : d(other.empty() ?
nullptr :
new MapData(other))
1077 explicit QMultiMap(std::multimap<Key, T> &&other)
1078 : d(other.empty() ?
nullptr :
new MapData(std::move(other)))
1083 Q_DECL_DEPRECATED_X(
"Use toStdMultiMap instead")
1084 std::multimap<Key, T> toStdMap()
const
1086 return toStdMultiMap();
1089 std::multimap<Key, T> toStdMultiMap()
const &
1096 std::multimap<Key, T> toStdMultiMap() &&
1102 return std::move(d->m);
1110 template <
typename AKey = Key,
typename AT = T,
1111 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>
1112 friend bool comparesEqual(
const QMultiMap &lhs,
const QMultiMap &rhs)
1119 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
1121 QT_DECLARE_EQUALITY_OPERATORS_HELPER(QMultiMap, QMultiMap, ,
noexcept(
false),
1122 template <
typename AKey = Key,
typename AT = T,
1123 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>)
1125 template <
typename AKey = Key,
typename AT = T,
1126 QtPrivate::if_map_has_relational_operators<QMultiMap, AKey, AT> =
true>
1127 friend auto compareThreeWay(
const QMultiMap &lhs,
const QMultiMap &rhs)
1129 return QtOrderingPrivate::lexicographicalCompareThreeWay(lhs.constKeyValueBegin(),
1130 lhs.constKeyValueEnd(),
1131 rhs.constKeyValueBegin(),
1132 rhs.constKeyValueEnd());
1134 QT_DECLARE_ORDERING_HELPER_AUTO(QMultiMap, QMultiMap, ,
noexcept(
false),
1135 template <
typename AKey = Key,
typename AT = T,
1136 QtPrivate::if_map_has_relational_operators<QMultiMap, AKey, AT> =
true>)
1139 friend bool operator==(
const QMultiMap &lhs,
const QMultiMap &rhs);
1140 friend bool operator!=(
const QMultiMap &lhs,
const QMultiMap &rhs);
1141 friend bool operator<(
const QMultiMap &lhs,
const QMultiMap &rhs);
1142 friend bool operator>(
const QMultiMap &lhs,
const QMultiMap &rhs);
1143 friend bool operator<=(
const QMultiMap &lhs,
const QMultiMap &rhs);
1144 friend bool operator>=(
const QMultiMap &lhs,
const QMultiMap &rhs);
1145 friend auto operator<=>(
const QMultiMap &lhs,
const QMultiMap &rhs);
1148 size_type size()
const {
return d ? size_type(d->m.size()) : size_type(0); }
1151 bool isEmpty()
const {
return d ? d->m.empty() :
true; }
1158 d.reset(
new MapData);
1163 [[nodiscard]] QMultiMap referenceHoldingDetach()
1166 d.reset(
new MapData);
1167 }
else if (d.isShared()) {
1176 [[nodiscard]] QMultiMap referenceHoldingDetachExceptFor(
const typename Map::iterator &skipit)
1178 Q_ASSERT(d.isShared());
1180 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newData(
new MapData);
1181 newData->copyExceptFor(d->m, skipit);
1186 bool isDetached()
const noexcept
1188 return d ? !d.isShared() :
false;
1191 bool isSharedWith(
const QMultiMap<Key, T> &other)
const noexcept
1193 return d == other.d;
1207 size_type remove(
const Key &key)
1213 return size_type(d->m.erase(key));
1215 MapData *newData =
new MapData;
1216 size_type result = newData->copyIfNotEquivalentTo(d->m, key).count;
1223 size_type remove(
const Key &key,
const T &value)
1228 size_type result = 0;
1229 const auto &keyCompare = d->m.key_comp();
1232 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newData(
new MapData);
1233 const auto keep = [&newData](
auto it) { newData->m.insert(newData->m.cend(), *it); };
1235 auto it = d->m.cbegin();
1236 const auto end = d->m.cend();
1237 for (; it != end && keyCompare(it->first, key); ++it)
1240 for (; it != end && !keyCompare(key, it->first); ++it) {
1241 if (!(it->second == value))
1246 for (; it != end; ++it)
1255 auto [i, e] = d->m.equal_range(key);
1261 const T valueCopy = value;
1263 if (i->second == valueCopy) {
1274 template <
typename Predicate>
1275 size_type removeIf(Predicate pred)
1277 return QtPrivate::associative_erase_if(*
this, pred);
1280 T take(
const Key &key)
1285 auto i = findIteratorByKey(key);
1287 if (i == d->m.end()) {
1292 const auto hold = referenceHoldingDetachExceptFor(i);
1296 if (i == d->m.end())
1299#ifdef __cpp_lib_node_extract
1300 return d->m.extract(i).mapped();
1303 T result(std::move(i->second));
1309 bool contains(
const Key &key)
const
1313 auto i = d->m.find(key);
1314 return i != d->m.end();
1317 bool contains(
const Key &key,
const T &value)
const
1319 return find(key, value) != end();
1322 Key key(
const T &value,
const Key &defaultKey = Key())
const
1327 return d->key(value, defaultKey);
1330 T value(
const Key &key,
const T &defaultValue = T())
const
1333 return defaultValue;
1334 auto i = findIteratorByKey(key);
1335 if (i != d->m.cend())
1337 return defaultValue;
1340 QList<Key> keys()
const
1347 QList<Key> keys(
const T &value)
const
1351 return d->keys(value);
1354 QList<Key> uniqueKeys()
const
1360 result.reserve(size());
1362 std::unique_copy(keyBegin(), keyEnd(),
1363 std::back_inserter(result));
1365 result.shrink_to_fit();
1369 QList<T> values()
const
1376 QList<T> values(
const Key &key)
const
1379 const auto range = equal_range(key);
1380 result.reserve(std::distance(range.first, range.second));
1381 std::copy(range.first, range.second, std::back_inserter(result));
1385 size_type count(
const Key &key)
const
1389 return d->count(key);
1392 size_type count(
const Key &key,
const T &value)
const
1398 auto range = d->m.equal_range(key);
1400 return size_type(std::count_if(range.first,
1402 MapData::valueIsEqualTo(value)));
1405 inline const Key &firstKey()
const { Q_ASSERT(!isEmpty());
return constBegin().key(); }
1406 inline const Key &lastKey()
const { Q_ASSERT(!isEmpty());
return std::next(constEnd(), -1).key(); }
1408 inline T &first() { Q_ASSERT(!isEmpty());
return *begin(); }
1409 inline const T &first()
const { Q_ASSERT(!isEmpty());
return *constBegin(); }
1410 inline T &last() { Q_ASSERT(!isEmpty());
return *std::next(end(), -1); }
1411 inline const T &last()
const { Q_ASSERT(!isEmpty());
return *std::next(constEnd(), -1); }
1413 class const_iterator;
1417 friend class QMultiMap<Key, T>;
1418 friend class const_iterator;
1420 typename Map::iterator i;
1421 explicit iterator(
typename Map::iterator it) : i(it) {}
1423 using iterator_category = std::bidirectional_iterator_tag;
1424 using difference_type = qptrdiff;
1425 using value_type = T;
1426 using pointer = T *;
1427 using reference = T &;
1429 iterator() =
default;
1431 const Key &key()
const {
return i->first; }
1432 T &value()
const {
return i->second; }
1433 T &operator*()
const {
return i->second; }
1434 T *operator->()
const {
return &i->second; }
1435 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
1436 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
1438 iterator &operator++()
1443 iterator operator++(
int)
1449 iterator &operator--()
1454 iterator operator--(
int)
1461#if QT_DEPRECATED_SINCE(6
, 0
)
1462 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1464 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
1466 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1468 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
1470 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1471 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1473 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1474 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1476 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1478 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
1480 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1482 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
1486 class const_iterator
1488 friend class QMultiMap<Key, T>;
1489 typename Map::const_iterator i;
1490 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
1493 using iterator_category = std::bidirectional_iterator_tag;
1494 using difference_type = qptrdiff;
1495 using value_type = T;
1496 using pointer =
const T *;
1497 using reference =
const T &;
1499 const_iterator() =
default;
1500 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
1502 const Key &key()
const {
return i->first; }
1503 const T &value()
const {
return i->second; }
1504 const T &operator*()
const {
return i->second; }
1505 const T *operator->()
const {
return &i->second; }
1506 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
1507 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
1509 const_iterator &operator++()
1514 const_iterator operator++(
int)
1516 const_iterator r = *
this;
1520 const_iterator &operator--()
1525 const_iterator operator--(
int)
1527 const_iterator r = *
this;
1532#if QT_DEPRECATED_SINCE(6
, 0
)
1533 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1535 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
1537 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1539 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
1541 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1542 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1544 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1545 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1547 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1549 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
1551 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1553 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
1562 typedef typename const_iterator::iterator_category iterator_category;
1563 typedef typename const_iterator::difference_type difference_type;
1564 typedef Key value_type;
1565 typedef const Key *pointer;
1566 typedef const Key &reference;
1568 key_iterator() =
default;
1569 explicit key_iterator(const_iterator o) : i(o) { }
1571 const Key &operator*()
const {
return i.key(); }
1572 const Key *operator->()
const {
return &i.key(); }
1573 bool operator==(key_iterator o)
const {
return i == o.i; }
1574 bool operator!=(key_iterator o)
const {
return i != o.i; }
1576 inline key_iterator &operator++() { ++i;
return *
this; }
1577 inline key_iterator operator++(
int) {
return key_iterator(i++);}
1578 inline key_iterator &operator--() { --i;
return *
this; }
1579 inline key_iterator operator--(
int) {
return key_iterator(i--); }
1580 const_iterator base()
const {
return i; }
1583 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
1584 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
1587 iterator begin() { detach();
return iterator(d->m.begin()); }
1588 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
1589 const_iterator constBegin()
const {
return begin(); }
1590 const_iterator cbegin()
const {
return begin(); }
1591 iterator end() { detach();
return iterator(d->m.end()); }
1592 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
1593 const_iterator constEnd()
const {
return end(); }
1594 const_iterator cend()
const {
return end(); }
1595 key_iterator keyBegin()
const {
return key_iterator(begin()); }
1596 key_iterator keyEnd()
const {
return key_iterator(end()); }
1597 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
1598 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
1599 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
1600 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
1601 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
1602 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
1603 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMultiMap &>(*
this); }
1604 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMultiMap &>(*
this); }
1605 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1606 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1608 iterator erase(const_iterator it)
1610 return erase(it, std::next(it));
1613 iterator erase(const_iterator afirst, const_iterator alast)
1619 return iterator(d->m.erase(afirst.i, alast.i));
1621 auto result = d->erase(afirst.i, alast.i);
1622 d.reset(result.data);
1623 return iterator(result.it);
1627 typedef iterator Iterator;
1628 typedef const_iterator ConstIterator;
1630 size_type count()
const
1635 iterator find(
const Key &key)
1637 const auto hold = referenceHoldingDetach();
1638 return iterator(findIteratorByKey(key));
1641 const_iterator find(
const Key &key)
const
1644 return const_iterator();
1645 return const_iterator(findIteratorByKey(key));
1648 const_iterator constFind(
const Key &key)
const
1653 iterator find(
const Key &key,
const T &value)
1655 const auto hold = referenceHoldingDetach();
1657 auto range = d->m.equal_range(key);
1658 auto i = std::find_if(range.first, range.second,
1659 MapData::valueIsEqualTo(value));
1661 if (i != range.second)
1663 return iterator(d->m.end());
1666 const_iterator find(
const Key &key,
const T &value)
const
1669 return const_iterator();
1671 auto range = d->m.equal_range(key);
1672 auto i = std::find_if(range.first, range.second,
1673 MapData::valueIsEqualTo(value));
1675 if (i != range.second)
1676 return const_iterator(i);
1677 return const_iterator(d->m.end());
1680 const_iterator constFind(
const Key &key,
const T &value)
const
1682 return find(key, value);
1685 iterator lowerBound(
const Key &key)
1687 const auto hold = referenceHoldingDetach();
1688 return iterator(d->m.lower_bound(key));
1691 const_iterator lowerBound(
const Key &key)
const
1694 return const_iterator();
1695 return const_iterator(d->m.lower_bound(key));
1698 iterator upperBound(
const Key &key)
1700 const auto hold = referenceHoldingDetach();
1701 return iterator(d->m.upper_bound(key));
1704 const_iterator upperBound(
const Key &key)
const
1707 return const_iterator();
1708 return const_iterator(d->m.upper_bound(key));
1711 iterator insert(
const Key &key,
const T &value)
1713 const auto hold = referenceHoldingDetach();
1716 auto i = d->m.lower_bound(key);
1717 return iterator(d->m.insert(i, {key, value}));
1720 iterator insert(const_iterator pos,
const Key &key,
const T &value)
1723 d.reset(
new MapData);
1724 return iterator(d->m.insert({ key, value }));
1725 }
else if (d.isShared()) {
1726 auto posDistance = std::distance(d->m.cbegin(), pos.i);
1727 auto hold = referenceHoldingDetach();
1728 auto dpos = std::next(d->m.cbegin(), posDistance);
1729 return iterator(d->m.insert(dpos, {key, value}));
1732 return iterator(d->m.insert(pos.i, {key, value}));
1735#if QT_DEPRECATED_SINCE(6
, 0
)
1736 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1737 iterator insertMulti(
const Key &key,
const T &value)
1739 return insert(key, value);
1741 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1742 iterator insertMulti(const_iterator pos,
const Key &key,
const T &value)
1744 return insert(pos, key, value);
1747 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1748 void insert(
const QMultiMap<Key, T> &map)
1753 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1754 void insert(QMultiMap<Key, T> &&map)
1756 unite(std::move(map));
1760 iterator replace(
const Key &key,
const T &value)
1763 d.reset(
new MapData);
1764 return iterator(d->m.insert({ key, value }));
1766 auto i = findIteratorByKey(key);
1768 const auto hold = referenceHoldingDetachExceptFor(i);
1769 return iterator(d->m.insert({ key, value }));
1774 if (i != d->m.end())
1777 i = d->m.insert({key, value});
1784 inline bool empty()
const {
return isEmpty(); }
1786 std::pair<iterator, iterator> equal_range(
const Key &akey)
1788 const auto hold = referenceHoldingDetach();
1789 auto result = d->m.equal_range(akey);
1790 return {iterator(result.first), iterator(result.second)};
1793 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
1797 auto result = d->m.equal_range(akey);
1798 return {const_iterator(result.first), const_iterator(result.second)};
1801 QMultiMap &unite(
const QMultiMap &other)
1803 if (other.isEmpty())
1808 auto copy = other.d->m;
1809#ifdef __cpp_lib_node_extract
1810 copy.merge(std::move(d->m));
1812 copy.insert(std::make_move_iterator(d->m.begin()),
1813 std::make_move_iterator(d->m.end()));
1815 d->m = std::move(copy);
1819 QMultiMap &unite(QMultiMap<Key, T> &&other)
1821 if (!other.d || other.d->m.empty())
1824 if (other.d.isShared()) {
1832#ifdef __cpp_lib_node_extract
1833 other.d->m.merge(std::move(d->m));
1835 other.d->m.insert(std::make_move_iterator(d->m.begin()),
1836 std::make_move_iterator(d->m.end()));
1838 *
this = std::move(other);