43 #include <QtCore/qglobal.h>
44 #include <QtCore/qtypeinfo.h>
45 #include <QtCore/qmetacontainer.h>
46 #include <QtCore/qtaggedpointer.h>
51 template<
typename Type,
typename Storage = Type>
54 enum Tag :
bool { Const, Mutable };
61 : m_pointer(reinterpret_cast<Storage *>(const_cast<
void *>(
pointer)), Const)
68 : m_pointer(reinterpret_cast<Storage *>(
pointer), Mutable)
74 template<
typename InputType>
76 : m_pointer(reinterpret_cast<Storage *>(const_cast<
InputType *>(
pointer)), Const)
78 static_assert(
alignof(
InputType) >=
alignof(Storage));
81 template<
typename InputType>
83 : m_pointer(reinterpret_cast<Storage *>(
pointer), Mutable)
85 static_assert(
alignof(
InputType) >=
alignof(Storage));
92 return reinterpret_cast<const Type *
>(m_pointer.
data());
97 return m_pointer.
tag() == Mutable ?
reinterpret_cast<Type *
>(m_pointer.
data()) :
nullptr;
102 template<
class Iterator,
typename IteratorCategory>
110 if (std::is_base_of_v<std::random_access_iterator_tag, IteratorCategory>
112 qFatal(
"You cannot use this iterator as a random access iterator");
113 this->clearIterator();
116 if (std::is_base_of_v<std::bidirectional_iterator_tag, IteratorCategory>
118 qFatal(
"You cannot use this iterator as a bidirectional iterator");
119 this->clearIterator();
122 if (std::is_base_of_v<std::forward_iterator_tag, IteratorCategory>
124 qFatal(
"You cannot use this iterator as a forward iterator");
125 this->clearIterator();
128 if (std::is_base_of_v<std::input_iterator_tag, IteratorCategory>
130 qFatal(
"You cannot use this iterator as an input iterator");
131 this->clearIterator();
155 template<
class Container>
158 template<
class Container>
163 void *m_iterator =
nullptr;
168 : m_iterable(iterable), m_iterator(
iterator)
172 : m_iterable(iterable), m_iterator(
iterator)
176 : m_iterable(
std::move(
other.m_iterable)), m_iterator(
std::move(
other.m_iterator))
178 other.m_iterator =
nullptr;
182 : m_iterable(
other.m_iterable)
191 if (
this != &
other) {
193 m_iterable = std::move(
other.m_iterable);
194 m_iterator = std::move(
other.m_iterator);
195 other.m_iterator =
nullptr;
202 if (
this != &
other) {
204 m_iterable =
other.m_iterable;
225 m_iterator =
metaContainer().begin(mutableIt->mutableIterable());
228 m_iterator =
metaContainer().constBegin(constIt->constIterable());
249 template<
class Container>
343 template<
class Container>
376 this->constIterable()->constIterable()));
392 this->constIterable()->constIterable()));
415 metaContainer.constBegin(
this->constIterable()->constIterable()));
425 this->constIterable()->constIterable()));
442 template<
class Container>
465 template<
typename Po
inter>
const void * constIterator() const
const QIterable< Container > * constIterable() const
QBaseIterator & operator=(QBaseIterator &&other)
QBaseIterator(const QIterable< Container > *iterable, void *iterator)
QBaseIterator(QBaseIterator &&other)
QBaseIterator & operator=(const QBaseIterator &other)
void initIterator(const void *copy)
QBaseIterator(const QBaseIterator &other)
QBaseIterator(QIterable< Container > *iterable, void *iterator)
QIterable< Container > * mutableIterable() const
Container metaContainer() const
QIterable is a template class that is the base class for QSequentialIterable and QAssociativeIterable...
bool canRandomAccessIterate() const
QConstIterator< Container > constBegin() const
QIterable(const Container &metaContainer, Pointer iterable)
bool canInputIterate() const
QIterator< Container > mutableEnd()
QIterable(const Container &metaContainer, qsizetype alignment, const void *p)
Container m_metaContainer
QIterable(const Container &metaContainer, const T *p)
QIterator< Container > mutableBegin()
Container metaContainer() const
QtPrivate::QConstPreservingPointer< void, quint16 > m_iterable
QIterable(const Container &metaContainer, T *p)
const void * constIterable() const
bool canForwardIterate() const
QIterable(const Container &metaContainer, qsizetype alignment, void *p)
bool canReverseIterate() const
QConstIterator< Container > constEnd() const
QTaggedIterator is a template class that wraps an iterator and exposes standard iterator traits.
bool operator!=(const QTaggedIterator &o) const
QTaggedIterator & operator++()
bool operator<(const QTaggedIterator &j)
QTaggedIterator & operator-=(qsizetype j)
friend QTaggedIterator operator+(qsizetype j, const QTaggedIterator &k)
QTaggedIterator(Iterator &&it)
bool operator<=(const QTaggedIterator &j)
QTaggedIterator operator+(qsizetype j) const
qsizetype operator-(const QTaggedIterator &j) const
QTaggedIterator & operator+=(qsizetype j)
bool operator>(const QTaggedIterator &j)
QTaggedIterator operator--(int x)
QTaggedIterator operator-(qsizetype j) const
QTaggedIterator operator++(int x)
QTaggedIterator & operator--()
bool operator==(const QTaggedIterator &o) const
IteratorCategory iterator_category
bool operator>=(const QTaggedIterator &j)
T * data() const noexcept
QConstPreservingPointer(const void *pointer, qsizetype alignment)
QConstPreservingPointer(const InputType *pointer)
QConstPreservingPointer(void *pointer, qsizetype alignment)
const Type * constPointer() const
QConstPreservingPointer(std::nullptr_t)
QConstPreservingPointer(InputType *pointer)
Type * mutablePointer() const
QConstPreservingPointer()=default
typename C::iterator iterator
QString & operator+=(QString &that, const ProString &other)
constexpr bool operator!=(const timespec &t1, const timespec &t2)
constexpr timespec operator-(const timespec &t1, const timespec &t2)
bool operator==(const QMakeBaseKey &one, const QMakeBaseKey &two)
GLint GLint GLint GLint GLint x
[0]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLsizei const void * pointer
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
The QConstIterator allows iteration over a container in a QVariant.
bool operator==(const QConstIterator &o) const
QConstIterator operator--(int)
QConstIterator operator-(qsizetype j) const
QConstIterator & operator--()
QConstIterator operator+(qsizetype j) const
friend QConstIterator operator+(qsizetype j, const QConstIterator &k)
qsizetype difference_type
QConstIterator & operator++()
qsizetype operator-(const QConstIterator &j) const
QConstIterator & operator+=(qsizetype j)
QConstIterator(const QIterable< Container > *iterable, void *iterator)
QConstIterator operator++(int)
bool operator!=(const QConstIterator &o) const
QConstIterator & operator-=(qsizetype j)
The QIterator is a template class that allows iteration over a container in a QVariant.
bool operator!=(const QIterator &o) const
QIterator & operator-=(qsizetype j)
QIterator operator++(int)
qsizetype operator-(const QIterator &j) const
QIterator & operator+=(qsizetype j)
QIterator(QIterable< Container > *iterable, void *iterator)
QIterator operator+(qsizetype j) const
QIterator operator--(int)
qsizetype difference_type
bool operator==(const QIterator &o) const
friend QIterator operator+(qsizetype j, const QIterator &k)
QIterator operator-(qsizetype j) const