8#include <QtCore/qhashfunctions.h>
9#include <QtCore/qiterator.h>
10#include <QtCore/qlist.h>
11#include <QtCore/qrefcount.h>
12#include <QtCore/qpair.h>
13#include <QtCore/qshareddata.h>
14#include <QtCore/qshareddata_impl.h>
17#include <initializer_list>
24template <
typename AMap>
29 using Key =
typename Map::key_type;
30 using T =
typename Map::mapped_type;
36 static_assert(std::is_nothrow_destructible_v<Key>,
"Types with throwing destructors are not supported in Qt containers.");
37 static_assert(std::is_nothrow_destructible_v<T>,
"Types with throwing destructors are not supported in Qt containers.");
57 const auto &keyCompare =
source.key_comp();
60 if (!keyCompare(
key,
v.first) && !keyCompare(
v.first,
key)) {
69 std::inserter(
m,
m.end()),
79 return [&
value](
const auto &
v) {
return v.second ==
value; };
84 auto i = std::find_if(
m.cbegin(),
98 const auto extractKey = [](
const auto &
v) {
return v.first; };
100 std::transform(
m.cbegin(),
102 std::back_inserter(
result),
112 for (
const auto &
v :
m) {
125 const auto extractValue = [](
const auto &
v) {
return v.second; };
127 std::transform(
m.cbegin(),
129 std::back_inserter(
result),
153 const auto newDataEnd =
result.it;
156 const auto e =
m.end();
170 result.data->m.insert(newDataEnd, *
i);
174 if (
result.it != newDataEnd)
185template <
class Key,
class T>
188 using Map = std::map<Key, T>;
189 using MapData = QMapData<Map>;
209 QMap(std::initializer_list<std::pair<Key, T>>
list)
238 return std::move(
d->m);
245 template <
typename AKey = Key,
typename AT = T>
friend
253 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
256 template <
typename AKey = Key,
typename AT = T>
friend
259 return !(lhs == rhs);
269 bool isEmpty()
const {
return d ?
d->m.empty() :
true; }
276 d.reset(
new MapData);
281 return d ? !
d.isShared() :
false;
308 MapData *newData =
new MapData;
316 template <
typename Predicate>
332 auto i =
d->m.find(
key);
333 if (
i !=
d->m.end()) {
334 T
result(std::move(
i->second));
345 auto i =
d->m.find(
key);
346 return i !=
d->m.end();
354 return d->key(
value, defaultKey);
361 const auto i =
d->m.find(
key);
362 if (
i !=
d->m.cend())
371 auto i =
d->m.find(
key);
408 return d->count(
key);
424 class const_iterator;
431 typename Map::iterator
i;
472#if QT_DEPRECATED_SINCE(6, 0)
500 typename Map::const_iterator
i;
514 const T &
value()
const {
return i->second; }
543#if QT_DEPRECATED_SINCE(6, 0)
630 return iterator(
d->m.erase(afirst.i, alast.i));
632 auto result =
d->erase(afirst.i, alast.i);
699 typename Map::const_iterator dpos;
701 if (!
d ||
d.isShared()) {
702 auto posDistance =
d ? std::distance(
d->m.cbegin(),
pos.i) : 0;
704 dpos = std::next(
d->m.cbegin(), posDistance);
719#ifdef __cpp_lib_node_extract
721 copy.merge(std::move(
d->m));
722 d->m = std::move(
copy);
726 auto insertionHint =
d->m.end();
727 auto mapIt =
map.d->m.crbegin();
728 auto end =
map.d->m.crend();
729 for (; mapIt !=
end; ++mapIt)
730 insertionHint =
d->m.insert_or_assign(insertionHint, mapIt->first, mapIt->second);
736 if (!
map.d ||
map.d->m.empty())
739 if (
map.d.isShared()) {
747#ifdef __cpp_lib_node_extract
748 map.d->m.merge(std::move(
d->m));
749 *
this = std::move(
map);
752 auto insertionHint =
d->m.end();
753 auto mapIt =
map.d->m.crbegin();
754 auto end =
map.d->m.crend();
755 for (; mapIt !=
end; ++mapIt)
756 insertionHint =
d->m.insert_or_assign(insertionHint, std::move(mapIt->first), std::move(mapIt->second));
770 auto result =
d->m.equal_range(akey);
778 auto result =
d->m.equal_range(akey);
786# if defined(Q_CC_GHS) || defined (Q_CC_MSVC)
790 template <
typename M, std::enable_if_t<std::is_same_v<M, QMap>,
bool> = true>
802 return std::accumulate(
key.d->m.begin(),
key.d->m.end(),
seed,
811template <
typename Key,
typename T,
typename Predicate>
822template <
class Key,
class T>
825 using Map = std::multimap<Key, T>;
826 using MapData = QMapData<Map>;
855 d->m.insert(
other.d->m.begin(),
865 if (
other.d.isShared()) {
866 d->m.insert(
other.d->m.begin(),
869#ifdef __cpp_lib_node_extract
870 d->m.merge(std::move(
other.d->m));
872 d->m.insert(std::make_move_iterator(
other.d->m.begin()),
873 std::make_move_iterator(
other.d->m.end()));
909 return std::move(
d->m);
916 template <
typename AKey = Key,
typename AT = T>
friend
924 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
927 template <
typename AKey = Key,
typename AT = T>
friend
930 return !(lhs == rhs);
940 bool isEmpty()
const {
return d ?
d->m.empty() :
true; }
947 d.reset(
new MapData);
952 return d ? !
d.isShared() :
false;
979 MapData *newData =
new MapData;
996 const T valueCopy =
value;
1002 const auto &keyCompare =
d->m.key_comp();
1004 auto i =
d->m.find(keyCopy);
1005 const auto e =
d->m.end();
1007 while (
i != e && !keyCompare(keyCopy,
i->first)) {
1008 if (
i->second == valueCopy) {
1019 template <
typename Predicate>
1036 auto i =
d->m.find(
key);
1037 if (
i !=
d->m.end()) {
1038 T
result(std::move(
i->second));
1049 auto i =
d->m.find(
key);
1050 return i !=
d->m.end();
1063 return d->key(
value, defaultKey);
1069 return defaultValue;
1070 const auto i =
d->m.find(
key);
1071 if (
i !=
d->m.cend())
1073 return defaultValue;
1099 std::back_inserter(
result));
1125 return d->count(
key);
1138 MapData::valueIsEqualTo(
value)));
1149 class const_iterator;
1156 typename Map::iterator
i;
1197#if QT_DEPRECATED_SINCE(6, 0)
1225 typename Map::const_iterator
i;
1268#if QT_DEPRECATED_SINCE(6, 0)
1355 return iterator(
d->m.erase(afirst.i, alast.i));
1357 auto result =
d->erase(afirst.i, alast.i);
1398 MapData::valueIsEqualTo(
value));
1412 MapData::valueIsEqualTo(
value));
1458 auto i =
d->m.lower_bound(
key);
1459 return iterator(
d->m.insert(
i, {key, value}));
1465 typename Map::const_iterator dpos;
1466 if (!
d ||
d.isShared()) {
1467 auto posDistance =
d ? std::distance(
d->m.cbegin(),
pos.i) : 0;
1469 dpos = std::next(
d->m.cbegin(), posDistance);
1473 return iterator(
d->m.insert(dpos, {key, value}));
1476#if QT_DEPRECATED_SINCE(6, 0)
1478 iterator insertMulti(const
Key &
key, const T &
value)
1483 iterator insertMulti(const_iterator
pos, const
Key &
key, const T &
value)
1510 auto i =
d->m.find(
key);
1511 if (
i !=
d->m.end())
1526 auto result =
d->m.equal_range(akey);
1534 auto result =
d->m.equal_range(akey);
1540 if (
other.isEmpty())
1546#ifdef __cpp_lib_node_extract
1547 copy.merge(std::move(
d->m));
1549 copy.insert(std::make_move_iterator(
d->m.begin()),
1550 std::make_move_iterator(
d->m.end()));
1552 d->m = std::move(
copy);
1561 if (
other.d.isShared()) {
1569#ifdef __cpp_lib_node_extract
1570 other.d->m.merge(std::move(
d->m));
1572 other.d->m.insert(std::make_move_iterator(
d->m.begin()),
1573 std::make_move_iterator(
d->m.end()));
1575 *
this = std::move(
other);
1583template <
typename Key,
typename T>
1584QMultiMap<Key, T>
operator+(
const QMultiMap<Key, T> &lhs,
const QMultiMap<Key, T> &rhs)
1591template <
typename Key,
typename T>
1592QMultiMap<Key, T>
operator+=(QMultiMap<Key, T> &lhs,
const QMultiMap<Key, T> &rhs)
1594 return lhs.unite(rhs);
1597template <
typename Key,
typename T,
typename Predicate>
std::pair< QString, QString > value_type
QList< T > values() const
typename Map::iterator iterator
EraseResult erase(const_iterator first, const_iterator last) const
Key key(const T &value, const Key &defaultKey) const
typename Map::size_type size_type
QList< Key > keys(const T &value) const
typename Map::mapped_type T
size_type count(const Key &key) const
typename Map::const_iterator const_iterator
typename Map::value_type value_type
size_type copyIfNotEquivalentTo(const Map &source, const Key &key)
static auto valueIsEqualTo(const T &value)
typename Map::key_type Key
QMapData(const Map &other)
QList< Key > keys() const
const_iterator operator++(int)
friend bool operator!=(const const_iterator &lhs, const const_iterator &rhs)
const_iterator & operator++()
friend bool operator==(const const_iterator &lhs, const const_iterator &rhs)
const T * operator->() const
Q_IMPLICIT const_iterator(const iterator &o)
const_iterator & operator--()
const_iterator operator--(int)
std::bidirectional_iterator_tag iterator_category
const T & operator*() const
friend bool operator==(const iterator &lhs, const iterator &rhs)
std::bidirectional_iterator_tag iterator_category
friend bool operator!=(const iterator &lhs, const iterator &rhs)
key_iterator(const_iterator o)
const_iterator::iterator_category iterator_category
key_iterator & operator--()
key_iterator & operator++()
const_iterator base() const
const Key * operator->() const
key_iterator operator--(int)
const Key & operator*() const
key_iterator operator++(int)
bool operator==(key_iterator o) const
const_iterator::difference_type difference_type
bool operator!=(key_iterator o) const
iterator insert(const Key &key, const T &value)
auto asKeyValueRange() &&
T value(const Key &key, const T &defaultValue=T()) const
QList< Key > keys(const T &value) const
const_iterator end() const
iterator erase(const_iterator it)
key_value_iterator keyValueEnd()
bool contains(const Key &key) const
size_type count(const Key &key) const
iterator insert(const_iterator pos, const Key &key, const T &value)
std::map< Key, T > toStdMap() const &
const_iterator cend() const
QList< T > values() const
T & operator[](const Key &key)
std::pair< const_iterator, const_iterator > equal_range(const Key &akey) const
QKeyValueIterator< const Key &, T &, iterator > key_value_iterator
size_type remove(const Key &key)
const_key_value_iterator constKeyValueEnd() const
const_iterator cbegin() const
const_iterator lowerBound(const Key &key) const
friend size_t qHash(const M &key, size_t seed=0) noexcept(QHashPrivate::noexceptPairHash< typename M::key_type, typename M::mapped_type >())
const_iterator constFind(const Key &key) const
QList< Key > keys() const
bool isSharedWith(const QMap< Key, T > &other) const noexcept
const_key_value_iterator constKeyValueBegin() const
iterator find(const Key &key)
void insert(const QMap< Key, T > &map)
iterator lowerBound(const Key &key)
const_iterator ConstIterator
const Key & firstKey() const
T operator[](const Key &key) const
const_key_value_iterator keyValueEnd() const
const Key & lastKey() const
QMap(std::map< Key, T > &&other)
iterator upperBound(const Key &key)
iterator erase(const_iterator afirst, const_iterator alast)
const_iterator constBegin() const
const_iterator begin() const
friend QTypeTraits::compare_eq_result_container< QMap, AKey, AT > operator!=(const QMap &lhs, const QMap &rhs)
size_type removeIf(Predicate pred)
key_iterator keyBegin() const
auto asKeyValueRange() const &&
const_key_value_iterator keyValueBegin() const
key_value_iterator keyValueBegin()
std::map< Key, T > toStdMap() &&
std::pair< iterator, iterator > equal_range(const Key &akey)
void insert(QMap< Key, T > &&map)
bool isDetached() const noexcept
QMap(const std::map< Key, T > &other)
QMap(std::initializer_list< std::pair< Key, T > > list)
Key key(const T &value, const Key &defaultKey=Key()) const
const_iterator constEnd() const
const_iterator upperBound(const Key &key) const
key_iterator keyEnd() const
QKeyValueIterator< const Key &, const T &, const_iterator > const_key_value_iterator
auto asKeyValueRange() const &
const_iterator find(const Key &key) const
void swap(QMap< Key, T > &other) noexcept
friend QTypeTraits::compare_eq_result_container< QMap, AKey, AT > operator==(const QMap &lhs, const QMap &rhs)
friend bool operator!=(const const_iterator &lhs, const const_iterator &rhs)
Q_IMPLICIT const_iterator(const iterator &o)
friend bool operator==(const const_iterator &lhs, const const_iterator &rhs)
const_iterator & operator--()
const T * operator->() const
const_iterator & operator++()
const_iterator operator--(int)
const T & operator*() const
const_iterator operator++(int)
std::bidirectional_iterator_tag iterator_category
friend bool operator==(const iterator &lhs, const iterator &rhs)
friend bool operator!=(const iterator &lhs, const iterator &rhs)
std::bidirectional_iterator_tag iterator_category
bool operator==(key_iterator o) const
const Key & operator*() const
const_iterator::difference_type difference_type
const_iterator base() const
key_iterator(const_iterator o)
key_iterator operator++(int)
const Key * operator->() const
const_iterator::iterator_category iterator_category
bool operator!=(key_iterator o) const
key_iterator & operator--()
key_iterator & operator++()
key_iterator operator--(int)
size_type count(const Key &key) const
const_iterator find(const Key &key, const T &value) const
auto asKeyValueRange() const &&
QList< Key > keys(const T &value) const
iterator lowerBound(const Key &key)
size_type removeIf(Predicate pred)
iterator replace(const Key &key, const T &value)
friend QTypeTraits::compare_eq_result_container< QMultiMap, AKey, AT > operator!=(const QMultiMap &lhs, const QMultiMap &rhs)
const_key_value_iterator constKeyValueEnd() const
QMultiMap & unite(const QMultiMap &other)
QMultiMap(std::multimap< Key, T > &&other)
QList< Key > keys() const
QMultiMap(const QMap< Key, T > &other)
const_iterator constFind(const Key &key) const
const_key_value_iterator keyValueBegin() const
QMultiMap(QMap< Key, T > &&other)
friend QTypeTraits::compare_eq_result_container< QMultiMap, AKey, AT > operator==(const QMultiMap &lhs, const QMultiMap &rhs)
const_iterator constEnd() const
bool contains(const Key &key) const
std::multimap< Key, T > toStdMultiMap() const &
key_value_iterator keyValueEnd()
bool isSharedWith(const QMultiMap< Key, T > &other) const noexcept
std::multimap< Key, T > toStdMap() const
const_key_value_iterator constKeyValueBegin() const
const_iterator constFind(const Key &key, const T &value) const
key_iterator keyBegin() const
const Key & firstKey() const
std::multimap< Key, T > toStdMultiMap() &&
const_iterator find(const Key &key) const
QList< T > values(const Key &key) const
auto asKeyValueRange() const &
size_type count(const Key &key, const T &value) const
bool contains(const Key &key, const T &value) const
QKeyValueIterator< const Key &, const T &, const_iterator > const_key_value_iterator
QMultiMap(std::initializer_list< std::pair< Key, T > > list)
const_iterator end() const
const_iterator upperBound(const Key &key) const
QMultiMap(const std::multimap< Key, T > &other)
const_iterator ConstIterator
size_type remove(const Key &key, const T &value)
key_iterator keyEnd() const
std::pair< const_iterator, const_iterator > equal_range(const Key &akey) const
iterator find(const Key &key)
iterator insert(const Key &key, const T &value)
iterator erase(const_iterator it)
const Key & lastKey() const
const_iterator begin() const
const_iterator constBegin() const
size_type remove(const Key &key)
const_iterator cbegin() const
iterator insert(const_iterator pos, const Key &key, const T &value)
T value(const Key &key, const T &defaultValue=T()) const
iterator upperBound(const Key &key)
void swap(QMultiMap< Key, T > &other) noexcept
QKeyValueIterator< const Key &, T &, iterator > key_value_iterator
std::pair< iterator, iterator > equal_range(const Key &akey)
iterator erase(const_iterator afirst, const_iterator alast)
key_value_iterator keyValueBegin()
iterator find(const Key &key, const T &value)
const_key_value_iterator keyValueEnd() const
bool isDetached() const noexcept
QList< Key > uniqueKeys() const
auto asKeyValueRange() &&
Key key(const T &value, const Key &defaultKey=Key()) const
const_iterator lowerBound(const Key &key) const
QList< T > values() const
const_iterator cend() const
QMap< QString, QString > map
[6]
QMultiMap< int, QWidget * > multimap
[28]
QSet< QString >::iterator it
Combined button and popup list for selecting options.
std::enable_if_t< std::conjunction_v< QTypeTraits::has_operator_equal_container< Container, T >... >, bool > compare_eq_result_container
auto associative_erase_if(Container &c, Predicate &pred)
QKeyValueRange(Map &) -> QKeyValueRange< Map & >
decltype( std::declval< std::enable_if_t<(sizeof...(T) > 0)> >(),(qHash(std::declval< const T & >()),...), size_t{}) QHashMultiReturnType
static jboolean copy(JNIEnv *, jobject)
#define Q_DECL_DEPRECATED_X(text)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_DECLARE_ASSOCIATIVE_ITERATOR(C)
#define Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(C)
QMultiMap< Key, T > operator+=(QMultiMap< Key, T > &lhs, const QMultiMap< Key, T > &rhs)
qsizetype erase_if(QMap< Key, T > &map, Predicate pred)
QMultiMap< Key, T > operator+(const QMultiMap< Key, T > &lhs, const QMultiMap< Key, T > &rhs)
GLsizei const GLfloat * v
[13]
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLsizei GLsizei GLchar * source
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
#define QT_DEPRECATED_VERSION_X_6_0(text)