summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qmetacontainer.cpp17
-rw-r--r--src/corelib/kernel/qmetacontainer.h10
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp6
3 files changed, 28 insertions, 5 deletions
diff --git a/src/corelib/kernel/qmetacontainer.cpp b/src/corelib/kernel/qmetacontainer.cpp
index 553deffe33..77ac152508 100644
--- a/src/corelib/kernel/qmetacontainer.cpp
+++ b/src/corelib/kernel/qmetacontainer.cpp
@@ -71,6 +71,23 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ Returns \c true if the underlying container provides at least an input
+ iterator as defined by std::input_iterator_tag, otherwise returns
+ \c false. Forward, Bi-directional, and random access iterators are
+ specializations of input iterators. This method will also return
+ \c true if the container provides one of those.
+
+ QMetaSequence assumes that const and non-const iterators for the same
+ container have the same iterator traits.
+ */
+bool QMetaSequence::hasInputIterator() const
+{
+ if (!d_ptr)
+ return false;
+ return d_ptr->iteratorCapabilities & QtMetaContainerPrivate::InputCapability;
+}
+
+/*!
Returns \c true if the underlying container provides at least a forward
iterator as defined by std::forward_iterator_tag, otherwise returns
\c false. Bi-directional iterators and random access iterators are
diff --git a/src/corelib/kernel/qmetacontainer.h b/src/corelib/kernel/qmetacontainer.h
index 34e99f920d..1e2157951e 100644
--- a/src/corelib/kernel/qmetacontainer.h
+++ b/src/corelib/kernel/qmetacontainer.h
@@ -50,9 +50,10 @@ QT_BEGIN_NAMESPACE
namespace QtMetaContainerPrivate {
enum IteratorCapability : quint8 {
- ForwardCapability = 1 << 0,
- BiDirectionalCapability = 1 << 1,
- RandomAccessCapability = 1 << 2,
+ InputCapability = 1 << 0,
+ ForwardCapability = 1 << 1,
+ BiDirectionalCapability = 1 << 2,
+ RandomAccessCapability = 1 << 3,
};
Q_DECLARE_FLAGS(IteratorCapabilities, IteratorCapability)
@@ -122,6 +123,8 @@ class QMetaSequenceForContainer
{
using Tag = typename std::iterator_traits<Iterator>::iterator_category;
IteratorCapabilities caps {};
+ if constexpr (std::is_base_of_v<std::input_iterator_tag, Tag>)
+ caps |= InputCapability;
if constexpr (std::is_base_of_v<std::forward_iterator_tag, Tag>)
caps |= ForwardCapability;
if constexpr (std::is_base_of_v<std::bidirectional_iterator_tag, Tag>)
@@ -515,6 +518,7 @@ public:
return QMetaSequence(QtMetaContainerPrivate::qMetaSequenceInterfaceForContainer<T>());
}
+ bool hasInputIterator() const;
bool hasForwardIterator() const;
bool hasBidirectionalIterator() const;
bool hasRandomAccessIterator() const;
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index a444a100be..d606f449cf 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -4531,7 +4531,8 @@ void tst_QVariant::shouldDeleteVariantDataWorksForSequential()
QtMetaContainerPrivate::QMetaSequenceInterface metaSequence {};
metaSequence.iteratorCapabilities = QtMetaContainerPrivate::RandomAccessCapability
| QtMetaContainerPrivate::BiDirectionalCapability
- | QtMetaContainerPrivate::ForwardCapability;
+ | QtMetaContainerPrivate::ForwardCapability
+ | QtMetaContainerPrivate::InputCapability;
metaSequence.sizeFn = [](const void *) { return qsizetype(1); };
metaSequence.createConstIteratorFn =
@@ -4680,7 +4681,8 @@ void tst_QVariant::sequentialIterableEndianessSanityCheck()
{
namespace QMTP = QtMetaContainerPrivate;
QMTP::IteratorCapabilities oldIteratorCaps
- = QMTP::ForwardCapability | QMTP::BiDirectionalCapability | QMTP::RandomAccessCapability;
+ = QMTP::InputCapability | QMTP::ForwardCapability
+ | QMTP::BiDirectionalCapability | QMTP::RandomAccessCapability;
QMTP::QMetaSequenceInterface seqImpl {};
QCOMPARE(seqImpl.revision, 0u);
memcpy(&seqImpl.iteratorCapabilities, &oldIteratorCaps, sizeof(oldIteratorCaps));