Qt 6.x
The Qt SDK
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:
19
21 : QIterator(std::move(it))
22 {}
23
24 QVariant key() const;
26
29};
30
31class Q_CORE_EXPORT QAssociativeConstIterator : public QConstIterator<QMetaAssociation>
32{
33public:
36 using reference = const QVariant &;
38
40 : QConstIterator(std::move(it))
41 {}
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:
55
60
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
80 {
81 }
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
104
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<>
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.
const_iterator begin() const
QAssociativeIterable(const QMetaAssociation &metaAssociation, const QMetaType &metaType, const void *iterable)
const_iterator constBegin() const
const_iterator constFind(const QVariant &key) const
QAssociativeIterable(QIterable< QMetaAssociation > &&other)
const_iterator constEnd() const
const_iterator end() const
QAssociativeIterable & operator=(QIterable< QMetaAssociation > &&other)
QAssociativeIterable(const QMetaAssociation &metaAssociation, const QMetaType &metaType, void *iterable)
QAssociativeIterable(const QMetaAssociation &metaAssociation, Pointer iterable)
QAssociativeIterator(QIterator &&it)
\inmodule QtCore
Definition qiterable.h:408
QConstIterator< Container > constBegin() const
Returns a QConstIterator for the beginning of the container.
Definition qiterable.h:468
QIterator< Container > mutableEnd()
Returns a QSequentialIterable::iterator for the end of the container.
Definition qiterable.h:483
QIterator< Container > mutableBegin()
Returns a QIterator for the beginning of the container.
Definition qiterable.h:478
QConstIterator< Container > constEnd() const
Returns a Qterable::QConstIterator for the end of the container.
Definition qiterable.h:473
\inmodule QtCore
Definition qmetatype.h:320
bool isValid() const
QTaggedIterator is a template class that wraps an iterator and exposes standard iterator traits.
Definition qiterable.h:68
Emulated const pointer to QVariant based on a pointer.
Definition qvariant.h:850
QVariantPointer is a template class that emulates a pointer to QVariant based on a pointer.
Definition qvariant.h:863
The QVariantRef acts as a non-const reference to a QVariant.
Definition qvariant.h:826
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:64
const void * coerce(const QVariant &value, const QMetaType &type)
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:145
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
Definition qtypeinfo.h:163
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:309
The QIterator is a template class that allows iteration over a container in a QVariant.
Definition qiterable.h:215