Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qassociativeiterable.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QASSOCIATIVEITERABLE_H
6#define QASSOCIATIVEITERABLE_H
7
8#include <QtCore/qiterable.h>
9#include <QtCore/qvariant.h>
10
12
13#if QT_DEPRECATED_SINCE(6, 15)
14QT_WARNING_PUSH
15QT_WARNING_DISABLE_DEPRECATED
16
17// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header
18class Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15("Use QMetaAssociation's iterables and iterators instead.") QAssociativeIterator : public QIterator<QMetaAssociation>
19{
20public:
21 using key_type = QVariant;
22 using mapped_type = QVariant;
23 using reference = QVariantRef<QAssociativeIterator>;
24 using pointer = QVariantPointer<QAssociativeIterator>;
25
26 QAssociativeIterator(QIterator &&it)
27 : QIterator(std::move(it))
28 {}
29
30 QVariant key() const;
31 QVariantRef<QAssociativeIterator> value() const;
32
33 QVariantRef<QAssociativeIterator> operator*() const;
34 QVariantPointer<QAssociativeIterator> operator->() const;
35};
36
37// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header
38class Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15("Use QMetaAssociation's iterables and iterators instead.") QAssociativeConstIterator : public QConstIterator<QMetaAssociation>
39{
40public:
41 using key_type = QVariant;
42 using mapped_type = QVariant;
43 using reference = const QVariant &;
44 using pointer = QVariantConstPointer;
45
46 QAssociativeConstIterator(QConstIterator &&it)
47 : QConstIterator(std::move(it))
48 {}
49
50 QVariant key() const;
51 QVariant value() const;
52
53 QVariant operator*() const;
54 QVariantConstPointer operator->() const;
55};
56
57// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header
58class Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15("Use QMetaAssociation's iterables and iterators instead.") QAssociativeIterable : public QIterable<QMetaAssociation>
59{
60public:
61 using iterator = QTaggedIterator<QAssociativeIterator, void>;
62 using const_iterator = QTaggedIterator<QAssociativeConstIterator, void>;
63
64 using RandomAccessIterator = QTaggedIterator<iterator, std::random_access_iterator_tag>;
65 using BidirectionalIterator = QTaggedIterator<iterator, std::bidirectional_iterator_tag>;
66 using ForwardIterator = QTaggedIterator<iterator, std::forward_iterator_tag>;
67 using InputIterator = QTaggedIterator<iterator, std::input_iterator_tag>;
68
69 using RandomAccessConstIterator = QTaggedIterator<const_iterator, std::random_access_iterator_tag>;
70 using BidirectionalConstIterator = QTaggedIterator<const_iterator, std::bidirectional_iterator_tag>;
71 using ForwardConstIterator = QTaggedIterator<const_iterator, std::forward_iterator_tag>;
72 using InputConstIterator = QTaggedIterator<const_iterator, std::input_iterator_tag>;
73
74 template<class T>
75 QAssociativeIterable(const T *p)
76 : QIterable(QMetaAssociation::fromContainer<T>(), p)
77 {
78 }
79
80 template<class T>
81 QAssociativeIterable(T *p)
82 : QIterable(QMetaAssociation::fromContainer<T>(), p)
83 {
84 }
85
86 QAssociativeIterable()
87 : QIterable(QMetaAssociation(), nullptr)
88 {
89 }
90
91 template<typename Pointer>
92 QAssociativeIterable(const QMetaAssociation &metaAssociation, Pointer iterable)
93 : QIterable(metaAssociation, iterable)
94 {
95 }
96
97 QAssociativeIterable(const QMetaAssociation &metaAssociation, const QMetaType &metaType,
98 void *iterable)
99 : QIterable(metaAssociation, metaType.alignOf(), iterable)
100 {
101 }
102
103 QAssociativeIterable(const QMetaAssociation &metaAssociation, const QMetaType &metaType,
104 const void *iterable)
105 : QIterable(metaAssociation, metaType.alignOf(), iterable)
106 {
107 }
108
109 QAssociativeIterable(QIterable<QMetaAssociation> &&other) : QIterable(std::move(other)) {}
110
111 QAssociativeIterable &operator=(QIterable<QMetaAssociation> &&other)
112 {
113 QIterable::operator=(std::move(other));
114 return *this;
115 }
116
117 const_iterator begin() const { return constBegin(); }
118 const_iterator end() const { return constEnd(); }
119
120 const_iterator constBegin() const { return const_iterator(QIterable::constBegin()); }
121 const_iterator constEnd() const { return const_iterator(QIterable::constEnd()); }
122
123 iterator mutableBegin() { return iterator(QIterable::mutableBegin()); }
124 iterator mutableEnd() { return iterator(QIterable::mutableEnd()); }
125
126 const_iterator find(const QVariant &key) const;
127 const_iterator constFind(const QVariant &key) const { return find(key); }
128 iterator mutableFind(const QVariant &key);
129
130 bool containsKey(const QVariant &key);
131 void insertKey(const QVariant &key);
132 void removeKey(const QVariant &key);
133
134 QVariant value(const QVariant &key) const;
135 void setValue(const QVariant &key, const QVariant &mapped);
136};
137
138template<>
139inline QVariantRef<QAssociativeIterator>::operator QVariant() const
140{
141 if (m_pointer == nullptr)
142 return QVariant();
143
144 const auto metaAssociation = m_pointer->metaContainer();
145 const QMetaType metaType(metaAssociation.mappedMetaType());
146 if (!metaType.isValid())
147 return m_pointer->key();
148
149 return [&] {
150 QVariant v(metaType);
151 metaAssociation.mappedAtIterator(m_pointer->constIterator(),
152 metaType == QMetaType::fromType<QVariant>() ? &v : v.data());
153 return v;
154 }();
155}
156
157template<>
158inline QVariantRef<QAssociativeIterator> &QVariantRef<QAssociativeIterator>::operator=(
159 const QVariant &value)
160{
161 if (m_pointer == nullptr)
162 return *this;
163
164 const auto metaAssociation = m_pointer->metaContainer();
165 const QMetaType metaType(metaAssociation.mappedMetaType());
166 if (metaType.isValid()) {
167 QtPrivate::QVariantTypeCoercer coercer;
168 metaAssociation.setMappedAtIterator(m_pointer->constIterator(),
169 coercer.coerce(value, metaType));
170 }
171
172 return *this;
173}
174
175Q_DECLARE_TYPEINFO(QAssociativeIterable, Q_RELOCATABLE_TYPE);
176Q_DECLARE_TYPEINFO(QAssociativeIterable::iterator, Q_RELOCATABLE_TYPE);
177Q_DECLARE_TYPEINFO(QAssociativeIterable::const_iterator, Q_RELOCATABLE_TYPE);
178
179QT_WARNING_POP
180#endif // QT_DEPRECATED_SINCE(6, 15)
181
182QT_END_NAMESPACE
183
184#endif // QASSOCIATIVEITERABLE_H
\inmodule QtCore
Definition qhash.h:843
Definition qlist.h:81
void remove(int from, int to)
bool insertIfNotContains(Key k, const T &f)
bool contains(Key k) const
const T * function(Key k) const
\inmodule QtCore\reentrant
Definition qpoint.h:232
\inmodule QtCore\reentrant
Definition qpoint.h:30
LegacyRegisterOp legacyRegisterOp
Definition qmetatype.h:313
\keyword 16-bit Floating Point Support\inmodule QtCore \inheaderfile QFloat16
Definition qfloat16.h:57
Combined button and popup list for selecting options.
QCborSimpleType
Definition qcborcommon.h:29
QList< QVariant > QVariantList
Definition qjsonarray.h:16
#define qCWarning(category,...)
#define Q_STATIC_LOGGING_CATEGORY(name,...)
#define CONVERT_CBOR_AND_JSON(To)
#define NS(x)
Definition qmetatype.cpp:73
#define QMETATYPE_CONVERTER_ASSIGN_QCHAR(From)
#define QMETATYPE_CONVERTER_ASSIGN_DOUBLE(To, From)
#define INTEGRAL_CONVERTER(To)
static bool tryConvertBuiltinTypes(const void *from, int fromTypeId, void *to, int toTypeId)
#define QMETATYPE_CONVERTER_ASSIGN_NUMBER(To, From)
static bool qIntegerConversionFromFPHelper(From from, To *to)
#define FLOAT_CONVERTER(To)
#define QT_FOR_EACH_STATIC_CORE_POINTER(F)
Definition qmetatype.h:138
#define QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(F)
Definition qmetatype.h:71
#define QT_FOR_EACH_STATIC_PRIMITIVE_NON_VOID_TYPE(F)
Definition qmetatype.h:51
#define QT_FOR_EACH_STATIC_CORE_TEMPLATE(F)
Definition qmetatype.h:152
#define QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(F)
Definition qmetatype.h:75
#define QT_IMPL_METATYPE_EXTERN_TAGGED(TYPE, TAG)
Definition qmetatype.h:1375
#define QT_FOR_EACH_STATIC_CORE_CLASS(F)
Definition qmetatype.h:106
#define QT_FOR_EACH_STATIC_ALIAS_TYPE(F)
Definition qmetatype.h:194
#define QT_FOR_EACH_STATIC_TYPE(F)
Definition qmetatype.h:224
#define QMETATYPE_CONVERTER(To, From, assign_and_return)
Definition qmetatype_p.h:24
#define QMETATYPE_CONVERTER_ASSIGN(To, From)
Definition qmetatype_p.h:35
#define QStringLiteral(str)
Definition qstring.h:1825