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,
498#ifdef __cpp_lib_node_extract
599 friend class QMap<Key, T>;
600 friend class const_iterator;
602 typename Map::iterator i;
603 explicit iterator(
typename Map::iterator it) : i(it) {}
605 using iterator_category =
std::bidirectional_iterator_tag;
606 using difference_type = qptrdiff;
607 using value_type = T;
609 using reference = T &;
611 iterator() =
default;
613 const Key &key()
const {
return i->first; }
614 T &value()
const {
return i->second; }
615 T &operator*()
const {
return i->second; }
616 T *operator->()
const {
return &i->second; }
617 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
618 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
620 iterator &operator++()
625 iterator operator++(
int)
631 iterator &operator--()
636 iterator operator--(
int)
643#if QT_DEPRECATED_SINCE(6
, 0
)
644 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
646 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
648 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
650 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
652 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
653 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
655 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
656 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
658 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
660 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
662 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
664 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
670 friend class QMap<Key, T>;
671 typename Map::const_iterator i;
672 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
675 using iterator_category =
std::bidirectional_iterator_tag;
676 using difference_type = qptrdiff;
677 using value_type = T;
678 using pointer =
const T *;
679 using reference =
const T &;
681 const_iterator() =
default;
682 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
684 const Key &key()
const {
return i->first; }
685 const T &value()
const {
return i->second; }
686 const T &operator*()
const {
return i->second; }
687 const T *operator->()
const {
return &i->second; }
688 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
689 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
691 const_iterator &operator++()
696 const_iterator operator++(
int)
698 const_iterator r = *
this;
702 const_iterator &operator--()
707 const_iterator operator--(
int)
709 const_iterator r = *
this;
714#if QT_DEPRECATED_SINCE(6
, 0
)
715 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
717 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
719 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
721 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
723 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
724 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
726 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
727 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
729 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
731 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
733 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
735 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
744 typedef typename const_iterator::iterator_category iterator_category;
745 typedef typename const_iterator::difference_type difference_type;
746 typedef Key value_type;
747 typedef const Key *pointer;
748 typedef const Key &reference;
750 key_iterator() =
default;
751 explicit key_iterator(const_iterator o) : i(o) { }
753 const Key &operator*()
const {
return i.key(); }
754 const Key *operator->()
const {
return &i.key(); }
755 bool operator==(key_iterator o)
const {
return i == o.i; }
756 bool operator!=(key_iterator o)
const {
return i != o.i; }
758 inline key_iterator &operator++() { ++i;
return *
this; }
759 inline key_iterator operator++(
int) {
return key_iterator(i++);}
760 inline key_iterator &operator--() { --i;
return *
this; }
761 inline key_iterator operator--(
int) {
return key_iterator(i--); }
762 const_iterator base()
const {
return i; }
765 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
766 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
769 iterator begin() { detach();
return iterator(d->m.begin()); }
770 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
771 const_iterator constBegin()
const {
return begin(); }
772 const_iterator cbegin()
const {
return begin(); }
773 iterator end() { detach();
return iterator(d->m.end()); }
774 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
775 const_iterator constEnd()
const {
return end(); }
776 const_iterator cend()
const {
return end(); }
777 key_iterator keyBegin()
const {
return key_iterator(begin()); }
778 key_iterator keyEnd()
const {
return key_iterator(end()); }
779 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
780 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
781 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
782 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
783 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
784 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
785 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMap &>(*
this); }
786 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMap &>(*
this); }
787 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
788 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
790 iterator erase(const_iterator it)
792 return erase(it,
std::next(it));
795 iterator erase(const_iterator afirst, const_iterator alast)
801 return iterator(d->m.erase(afirst.i, alast.i));
803 auto result = d->erase(afirst.i, alast.i);
804 d.reset(result.data);
805 return iterator(result.it);
809 typedef iterator Iterator;
810 typedef const_iterator ConstIterator;
812 iterator find(
const Key &key)
814 const auto hold = referenceHoldingDetach();
815 return iterator(d->m.find(key));
818 const_iterator find(
const Key &key)
const
821 return const_iterator();
822 return const_iterator(d->m.find(key));
825 const_iterator constFind(
const Key &key)
const
830 iterator lowerBound(
const Key &key)
832 const auto hold = referenceHoldingDetach();
833 return iterator(d->m.lower_bound(key));
836 const_iterator lowerBound(
const Key &key)
const
839 return const_iterator();
840 return const_iterator(d->m.lower_bound(key));
843 iterator upperBound(
const Key &key)
845 const auto hold = referenceHoldingDetach();
846 return iterator(d->m.upper_bound(key));
849 const_iterator upperBound(
const Key &key)
const
852 return const_iterator();
853 return const_iterator(d->m.upper_bound(key));
856 iterator insert(
const Key &key,
const T &value)
858 const auto hold = referenceHoldingDetachExcept(key);
859 return iterator(d->m.insert_or_assign(key, value).first);
862 iterator insert(const_iterator pos,
const Key &key,
const T &value)
866 return iterator(d->m.emplace(key, value).first);
867 }
else if (d.isShared()) {
868 auto posDistance =
std::distance(d->m.cbegin(), pos.i);
869 const auto hold = referenceHoldingDetachExcept(key);
870 auto dpos =
std::next(d->m.cbegin(), posDistance);
871 return iterator(d->m.insert_or_assign(dpos, key, value));
873 return iterator(d->m.insert_or_assign(pos.i, key, value));
876 void insert(
const QMap<Key, T> &map)
887 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newD(
new MapData);
888 const auto commit = qScopeGuard([&] { newD.swap(d); });
889 newD->fillWithMergeOf(d->m, map.d->m);
893#ifdef __cpp_lib_node_extract
895 auto copy = map.d->m;
897 d->m = std::move(copy);
899 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newD(
new MapData);
900 const auto commit = qScopeGuard([&] { newD.swap(d); });
901 newD->fillWithMergeOf(d->m, map.d->m);
906 void insert(
QMap<Key, T> &&map)
908 if (map.isEmpty() || map.d.isShared()) {
915 const auto commit = qScopeGuard([&] { map
.swap(*
this); });
920 map.d->insertMap(d->m);
924#ifdef __cpp_lib_node_extract
925 map.d->m.merge(
std::move(d->m));
928 map.d->insertMap(d->m);
934 inline bool empty()
const
939 std::pair<iterator, iterator> equal_range(
const Key &akey)
941 const auto hold = referenceHoldingDetach();
942 auto result = d->m.equal_range(akey);
943 return {iterator(result.first), iterator(result.second)};
946 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
950 auto result = d->m.equal_range(akey);
951 return {const_iterator(result.first), const_iterator(result.second)};
958# if defined(Q_CC_GHS) || defined (Q_CC_MSVC)
968 qHash(
const M &key, size_t seed = 0)
974 return std::accumulate(key.d->m.begin(), key.d->m.end(), seed,
975 QtPrivate::QHashCombine{seed});
997 using Map = std::multimap<Key, T>;
998 using MapData = QMapData<Map>;
999 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
1007 auto findIteratorByKey(
const Key &key)
const
1009 auto i = d->m.lower_bound(key);
1010 const auto &cmp = d->m.key_comp();
1011 if (i != d->m.end() && !cmp(key, i->first))
1015 auto findIteratorByKey(
const Key &key)
1017 auto i = d->m.lower_bound(key);
1018 const auto &cmp = d->m.key_comp();
1019 if (i != d->m.end() && !cmp(key, i->first))
1025 using key_type = Key;
1026 using mapped_type = T;
1027 using difference_type = qptrdiff;
1028 using size_type = qsizetype;
1030 QMultiMap() =
default;
1034 QMultiMap(std::initializer_list<std::pair<Key,T>> list)
1036 for (
auto &p : list)
1037 insert(p.first, p.second);
1040 void swap(QMultiMap<Key, T> &other)
noexcept
1045 explicit QMultiMap(
const QMap<Key, T> &other)
1046 : d(other.isEmpty() ?
nullptr :
new MapData)
1050 d->m.insert(other.d->m.begin(),
1055 explicit QMultiMap(QMap<Key, T> &&other)
1056 : d(other.isEmpty() ?
nullptr :
new MapData)
1060 if (other.d.isShared()) {
1061 d->m.insert(other.d->m.begin(),
1064#ifdef __cpp_lib_node_extract
1065 d->m.merge(std::move(other.d->m));
1067 d->m.insert(std::make_move_iterator(other.d->m.begin()),
1068 std::make_move_iterator(other.d->m.end()));
1074 explicit QMultiMap(
const std::multimap<Key, T> &other)
1075 : d(other.empty() ?
nullptr :
new MapData(other))
1079 explicit QMultiMap(std::multimap<Key, T> &&other)
1080 : d(other.empty() ?
nullptr :
new MapData(std::move(other)))
1085 Q_DECL_DEPRECATED_X(
"Use toStdMultiMap instead")
1086 std::multimap<Key, T> toStdMap()
const
1088 return toStdMultiMap();
1091 std::multimap<Key, T> toStdMultiMap()
const &
1098 std::multimap<Key, T> toStdMultiMap() &&
1104 return std::move(d->m);
1112 template <
typename AKey = Key,
typename AT = T,
1113 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>
1114 friend bool comparesEqual(
const QMultiMap &lhs,
const QMultiMap &rhs)
1121 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
1123 QT_DECLARE_EQUALITY_OPERATORS_HELPER(QMultiMap, QMultiMap, ,
noexcept(
false),
1124 template <
typename AKey = Key,
typename AT = T,
1125 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>)
1127 template <
typename AKey = Key,
typename AT = T,
1128 QtPrivate::if_map_has_relational_operators<QMultiMap, AKey, AT> =
true>
1129 friend auto compareThreeWay(
const QMultiMap &lhs,
const QMultiMap &rhs)
1131 return QtOrderingPrivate::lexicographicalCompareThreeWay(lhs.constKeyValueBegin(),
1132 lhs.constKeyValueEnd(),
1133 rhs.constKeyValueBegin(),
1134 rhs.constKeyValueEnd());
1136 QT_DECLARE_ORDERING_HELPER_AUTO(QMultiMap, QMultiMap, ,
noexcept(
false),
1137 template <
typename AKey = Key,
typename AT = T,
1138 QtPrivate::if_map_has_relational_operators<QMultiMap, AKey, AT> =
true>)
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 bool operator<=(
const QMultiMap &lhs,
const QMultiMap &rhs);
1146 friend bool operator>=(
const QMultiMap &lhs,
const QMultiMap &rhs);
1147 friend auto operator<=>(
const QMultiMap &lhs,
const QMultiMap &rhs);
1150 size_type size()
const {
return d ? size_type(d->m.size()) : size_type(0); }
1153 bool isEmpty()
const {
return d ? d->m.empty() :
true; }
1160 d.reset(
new MapData);
1165 [[nodiscard]] QMultiMap referenceHoldingDetach()
1168 d.reset(
new MapData);
1169 }
else if (d.isShared()) {
1178 [[nodiscard]] QMultiMap referenceHoldingDetachExceptFor(
const typename Map::iterator &skipit)
1180 Q_ASSERT(d.isShared());
1182 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newData(
new MapData);
1183 newData->copyExceptFor(d->m, skipit);
1188 bool isDetached()
const noexcept
1190 return d ? !d.isShared() :
false;
1193 bool isSharedWith(
const QMultiMap<Key, T> &other)
const noexcept
1195 return d == other.d;
1209 size_type remove(
const Key &key)
1215 return size_type(d->m.erase(key));
1217 MapData *newData =
new MapData;
1218 size_type result = newData->copyIfNotEquivalentTo(d->m, key).count;
1225 size_type remove(
const Key &key,
const T &value)
1230 size_type result = 0;
1231 const auto &keyCompare = d->m.key_comp();
1234 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newData(
new MapData);
1235 const auto keep = [&newData](
auto it) { newData->m.insert(newData->m.cend(), *it); };
1237 auto it = d->m.cbegin();
1238 const auto end = d->m.cend();
1239 for (; it != end && keyCompare(it->first, key); ++it)
1242 for (; it != end && !keyCompare(key, it->first); ++it) {
1243 if (!(it->second == value))
1248 for (; it != end; ++it)
1257 auto [i, e] = d->m.equal_range(key);
1263 const T valueCopy = value;
1265 if (i->second == valueCopy) {
1276 template <
typename Predicate>
1277 size_type removeIf(Predicate pred)
1279 return QtPrivate::associative_erase_if(*
this, pred);
1282 T take(
const Key &key)
1287 auto i = findIteratorByKey(key);
1289 if (i == d->m.end()) {
1294 const auto hold = referenceHoldingDetachExceptFor(i);
1298 if (i == d->m.end())
1301#ifdef __cpp_lib_node_extract
1302 return std::move(d->m.extract(i).mapped());
1305 T result(std::move(i->second));
1311 bool contains(
const Key &key)
const
1315 auto i = d->m.find(key);
1316 return i != d->m.end();
1319 bool contains(
const Key &key,
const T &value)
const
1321 return find(key, value) != end();
1324 Key key(
const T &value,
const Key &defaultKey = Key())
const
1329 return d->key(value, defaultKey);
1332 T value(
const Key &key,
const T &defaultValue = T())
const
1335 return defaultValue;
1336 auto i = findIteratorByKey(key);
1337 if (i != d->m.cend())
1339 return defaultValue;
1342 QList<Key> keys()
const
1349 QList<Key> keys(
const T &value)
const
1353 return d->keys(value);
1356 QList<Key> uniqueKeys()
const
1362 result.reserve(size());
1364 std::unique_copy(keyBegin(), keyEnd(),
1365 std::back_inserter(result));
1367 result.shrink_to_fit();
1371 QList<T> values()
const
1378 QList<T> values(
const Key &key)
const
1381 const auto range = equal_range(key);
1382 result.reserve(std::distance(range.first, range.second));
1383 std::copy(range.first, range.second, std::back_inserter(result));
1387 size_type count(
const Key &key)
const
1391 return d->count(key);
1394 size_type count(
const Key &key,
const T &value)
const
1400 auto range = d->m.equal_range(key);
1402 return size_type(std::count_if(range.first,
1404 MapData::valueIsEqualTo(value)));
1407 inline const Key &firstKey()
const { Q_ASSERT(!isEmpty());
return constBegin().key(); }
1408 inline const Key &lastKey()
const { Q_ASSERT(!isEmpty());
return std::next(constEnd(), -1).key(); }
1410 inline T &first() { Q_ASSERT(!isEmpty());
return *begin(); }
1411 inline const T &first()
const { Q_ASSERT(!isEmpty());
return *constBegin(); }
1412 inline T &last() { Q_ASSERT(!isEmpty());
return *std::next(end(), -1); }
1413 inline const T &last()
const { Q_ASSERT(!isEmpty());
return *std::next(constEnd(), -1); }
1415 class const_iterator;
1419 friend class QMultiMap<Key, T>;
1420 friend class const_iterator;
1422 typename Map::iterator i;
1423 explicit iterator(
typename Map::iterator it) : i(it) {}
1425 using iterator_category = std::bidirectional_iterator_tag;
1426 using difference_type = qptrdiff;
1427 using value_type = T;
1428 using pointer = T *;
1429 using reference = T &;
1431 iterator() =
default;
1433 const Key &key()
const {
return i->first; }
1434 T &value()
const {
return i->second; }
1435 T &operator*()
const {
return i->second; }
1436 T *operator->()
const {
return &i->second; }
1437 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
1438 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
1440 iterator &operator++()
1445 iterator operator++(
int)
1451 iterator &operator--()
1456 iterator operator--(
int)
1463#if QT_DEPRECATED_SINCE(6
, 0
)
1464 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1466 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
1468 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1470 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
1472 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1473 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1475 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1476 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1478 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1480 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
1482 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1484 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
1488 class const_iterator
1490 friend class QMultiMap<Key, T>;
1491 typename Map::const_iterator i;
1492 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
1495 using iterator_category = std::bidirectional_iterator_tag;
1496 using difference_type = qptrdiff;
1497 using value_type = T;
1498 using pointer =
const T *;
1499 using reference =
const T &;
1501 const_iterator() =
default;
1502 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
1504 const Key &key()
const {
return i->first; }
1505 const T &value()
const {
return i->second; }
1506 const T &operator*()
const {
return i->second; }
1507 const T *operator->()
const {
return &i->second; }
1508 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
1509 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
1511 const_iterator &operator++()
1516 const_iterator operator++(
int)
1518 const_iterator r = *
this;
1522 const_iterator &operator--()
1527 const_iterator operator--(
int)
1529 const_iterator r = *
this;
1534#if QT_DEPRECATED_SINCE(6
, 0
)
1535 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1537 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
1539 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1541 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
1543 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1544 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1546 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1547 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1549 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1551 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
1553 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1555 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
1564 typedef typename const_iterator::iterator_category iterator_category;
1565 typedef typename const_iterator::difference_type difference_type;
1566 typedef Key value_type;
1567 typedef const Key *pointer;
1568 typedef const Key &reference;
1570 key_iterator() =
default;
1571 explicit key_iterator(const_iterator o) : i(o) { }
1573 const Key &operator*()
const {
return i.key(); }
1574 const Key *operator->()
const {
return &i.key(); }
1575 bool operator==(key_iterator o)
const {
return i == o.i; }
1576 bool operator!=(key_iterator o)
const {
return i != o.i; }
1578 inline key_iterator &operator++() { ++i;
return *
this; }
1579 inline key_iterator operator++(
int) {
return key_iterator(i++);}
1580 inline key_iterator &operator--() { --i;
return *
this; }
1581 inline key_iterator operator--(
int) {
return key_iterator(i--); }
1582 const_iterator base()
const {
return i; }
1585 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
1586 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
1589 iterator begin() { detach();
return iterator(d->m.begin()); }
1590 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
1591 const_iterator constBegin()
const {
return begin(); }
1592 const_iterator cbegin()
const {
return begin(); }
1593 iterator end() { detach();
return iterator(d->m.end()); }
1594 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
1595 const_iterator constEnd()
const {
return end(); }
1596 const_iterator cend()
const {
return end(); }
1597 key_iterator keyBegin()
const {
return key_iterator(begin()); }
1598 key_iterator keyEnd()
const {
return key_iterator(end()); }
1599 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
1600 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
1601 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
1602 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
1603 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
1604 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
1605 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMultiMap &>(*
this); }
1606 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMultiMap &>(*
this); }
1607 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1608 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1610 iterator erase(const_iterator it)
1612 return erase(it, std::next(it));
1615 iterator erase(const_iterator afirst, const_iterator alast)
1621 return iterator(d->m.erase(afirst.i, alast.i));
1623 auto result = d->erase(afirst.i, alast.i);
1624 d.reset(result.data);
1625 return iterator(result.it);
1629 typedef iterator Iterator;
1630 typedef const_iterator ConstIterator;
1632 size_type count()
const
1637 iterator find(
const Key &key)
1639 const auto hold = referenceHoldingDetach();
1640 return iterator(findIteratorByKey(key));
1643 const_iterator find(
const Key &key)
const
1646 return const_iterator();
1647 return const_iterator(findIteratorByKey(key));
1650 const_iterator constFind(
const Key &key)
const
1655 iterator find(
const Key &key,
const T &value)
1657 const auto hold = referenceHoldingDetach();
1659 auto range = d->m.equal_range(key);
1660 auto i = std::find_if(range.first, range.second,
1661 MapData::valueIsEqualTo(value));
1663 if (i != range.second)
1665 return iterator(d->m.end());
1668 const_iterator find(
const Key &key,
const T &value)
const
1671 return const_iterator();
1673 auto range = d->m.equal_range(key);
1674 auto i = std::find_if(range.first, range.second,
1675 MapData::valueIsEqualTo(value));
1677 if (i != range.second)
1678 return const_iterator(i);
1679 return const_iterator(d->m.end());
1682 const_iterator constFind(
const Key &key,
const T &value)
const
1684 return find(key, value);
1687 iterator lowerBound(
const Key &key)
1689 const auto hold = referenceHoldingDetach();
1690 return iterator(d->m.lower_bound(key));
1693 const_iterator lowerBound(
const Key &key)
const
1696 return const_iterator();
1697 return const_iterator(d->m.lower_bound(key));
1700 iterator upperBound(
const Key &key)
1702 const auto hold = referenceHoldingDetach();
1703 return iterator(d->m.upper_bound(key));
1706 const_iterator upperBound(
const Key &key)
const
1709 return const_iterator();
1710 return const_iterator(d->m.upper_bound(key));
1713 iterator insert(
const Key &key,
const T &value)
1715 const auto hold = referenceHoldingDetach();
1718 auto i = d->m.lower_bound(key);
1719 return iterator(d->m.insert(i, {key, value}));
1722 iterator insert(const_iterator pos,
const Key &key,
const T &value)
1725 d.reset(
new MapData);
1726 return iterator(d->m.insert({ key, value }));
1727 }
else if (d.isShared()) {
1728 auto posDistance = std::distance(d->m.cbegin(), pos.i);
1729 auto hold = referenceHoldingDetach();
1730 auto dpos = std::next(d->m.cbegin(), posDistance);
1731 return iterator(d->m.insert(dpos, {key, value}));
1734 return iterator(d->m.insert(pos.i, {key, value}));
1737#if QT_DEPRECATED_SINCE(6
, 0
)
1738 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1739 iterator insertMulti(
const Key &key,
const T &value)
1741 return insert(key, value);
1743 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1744 iterator insertMulti(const_iterator pos,
const Key &key,
const T &value)
1746 return insert(pos, key, value);
1749 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1750 void insert(
const QMultiMap<Key, T> &map)
1755 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1756 void insert(QMultiMap<Key, T> &&map)
1758 unite(std::move(map));
1762 iterator replace(
const Key &key,
const T &value)
1765 d.reset(
new MapData);
1766 return iterator(d->m.insert({ key, value }));
1768 auto i = findIteratorByKey(key);
1770 const auto hold = referenceHoldingDetachExceptFor(i);
1771 return iterator(d->m.insert({ key, value }));
1776 if (i != d->m.end())
1779 i = d->m.insert({key, value});
1786 inline bool empty()
const {
return isEmpty(); }
1788 std::pair<iterator, iterator> equal_range(
const Key &akey)
1790 const auto hold = referenceHoldingDetach();
1791 auto result = d->m.equal_range(akey);
1792 return {iterator(result.first), iterator(result.second)};
1795 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
1799 auto result = d->m.equal_range(akey);
1800 return {const_iterator(result.first), const_iterator(result.second)};
1803 QMultiMap &unite(
const QMultiMap &other)
1805 if (other.isEmpty())
1810 auto copy = other.d->m;
1811#ifdef __cpp_lib_node_extract
1812 copy.merge(std::move(d->m));
1814 copy.insert(std::make_move_iterator(d->m.begin()),
1815 std::make_move_iterator(d->m.end()));
1817 d->m = std::move(copy);
1821 QMultiMap &unite(QMultiMap<Key, T> &&other)
1823 if (!other.d || other.d->m.empty())
1826 if (other.d.isShared()) {
1834#ifdef __cpp_lib_node_extract
1835 other.d->m.merge(std::move(d->m));
1837 other.d->m.insert(std::make_move_iterator(d->m.begin()),
1838 std::make_move_iterator(d->m.end()));
1840 *
this = std::move(other);