8#include <QtCore/qiterator.h>
9#include <QtCore/qlist.h>
10#include <QtCore/qrefcount.h>
11#include <QtCore/qpair.h>
12#include <QtCore/qshareddata.h>
13#include <QtCore/qshareddata_impl.h>
16#include <initializer_list>
23template <
typename AMap>
28 using Key =
typename Map::key_type;
29 using T =
typename Map::mapped_type;
35 static_assert(std::is_nothrow_destructible_v<Key>,
"Types with throwing destructors are not supported in Qt containers.");
36 static_assert(std::is_nothrow_destructible_v<T>,
"Types with throwing destructors are not supported in Qt containers.");
56 const auto &keyCompare =
source.key_comp();
59 if (!keyCompare(
key,
v.first) && !keyCompare(
v.first,
key)) {
68 std::inserter(
m,
m.end()),
78 return [&
value](
const auto &
v) {
return v.second ==
value; };
83 auto i = std::find_if(
m.cbegin(),
97 const auto extractKey = [](
const auto &
v) {
return v.first; };
99 std::transform(
m.cbegin(),
101 std::back_inserter(
result),
111 for (
const auto &
v :
m) {
124 const auto extractValue = [](
const auto &
v) {
return v.second; };
126 std::transform(
m.cbegin(),
128 std::back_inserter(
result),
152 const auto newDataEnd =
result.it;
155 const auto e =
m.end();
169 result.data->m.insert(newDataEnd, *
i);
173 if (
result.it != newDataEnd)
184template <
class Key,
class T>
187 using Map = std::map<Key, T>;
208 QMap(std::initializer_list<std::pair<Key, T>>
list)
237 return std::move(
d->m);
244 template <
typename AKey = Key,
typename AT = T>
friend
252 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
255 template <
typename AKey = Key,
typename AT = T>
friend
258 return !(lhs == rhs);
268 bool isEmpty()
const {
return d ?
d->m.empty() :
true; }
280 return d ? !
d.isShared() :
false;
315 template <
typename Predicate>
331 auto i =
d->m.find(
key);
332 if (
i !=
d->m.end()) {
333 T
result(std::move(
i->second));
344 auto i =
d->m.find(
key);
345 return i !=
d->m.end();
353 return d->key(
value, defaultKey);
360 const auto i =
d->m.find(
key);
361 if (
i !=
d->m.cend())
370 auto i =
d->m.find(
key);
407 return d->count(
key);
423 class const_iterator;
430 typename Map::iterator
i;
471#if QT_DEPRECATED_SINCE(6, 0)
499 typename Map::const_iterator
i;
513 const T &
value()
const {
return i->second; }
542#if QT_DEPRECATED_SINCE(6, 0)
629 return iterator(
d->m.erase(afirst.i, alast.i));
631 auto result =
d->erase(afirst.i, alast.i);
698 typename Map::const_iterator dpos;
700 if (!
d ||
d.isShared()) {
701 auto posDistance =
d ? std::distance(
d->m.cbegin(),
pos.i) : 0;
703 dpos = std::next(
d->m.cbegin(), posDistance);
718#ifdef __cpp_lib_node_extract
720 copy.merge(std::move(
d->m));
721 d->m = std::move(
copy);
725 auto insertionHint =
d->m.end();
726 auto mapIt =
map.d->m.crbegin();
727 auto end =
map.d->m.crend();
728 for (; mapIt !=
end; ++mapIt)
729 insertionHint =
d->m.insert_or_assign(insertionHint, mapIt->first, mapIt->second);
735 if (!
map.d ||
map.d->m.empty())
738 if (
map.d.isShared()) {
746#ifdef __cpp_lib_node_extract
747 map.d->m.merge(std::move(
d->m));
748 *
this = std::move(
map);
751 auto insertionHint =
d->m.end();
752 auto mapIt =
map.d->m.crbegin();
753 auto end =
map.d->m.crend();
754 for (; mapIt !=
end; ++mapIt)
755 insertionHint =
d->m.insert_or_assign(insertionHint, std::move(mapIt->first), std::move(mapIt->second));
769 auto result =
d->m.equal_range(akey);
777 auto result =
d->m.equal_range(akey);
785template <
typename Key,
typename T,
typename Predicate>
795template <
class Key,
class T>
798 using Map = std::multimap<Key, T>;
828 d->m.insert(
other.d->m.begin(),
838 if (
other.d.isShared()) {
839 d->m.insert(
other.d->m.begin(),
842#ifdef __cpp_lib_node_extract
843 d->m.merge(std::move(
other.d->m));
845 d->m.insert(std::make_move_iterator(
other.d->m.begin()),
846 std::make_move_iterator(
other.d->m.end()));
882 return std::move(
d->m);
889 template <
typename AKey = Key,
typename AT = T>
friend
897 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
900 template <
typename AKey = Key,
typename AT = T>
friend
903 return !(lhs == rhs);
913 bool isEmpty()
const {
return d ?
d->m.empty() :
true; }
925 return d ? !
d.isShared() :
false;
969 const T valueCopy =
value;
975 const auto &keyCompare =
d->m.key_comp();
977 auto i =
d->m.find(keyCopy);
978 const auto e =
d->m.end();
980 while (
i !=
e && !keyCompare(keyCopy,
i->first)) {
981 if (
i->second == valueCopy) {
992 template <
typename Predicate>
1009 auto i =
d->m.find(
key);
1010 if (
i !=
d->m.end()) {
1011 T
result(std::move(
i->second));
1022 auto i =
d->m.find(
key);
1023 return i !=
d->m.end();
1036 return d->key(
value, defaultKey);
1042 return defaultValue;
1043 const auto i =
d->m.find(
key);
1044 if (
i !=
d->m.cend())
1046 return defaultValue;
1072 std::back_inserter(
result));
1098 return d->count(
key);
1122 class const_iterator;
1129 typename Map::iterator
i;
1170#if QT_DEPRECATED_SINCE(6, 0)
1198 typename Map::const_iterator
i;
1241#if QT_DEPRECATED_SINCE(6, 0)
1328 return iterator(
d->m.erase(afirst.i, alast.i));
1330 auto result =
d->erase(afirst.i, alast.i);
1431 auto i =
d->m.lower_bound(
key);
1432 return iterator(
d->m.insert(
i, {key, value}));
1438 typename Map::const_iterator dpos;
1439 if (!
d ||
d.isShared()) {
1440 auto posDistance =
d ? std::distance(
d->m.cbegin(),
pos.i) : 0;
1442 dpos = std::next(
d->m.cbegin(), posDistance);
1446 return iterator(
d->m.insert(dpos, {key, value}));
1449#if QT_DEPRECATED_SINCE(6, 0)
1451 iterator insertMulti(const
Key &
key, const T &
value)
1456 iterator insertMulti(const_iterator
pos, const
Key &
key, const T &
value)
1483 auto i =
d->m.find(
key);
1484 if (
i !=
d->m.end())
1499 auto result =
d->m.equal_range(akey);
1507 auto result =
d->m.equal_range(akey);
1513 if (
other.isEmpty())
1519#ifdef __cpp_lib_node_extract
1520 copy.merge(std::move(
d->m));
1522 copy.insert(std::make_move_iterator(
d->m.begin()),
1523 std::make_move_iterator(
d->m.end()));
1525 d->m = std::move(
copy);
1534 if (
other.d.isShared()) {
1542#ifdef __cpp_lib_node_extract
1543 other.d->m.merge(std::move(
d->m));
1545 other.d->m.insert(std::make_move_iterator(
d->m.begin()),
1546 std::make_move_iterator(
d->m.end()));
1548 *
this = std::move(
other);
1556template <
typename Key,
typename T>
1564template <
typename Key,
typename T>
1567 return lhs.
unite(rhs);
1570template <
typename Key,
typename T,
typename Predicate>
QPair< 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() &&
QPair< iterator, iterator > equal_range(const Key &akey)
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)
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
const_iterator constFind(const Key &key) const
QList< Key > keys() const
bool isSharedWith(const QMap< Key, T > &other) const noexcept
QPair< const_iterator, const_iterator > equal_range(const Key &akey) const
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() &&
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
QPair< iterator, iterator > equal_range(const Key &akey)
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)
QPair< const_iterator, const_iterator > equal_range(const Key &akey) const
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
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
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)
static jboolean copy(JNIEnv *, jobject)
#define Q_DECL_DEPRECATED_X(text)
std::pair< T1, T2 > QPair
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
#define QT_DEPRECATED_VERSION_X_6_0(text)