summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qsequentialiterable.h
blob: dac146d2ad3438ff038ed11775febc63df6eeb49 (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
// 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 <QtCore/qiterable.h>#include <QtCore/qvariant.h> QT_BEGIN_NAMESPACE class Q_CORE_EXPORT QSequentialIterator :public QIterator<QMetaSequence>{public:using value_type = QVariant;using reference = QVariantRef<QSequentialIterator>;using pointer = QVariantPointer<QSequentialIterator>;QSequentialIterator(QIterator &&it):QIterator(std::move(it)){} QVariantRef<QSequentialIterator>operator*()const; QVariantPointer<QSequentialIterator>operator->()const;};class Q_CORE_EXPORT QSequentialConstIterator :public QConstIterator<QMetaSequence>{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 Q_CORE_EXPORT QSequentialIterable :public QIterable<QMetaSequence>{public:using iterator = QTaggedIterator<QSequentialIterator,void>;using const_iterator = QTaggedIterator<QSequentialConstIterator,void>;using RandomAccessIterator = QTaggedIterator<iterator,std::random_access_iterator_tag>;using BidirectionalIterator = QTaggedIterator<iterator,std::bidirectional_iterator_tag>;using ForwardIterator = QTaggedIterator<iterator,std::forward_iterator_tag>;using InputIterator = QTaggedIterator<iterator,std::input_iterator_tag>;using RandomAccessConstIterator = QTaggedIterator<const_iterator,std::random_access_iterator_tag>;using BidirectionalConstIterator = QTaggedIterator<const_iterator,std::bidirectional_iterator_tag>;using ForwardConstIterator = QTaggedIterator<const_iterator,std::forward_iterator_tag>;using InputConstIterator = QTaggedIterator<const_iterator,std::input_iterator_tag>;template<class T>QSequentialIterable(const T *p):QIterable(QMetaSequence::fromContainer<T>(), p){Q_UNUSED(m_revision);}template<class T>QSequentialIterable(T *p):QIterable(QMetaSequence::fromContainer<T>(), p){}QSequentialIterable():QIterable(QMetaSequence(),nullptr){}template<typename Pointer>QSequentialIterable(const QMetaSequence &metaSequence, Pointer iterable):QIterable(metaSequence, iterable){}// ### Qt7: Pass QMetaType as value rather than const ref.QSequentialIterable(const QMetaSequence &metaSequence,const QMetaType &metaType,void*iterable):QIterable(metaSequence, metaType.alignOf(), iterable){}// ### Qt7: Pass QMetaType as value rather than const ref.QSequentialIterable(const QMetaSequence &metaSequence,const QMetaType &metaType,const void*iterable):QIterable(metaSequence, metaType.alignOf(), iterable){}QSequentialIterable(QIterable<QMetaSequence> &&other) :QIterable(std::move(other)) {} QSequentialIterable &operator=(QIterable<QMetaSequence> &&other){QIterable::operator=(std::move(other));return*this;} const_iterator begin()const{returnconstBegin(); } const_iterator end()const{returnconstEnd(); } const_iterator constBegin()const{returnconst_iterator(QIterable::constBegin()); } const_iterator constEnd()const{returnconst_iterator(QIterable::constEnd()); } iterator mutableBegin() {returniterator(QIterable::mutableBegin()); } iterator mutableEnd() {returniterator(QIterable::mutableEnd()); } QVariant at(qsizetype idx)const;voidset(qsizetype idx,const QVariant &value);enum Position { Unspecified, AtBegin, AtEnd };voidaddValue(const QVariant &value, Position position = Unspecified);voidremoveValue(Position position = Unspecified); QMetaType valueMetaType()const;};template<>inline QVariantRef<QSequentialIterator>::operatorQVariant()const{if(m_pointer ==nullptr)returnQVariant();const QMetaType metaType(m_pointer->metaContainer().valueMetaType()); QVariant v(metaType);void*dataPtr = metaType ==QMetaType::fromType<QVariant>() ? &v : v.data(); m_pointer->metaContainer().valueAtIterator(m_pointer->constIterator(), dataPtr);return v;}template<>inline QVariantRef<QSequentialIterator> &QVariantRef<QSequentialIterator>::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); QT_END_NAMESPACE #endif// QSEQUENTIALITERABLE_H
close