4#ifndef QASSOCIATIVEITERABLE_H
5#define QASSOCIATIVEITERABLE_H
7#include <QtCore/qiterable.h>
8#include <QtCore/qvariant.h>
15 using key_type = QVariant;
16 using mapped_type = QVariant;
17 using reference = QVariantRef<QAssociativeIterator>;
18 using pointer = QVariantPointer<QAssociativeIterator>;
20 QAssociativeIterator(QIterator &&it)
21 : QIterator(std::move(it))
25 QVariantRef<QAssociativeIterator> value()
const;
27 QVariantRef<QAssociativeIterator> operator*()
const;
28 QVariantPointer<QAssociativeIterator> operator->()
const;
34 using key_type = QVariant;
35 using mapped_type = QVariant;
36 using reference =
const QVariant &;
37 using pointer = QVariantConstPointer;
39 QAssociativeConstIterator(QConstIterator &&it)
40 : QConstIterator(std::move(it))
44 QVariant value()
const;
46 QVariant operator*()
const;
47 QVariantConstPointer operator->()
const;
53 using iterator = QTaggedIterator<QAssociativeIterator,
void>;
54 using const_iterator = QTaggedIterator<QAssociativeConstIterator,
void>;
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>;
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>;
67 QAssociativeIterable(
const T *p)
68 : QIterable(QMetaAssociation::fromContainer<T>(), p)
73 QAssociativeIterable(T *p)
74 : QIterable(QMetaAssociation::fromContainer<T>(), p)
78 QAssociativeIterable()
79 : QIterable(QMetaAssociation(),
nullptr)
83 template<
typename Pointer>
84 QAssociativeIterable(
const QMetaAssociation &metaAssociation, Pointer iterable)
85 : QIterable(metaAssociation, iterable)
90 QAssociativeIterable(
const QMetaAssociation &metaAssociation,
const QMetaType &metaType,
92 : QIterable(metaAssociation, metaType.alignOf(), iterable)
97 QAssociativeIterable(
const QMetaAssociation &metaAssociation,
const QMetaType &metaType,
99 : QIterable(metaAssociation, metaType.alignOf(), iterable)
103 QAssociativeIterable(QIterable<QMetaAssociation> &&other) : QIterable(std::move(other)) {}
105 QAssociativeIterable &operator=(QIterable<QMetaAssociation> &&other)
107 QIterable::operator=(std::move(other));
111 const_iterator begin()
const {
return constBegin(); }
112 const_iterator end()
const {
return constEnd(); }
114 const_iterator constBegin()
const {
return const_iterator(QIterable::constBegin()); }
115 const_iterator constEnd()
const {
return const_iterator(QIterable::constEnd()); }
117 iterator mutableBegin() {
return iterator(QIterable::mutableBegin()); }
118 iterator mutableEnd() {
return iterator(QIterable::mutableEnd()); }
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);
124 bool containsKey(
const QVariant &key);
125 void insertKey(
const QVariant &key);
126 void removeKey(
const QVariant &key);
128 QVariant value(
const QVariant &key)
const;
129 void setValue(
const QVariant &key,
const QVariant &mapped);
133inline QVariantRef<QAssociativeIterator>::operator QVariant()
const
135 if (m_pointer ==
nullptr)
138 const auto metaAssociation = m_pointer->metaContainer();
139 const QMetaType metaType(metaAssociation.mappedMetaType());
140 if (!metaType.isValid())
141 return m_pointer->key();
143 QVariant v(metaType);
144 metaAssociation.mappedAtIterator(m_pointer->constIterator(),
145 metaType == QMetaType::fromType<QVariant>() ? &v : v.data());
150inline QVariantRef<QAssociativeIterator> &QVariantRef<QAssociativeIterator>::operator=(
151 const QVariant &value)
153 if (m_pointer ==
nullptr)
156 const auto metaAssociation = m_pointer->metaContainer();
157 const QMetaType metaType(metaAssociation.mappedMetaType());
158 if (metaType.isValid()) {
159 QtPrivate::QVariantTypeCoercer coercer;
160 metaAssociation.setMappedAtIterator(m_pointer->constIterator(),
161 coercer.coerce(value, metaType));
168Q_DECLARE_TYPEINFO(QAssociativeIterable::iterator, Q_RELOCATABLE_TYPE);
169Q_DECLARE_TYPEINFO(QAssociativeIterable::const_iterator, Q_RELOCATABLE_TYPE);
The QAssociativeIterable class is an iterable interface for an associative container in a QVariant.
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
The QSequentialIterable class is an iterable interface for a container in a QVariant.
\keyword 16-bit Floating Point Support\inmodule QtCore \inheaderfile QFloat16
Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE)
QList< QVariant > QVariantList
#define qCWarning(category,...)
#define Q_STATIC_LOGGING_CATEGORY(name,...)
#define QStringLiteral(str)