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
qsequentialiterable.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 QSEQUENTIALITERABLE_H
5#define QSEQUENTIALITERABLE_H
6
7#include <QtCore/qiterable.h>
8#include <QtCore/qvariant.h>
9
11
12class Q_CORE_EXPORT QSequentialIterator : public QIterator<QMetaSequence>
13{
14public:
16 using reference = QVariantRef<QSequentialIterator>;
17 using pointer = QVariantPointer<QSequentialIterator>;
18
22
23 QVariantRef<QSequentialIterator> operator*() const;
24 QVariantPointer<QSequentialIterator> operator->() const;
25};
26
27class Q_CORE_EXPORT QSequentialConstIterator : public QConstIterator<QMetaSequence>
28{
29public:
31 using reference = const QVariant &;
33
37
38 QVariant operator*() const;
39 QVariantConstPointer operator->() const;
40};
41
42class Q_CORE_EXPORT QSequentialIterable : public QIterable<QMetaSequence>
43{
44public:
45 using iterator = QTaggedIterator<QSequentialIterator, void>;
46 using const_iterator = QTaggedIterator<QSequentialConstIterator, void>;
47
48 using RandomAccessIterator = QTaggedIterator<iterator, std::random_access_iterator_tag>;
49 using BidirectionalIterator = QTaggedIterator<iterator, std::bidirectional_iterator_tag>;
50 using ForwardIterator = QTaggedIterator<iterator, std::forward_iterator_tag>;
51 using InputIterator = QTaggedIterator<iterator, std::input_iterator_tag>;
52
53 using RandomAccessConstIterator = QTaggedIterator<const_iterator, std::random_access_iterator_tag>;
54 using BidirectionalConstIterator = QTaggedIterator<const_iterator, std::bidirectional_iterator_tag>;
55 using ForwardConstIterator = QTaggedIterator<const_iterator, std::forward_iterator_tag>;
56 using InputConstIterator = QTaggedIterator<const_iterator, std::input_iterator_tag>;
57
58 template<class T>
60 : QIterable(QMetaSequence::fromContainer<T>(), p)
61 {
62 Q_UNUSED(m_revision);
63 }
64
65 template<class T>
67 : QIterable(QMetaSequence::fromContainer<T>(), p)
68 {
69 }
70
75
76 template<typename Pointer>
77 QSequentialIterable(const QMetaSequence &metaSequence, Pointer iterable)
78 : QIterable(metaSequence, iterable)
79 {
80 }
81
82 // ### Qt7: Pass QMetaType as value rather than const ref.
83 QSequentialIterable(const QMetaSequence &metaSequence, const QMetaType &metaType,
84 void *iterable)
85 : QIterable(metaSequence, metaType.alignOf(), iterable)
86 {
87 }
88
89 // ### Qt7: Pass QMetaType as value rather than const ref.
90 QSequentialIterable(const QMetaSequence &metaSequence, const QMetaType &metaType,
91 const void *iterable)
92 : QIterable(metaSequence, metaType.alignOf(), iterable)
93 {
94 }
95
96 QSequentialIterable(QIterable<QMetaSequence> &&other) : QIterable(std::move(other)) {}
97
98 QSequentialIterable &operator=(QIterable<QMetaSequence> &&other)
99 {
100 QIterable::operator=(std::move(other));
101 return *this;
102 }
103
104 const_iterator begin() const { return constBegin(); }
105 const_iterator end() const { return constEnd(); }
106
109
112
113 QVariant at(qsizetype idx) const;
114 void set(qsizetype idx, const QVariant &value);
115
116 enum Position { Unspecified, AtBegin, AtEnd };
117 void addValue(const QVariant &value, Position position = Unspecified);
118 void removeValue(Position position = Unspecified);
119
120 QMetaType valueMetaType() const;
121};
122
123template<>
125{
126 if (m_pointer == nullptr)
127 return QVariant();
128 const QMetaType metaType(m_pointer->metaContainer().valueMetaType());
129 QVariant v(metaType);
130 void *dataPtr = metaType == QMetaType::fromType<QVariant>() ? &v : v.data();
131 m_pointer->metaContainer().valueAtIterator(m_pointer->constIterator(), dataPtr);
132 return v;
133}
134
135template<>
136inline QVariantRef<QSequentialIterator> &QVariantRef<QSequentialIterator>::operator=(
137 const QVariant &value)
138{
139 if (m_pointer == nullptr)
140 return *this;
141
143 m_pointer->metaContainer().setValueAtIterator(
144 m_pointer->constIterator(),
145 coercer.coerce(value, m_pointer->metaContainer().valueMetaType()));
146 return *this;
147}
148
152
154
155#endif // QSEQUENTIALITERABLE_H
\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
\inmodule QtCore
Definition qmetatype.h:341
QSequentialConstIterator(QConstIterator &&it)
The QSequentialIterable class is an iterable interface for a container in a QVariant.
const_iterator constBegin() const
QTaggedIterator< iterator, std::bidirectional_iterator_tag > BidirectionalIterator
Exposes an iterator using std::bidirectional_iterator_tag.
QTaggedIterator< iterator, std::input_iterator_tag > InputIterator
Exposes an iterator using std::input_iterator_tag.
QTaggedIterator< const_iterator, std::input_iterator_tag > InputConstIterator
Exposes a const_iterator using std::input_iterator_tag.
QTaggedIterator< const_iterator, std::forward_iterator_tag > ForwardConstIterator
Exposes a const_iterator using std::forward_iterator_tag.
QSequentialIterable & operator=(QIterable< QMetaSequence > &&other)
QTaggedIterator< iterator, std::forward_iterator_tag > ForwardIterator
Exposes an iterator using std::forward_iterator_tag.
QSequentialIterable(const QMetaSequence &metaSequence, const QMetaType &metaType, const void *iterable)
const_iterator end() const
QTaggedIterator< const_iterator, std::bidirectional_iterator_tag > BidirectionalConstIterator
Exposes a const_iterator using std::bidirectional_iterator_tag.
QTaggedIterator< iterator, std::random_access_iterator_tag > RandomAccessIterator
Exposes an iterator using std::random_access_iterator_tag.
QSequentialIterable(QIterable< QMetaSequence > &&other)
const_iterator constEnd() const
QSequentialIterable(const QMetaSequence &metaSequence, Pointer iterable)
QTaggedIterator< QSequentialIterator, void > iterator
QTaggedIterator< const_iterator, std::random_access_iterator_tag > RandomAccessConstIterator
Exposes a const_iterator using std::random_access_iterator_tag.
const_iterator begin() const
QSequentialIterable(const QMetaSequence &metaSequence, const QMetaType &metaType, void *iterable)
QTaggedIterator< QSequentialConstIterator, void > const_iterator
QVariantRef< QSequentialIterator > reference
QSequentialIterator(QIterator &&it)
QVariantPointer< QSequentialIterator > pointer
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]
GLfloat GLfloat p
[1]
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define Q_UNUSED(x)
@ Q_RELOCATABLE_TYPE
Definition qtypeinfo.h:158
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
Definition qtypeinfo.h:180
ptrdiff_t qsizetype
Definition qtypes.h:165
QFuture< QSet< QChar > > set
[10]
QObject::connect nullptr
QSharedPointer< T > other(t)
[5]
QAction * at
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