Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
4#ifndef QASSOCIATIVEITERABLE_H
5#define QASSOCIATIVEITERABLE_H
6
7#include <QtCore/qiterable.h>
8#include <QtCore/qvariant.h>
9
11
12class Q_CORE_EXPORT QAssociativeIterator : public QIterator<QMetaAssociation>
13{
14public:
17 using reference = QVariantRef<QAssociativeIterator>;
18 using pointer = QVariantPointer<QAssociativeIterator>;
19
23
24 QVariant key() const;
25 QVariantRef<QAssociativeIterator> value() const;
26
27 QVariantRef<QAssociativeIterator> operator*() const;
28 QVariantPointer<QAssociativeIterator> operator->() const;
29};
30
31class Q_CORE_EXPORT QAssociativeConstIterator : public QConstIterator<QMetaAssociation>
32{
33public:
36 using reference = const QVariant &;
38
42
43 QVariant key() const;
44 QVariant value() const;
45
46 QVariant operator*() const;
47 QVariantConstPointer operator->() const;
48};
49
50class Q_CORE_EXPORT QAssociativeIterable : public QIterable<QMetaAssociation>
51{
52public:
53 using iterator = QTaggedIterator<QAssociativeIterator, void>;
54 using const_iterator = QTaggedIterator<QAssociativeConstIterator, void>;
55
56 using RandomAccessIterator = QTaggedIterator<iterator, std::random_access_iterator_tag>;
57 using BidirectionalIterator = QTaggedIterator<iterator, std::bidirectional_iterator_tag>;
58 using ForwardIterator = QTaggedIterator<iterator, std::forward_iterator_tag>;
59 using InputIterator = QTaggedIterator<iterator, std::input_iterator_tag>;
60
61 using RandomAccessConstIterator = QTaggedIterator<const_iterator, std::random_access_iterator_tag>;
62 using BidirectionalConstIterator = QTaggedIterator<const_iterator, std::bidirectional_iterator_tag>;
63 using ForwardConstIterator = QTaggedIterator<const_iterator, std::forward_iterator_tag>;
64 using InputConstIterator = QTaggedIterator<const_iterator, std::input_iterator_tag>;
65
66 template<class T>
68 : QIterable(QMetaAssociation::fromContainer<T>(), p)
69 {
70 }
71
72 template<class T>
74 : QIterable(QMetaAssociation::fromContainer<T>(), p)
75 {
76 }
77
82
83 template<typename Pointer>
84 QAssociativeIterable(const QMetaAssociation &metaAssociation, Pointer iterable)
85 : QIterable(metaAssociation, iterable)
86 {
87 }
88
89 // ### Qt7: Pass QMetaType as value rather than const ref.
90 QAssociativeIterable(const QMetaAssociation &metaAssociation, const QMetaType &metaType,
91 void *iterable)
92 : QIterable(metaAssociation, metaType.alignOf(), iterable)
93 {
94 }
95
96 // ### Qt7: Pass QMetaType as value rather than const ref.
97 QAssociativeIterable(const QMetaAssociation &metaAssociation, const QMetaType &metaType,
98 const void *iterable)
99 : QIterable(metaAssociation, metaType.alignOf(), iterable)
100 {
101 }
102
103 QAssociativeIterable(QIterable<QMetaAssociation> &&other) : QIterable(std::move(other)) {}
104
105 QAssociativeIterable &operator=(QIterable<QMetaAssociation> &&other)
106 {
107 QIterable::operator=(std::move(other));
108 return *this;
109 }
110
111 const_iterator begin() const { return constBegin(); }
112 const_iterator end() const { return constEnd(); }
113
116
119
120 const_iterator find(const QVariant &key) const;
121 const_iterator constFind(const QVariant &key) const { return find(key); }
122 iterator mutableFind(const QVariant &key);
123
124 bool containsKey(const QVariant &key);
125 void insertKey(const QVariant &key);
126 void removeKey(const QVariant &key);
127
128 QVariant value(const QVariant &key) const;
129 void setValue(const QVariant &key, const QVariant &mapped);
130};
131
132template<>
134{
135 if (m_pointer == nullptr)
136 return QVariant();
137
138 const auto metaAssociation = m_pointer->metaContainer();
139 const QMetaType metaType(metaAssociation.mappedMetaType());
140 if (!metaType.isValid())
141 return m_pointer->key();
142
143 QVariant v(metaType);
144 metaAssociation.mappedAtIterator(m_pointer->constIterator(),
145 metaType == QMetaType::fromType<QVariant>() ? &v : v.data());
146 return v;
147}
148
149template<>
150inline QVariantRef<QAssociativeIterator> &QVariantRef<QAssociativeIterator>::operator=(
151 const QVariant &value)
152{
153 if (m_pointer == nullptr)
154 return *this;
155
156 const auto metaAssociation = m_pointer->metaContainer();
157 const QMetaType metaType(metaAssociation.mappedMetaType());
158 if (metaType.isValid()) {
160 metaAssociation.setMappedAtIterator(m_pointer->constIterator(),
161 coercer.coerce(value, metaType));
162 }
163
164 return *this;
165}
166
170
172
173#endif // QASSOCIATIVEITERABLE_H
QAssociativeConstIterator(QConstIterator &&it)
The QAssociativeIterable class is an iterable interface for an associative container in a QVariant.
QTaggedIterator< iterator, std::forward_iterator_tag > ForwardIterator
Exposes an iterator using std::forward_iterator_tag.
QTaggedIterator< const_iterator, std::forward_iterator_tag > ForwardConstIterator
Exposes a const_iterator using std::forward_iterator_tag.
QTaggedIterator< QAssociativeConstIterator, void > const_iterator
const_iterator begin() const
QTaggedIterator< const_iterator, std::random_access_iterator_tag > RandomAccessConstIterator
Exposes a const_iterator using std::random_access_iterator_tag.
QAssociativeIterable(const QMetaAssociation &metaAssociation, const QMetaType &metaType, const void *iterable)
QTaggedIterator< iterator, std::input_iterator_tag > InputIterator
Exposes an iterator using std::input_iterator_tag.
const_iterator constBegin() const
QTaggedIterator< const_iterator, std::bidirectional_iterator_tag > BidirectionalConstIterator
Exposes a const_iterator using std::bidirectional_iterator_tag.
const_iterator constFind(const QVariant &key) const
QAssociativeIterable(QIterable< QMetaAssociation > &&other)
QTaggedIterator< const_iterator, std::input_iterator_tag > InputConstIterator
Exposes a const_iterator using std::input_iterator_tag.
const_iterator constEnd() const
QTaggedIterator< iterator, std::bidirectional_iterator_tag > BidirectionalIterator
Exposes an iterator using std::bidirectional_iterator_tag.
QTaggedIterator< QAssociativeIterator, void > iterator
const_iterator end() const
QAssociativeIterable & operator=(QIterable< QMetaAssociation > &&other)
QAssociativeIterable(const QMetaAssociation &metaAssociation, const QMetaType &metaType, void *iterable)
QTaggedIterator< iterator, std::random_access_iterator_tag > RandomAccessIterator
Exposes an iterator using std::random_access_iterator_tag.
QAssociativeIterable(const QMetaAssociation &metaAssociation, Pointer iterable)
QVariantRef< QAssociativeIterator > reference
QVariantPointer< QAssociativeIterator > pointer
QAssociativeIterator(QIterator &&it)
\inmodule QtCore
Definition qiterable.h:412
QConstIterator< Container > constBegin() const
Returns a QConstIterator for the beginning of the container.
Definition qiterable.h:472
QIterator< Container > mutableEnd()
Returns a QSequentialIterable::iterator for the end of the container.
Definition qiterable.h:487
QIterator< Container > mutableBegin()
Returns a QIterator for the beginning of the container.
Definition qiterable.h:482
QConstIterator< Container > constEnd() const
Returns a Qterable::QConstIterator for the end of the container.
Definition qiterable.h:477
\inmodule QtCore
Definition qmetatype.h:341
bool isValid() const
Emulated const pointer to QVariant based on a pointer.
Definition qvariant.h:859
The QVariantRef acts as a non-const reference to a QVariant.
Definition qvariant.h:835
QVariantRef & operator=(const QVariant &value)
Assigns a new value to the value pointed to by the pointer this QVariantRef refers to.
\inmodule QtCore
Definition qvariant.h:65
QSet< QString >::iterator it
Combined button and popup list for selecting options.
constexpr timespec operator*(const timespec &t1, int mul)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLsizei const GLfloat * v
[13]
GLuint64 key
GLfloat GLfloat p
[1]
@ Q_RELOCATABLE_TYPE
Definition qtypeinfo.h:158
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
Definition qtypeinfo.h:180
settings setValue("DataPump/bgcolor", color)
QObject::connect nullptr
QSharedPointer< T > other(t)
[5]
The QConstIterator allows iteration over a container in a QVariant.
Definition qiterable.h:313
The QIterator is a template class that allows iteration over a container in a QVariant.
Definition qiterable.h:219