// Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QSEQUENTIALITERABLE_H #define QSEQUENTIALITERABLE_H #include #include QT_BEGIN_NAMESPACE #if QT_DEPRECATED_SINCE(6, 15) QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED #if defined(Q_CC_GNU_ONLY) && Q_CC_GNU < 1300 // GCC < 13 doesn't accept both deprecation and visibility on the same class #define QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15(text) Q_CORE_EXPORT #else #define QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15(text) \ Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15(text) #endif class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence::Iterable::Iterator instead.") QSequentialIterator : public QIterator { public: using value_type = QVariant; using reference = QVariantRef; using pointer = QVariantPointer; QSequentialIterator(QIterator &&it) : QIterator(std::move(it)) {} QVariantRef operator*() const; QVariantPointer operator->() const; }; class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence::Iterable::ConstIterator instead.") QSequentialConstIterator : public QConstIterator { public: using value_type = QVariant; using reference = const QVariant &; using pointer = QVariantConstPointer; QSequentialConstIterator(QConstIterator &&it) : QConstIterator(std::move(it)) {} QVariant operator*() const; QVariantConstPointer operator->() const; }; class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence::Iterable instead.") QSequentialIterable : public QIterable { public: using iterator = QTaggedIterator; using const_iterator = QTaggedIterator; using RandomAccessIterator = QTaggedIterator; using BidirectionalIterator = QTaggedIterator; using ForwardIterator = QTaggedIterator; using InputIterator = QTaggedIterator; using RandomAccessConstIterator = QTaggedIterator; using BidirectionalConstIterator = QTaggedIterator; using ForwardConstIterator = QTaggedIterator; using InputConstIterator = QTaggedIterator; template QSequentialIterable(const T *p) : QIterable(QMetaSequence::fromContainer(), p) { Q_UNUSED(m_revision); } template QSequentialIterable(T *p) : QIterable(QMetaSequence::fromContainer(), p) { } QSequentialIterable() : QIterable(QMetaSequence(), nullptr) { } template QSequentialIterable(const QMetaSequence &metaSequence, Pointer iterable) : QIterable(metaSequence, iterable) { } QSequentialIterable(const QMetaSequence &metaSequence, const QMetaType &metaType, void *iterable) : QIterable(metaSequence, metaType.alignOf(), iterable) { } QSequentialIterable(const QMetaSequence &metaSequence, const QMetaType &metaType, const void *iterable) : QIterable(metaSequence, metaType.alignOf(), iterable) { } QSequentialIterable(QIterable &&other) : QIterable(std::move(other)) {} QSequentialIterable &operator=(QIterable &&other) { QIterable::operator=(std::move(other)); return *this; } const_iterator begin() const { return constBegin(); } const_iterator end() const { return constEnd(); } const_iterator constBegin() const { return const_iterator(QIterable::constBegin()); } const_iterator constEnd() const { return const_iterator(QIterable::constEnd()); } iterator mutableBegin() { return iterator(QIterable::mutableBegin()); } iterator mutableEnd() { return iterator(QIterable::mutableEnd()); } QVariant at(qsizetype idx) const; void set(qsizetype idx, const QVariant &value); enum Position { Unspecified, AtBegin, AtEnd }; void addValue(const QVariant &value, Position position = Unspecified); void removeValue(Position position = Unspecified); QMetaType valueMetaType() const; }; template<> inline QVariantRef::operator QVariant() const { if (m_pointer == nullptr) return QVariant(); const QMetaType metaType(m_pointer->metaContainer().valueMetaType()); return [&] { QVariant v(metaType); void *dataPtr = metaType == QMetaType::fromType() ? &v : v.data(); m_pointer->metaContainer().valueAtIterator(m_pointer->constIterator(), dataPtr); return v; }(); } template<> inline QVariantRef &QVariantRef::operator=( const QVariant &value) { if (m_pointer == nullptr) return *this; QtPrivate::QVariantTypeCoercer coercer; m_pointer->metaContainer().setValueAtIterator( m_pointer->constIterator(), coercer.coerce(value, m_pointer->metaContainer().valueMetaType())); return *this; } Q_DECLARE_TYPEINFO(QSequentialIterable, Q_RELOCATABLE_TYPE); Q_DECLARE_TYPEINFO(QSequentialIterable::iterator, Q_RELOCATABLE_TYPE); Q_DECLARE_TYPEINFO(QSequentialIterable::const_iterator, Q_RELOCATABLE_TYPE); #undef QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15 QT_WARNING_POP #endif // QT_DEPRECATED_SINCE(6, 15) QT_END_NAMESPACE #endif // QSEQUENTIALITERABLE_H