File indexing completed on 2026-10-03 09:21:00
0001
0002
0003
0004
0005 #ifndef QSEQUENTIALITERABLE_H
0006 #define QSEQUENTIALITERABLE_H
0007
0008 #include <QtCore/qiterable.h>
0009 #include <QtCore/qvariant.h>
0010
0011 QT_BEGIN_NAMESPACE
0012
0013 #if QT_DEPRECATED_SINCE(6, 15)
0014 QT_WARNING_PUSH
0015 QT_WARNING_DISABLE_DEPRECATED
0016
0017
0018 class Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15("Use QMetaSequence's iterables and iterators instead.") QSequentialIterator : public QIterator<QMetaSequence>
0019 {
0020 public:
0021 using value_type = QVariant;
0022 using reference = QVariantRef<QSequentialIterator>;
0023 using pointer = QVariantPointer<QSequentialIterator>;
0024
0025 QSequentialIterator(QIterator &&it)
0026 : QIterator(std::move(it))
0027 {}
0028
0029 QVariantRef<QSequentialIterator> operator*() const;
0030 QVariantPointer<QSequentialIterator> operator->() const;
0031 };
0032
0033
0034 class Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15("Use QMetaSequence's iterables and iterators instead.") QSequentialConstIterator : public QConstIterator<QMetaSequence>
0035 {
0036 public:
0037 using value_type = QVariant;
0038 using reference = const QVariant &;
0039 using pointer = QVariantConstPointer;
0040
0041 QSequentialConstIterator(QConstIterator &&it)
0042 : QConstIterator(std::move(it))
0043 {}
0044
0045 QVariant operator*() const;
0046 QVariantConstPointer operator->() const;
0047 };
0048
0049
0050 class Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15("Use QMetaSequence's iterables and iterators instead.") QSequentialIterable : public QIterable<QMetaSequence>
0051 {
0052 public:
0053 using iterator = QTaggedIterator<QSequentialIterator, void>;
0054 using const_iterator = QTaggedIterator<QSequentialConstIterator, void>;
0055
0056 using RandomAccessIterator = QTaggedIterator<iterator, std::random_access_iterator_tag>;
0057 using BidirectionalIterator = QTaggedIterator<iterator, std::bidirectional_iterator_tag>;
0058 using ForwardIterator = QTaggedIterator<iterator, std::forward_iterator_tag>;
0059 using InputIterator = QTaggedIterator<iterator, std::input_iterator_tag>;
0060
0061 using RandomAccessConstIterator = QTaggedIterator<const_iterator, std::random_access_iterator_tag>;
0062 using BidirectionalConstIterator = QTaggedIterator<const_iterator, std::bidirectional_iterator_tag>;
0063 using ForwardConstIterator = QTaggedIterator<const_iterator, std::forward_iterator_tag>;
0064 using InputConstIterator = QTaggedIterator<const_iterator, std::input_iterator_tag>;
0065
0066 template<class T>
0067 QSequentialIterable(const T *p)
0068 : QIterable(QMetaSequence::fromContainer<T>(), p)
0069 {
0070 Q_UNUSED(m_revision);
0071 }
0072
0073 template<class T>
0074 QSequentialIterable(T *p)
0075 : QIterable(QMetaSequence::fromContainer<T>(), p)
0076 {
0077 }
0078
0079 QSequentialIterable()
0080 : QIterable(QMetaSequence(), nullptr)
0081 {
0082 }
0083
0084 template<typename Pointer>
0085 QSequentialIterable(const QMetaSequence &metaSequence, Pointer iterable)
0086 : QIterable(metaSequence, iterable)
0087 {
0088 }
0089
0090 QSequentialIterable(const QMetaSequence &metaSequence, const QMetaType &metaType,
0091 void *iterable)
0092 : QIterable(metaSequence, metaType.alignOf(), iterable)
0093 {
0094 }
0095
0096 QSequentialIterable(const QMetaSequence &metaSequence, const QMetaType &metaType,
0097 const void *iterable)
0098 : QIterable(metaSequence, metaType.alignOf(), iterable)
0099 {
0100 }
0101
0102 QSequentialIterable(QIterable<QMetaSequence> &&other) : QIterable(std::move(other)) {}
0103
0104 QSequentialIterable &operator=(QIterable<QMetaSequence> &&other)
0105 {
0106 QIterable::operator=(std::move(other));
0107 return *this;
0108 }
0109
0110 const_iterator begin() const { return constBegin(); }
0111 const_iterator end() const { return constEnd(); }
0112
0113 const_iterator constBegin() const { return const_iterator(QIterable::constBegin()); }
0114 const_iterator constEnd() const { return const_iterator(QIterable::constEnd()); }
0115
0116 iterator mutableBegin() { return iterator(QIterable::mutableBegin()); }
0117 iterator mutableEnd() { return iterator(QIterable::mutableEnd()); }
0118
0119 QVariant at(qsizetype idx) const;
0120 void set(qsizetype idx, const QVariant &value);
0121
0122 enum Position { Unspecified, AtBegin, AtEnd };
0123 void addValue(const QVariant &value, Position position = Unspecified);
0124 void removeValue(Position position = Unspecified);
0125
0126 QMetaType valueMetaType() const;
0127
0128
0129
0130 constexpr bool canRandomAccessIterate() const { return false; }
0131 };
0132
0133 template<>
0134 inline QVariantRef<QSequentialIterator>::operator QVariant() const
0135 {
0136 if (m_pointer == nullptr)
0137 return QVariant();
0138 const QMetaType metaType(m_pointer->metaContainer().valueMetaType());
0139
0140 return [&] {
0141 QVariant v(metaType);
0142 void *dataPtr = metaType == QMetaType::fromType<QVariant>() ? &v : v.data();
0143 m_pointer->metaContainer().valueAtIterator(m_pointer->constIterator(), dataPtr);
0144 return v;
0145 }();
0146 }
0147
0148 template<>
0149 inline QVariantRef<QSequentialIterator> &QVariantRef<QSequentialIterator>::operator=(
0150 const QVariant &value)
0151 {
0152 if (m_pointer == nullptr)
0153 return *this;
0154
0155 QtPrivate::QVariantTypeCoercer coercer;
0156 m_pointer->metaContainer().setValueAtIterator(
0157 m_pointer->constIterator(),
0158 coercer.coerce(value, m_pointer->metaContainer().valueMetaType()));
0159 return *this;
0160 }
0161
0162 Q_DECLARE_TYPEINFO(QSequentialIterable, Q_RELOCATABLE_TYPE);
0163 Q_DECLARE_TYPEINFO(QSequentialIterable::iterator, Q_RELOCATABLE_TYPE);
0164 Q_DECLARE_TYPEINFO(QSequentialIterable::const_iterator, Q_RELOCATABLE_TYPE);
0165
0166 QT_WARNING_POP
0167 #endif
0168
0169 QT_END_NAMESPACE
0170
0171 #endif