summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-09-08 15:34:42 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-09-12 09:12:41 +0200
commita7b85e59931443dd33adeb02c7201c1bd1d7cd1d (patch)
tree462e58e1a438174fa80c514ee5f25af8f3b44522 /src
parentac493c335c5465ede7fc8bf139e5e2fac8ae522e (diff)
QMetaContainer: Add function to erase ranges from sequences
Change-Id: Ic51103c36d288f236106e2d3aec1401d53b97a15 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/global/qcontainerinfo.h5
-rw-r--r--src/corelib/kernel/qmetacontainer.cpp24
-rw-r--r--src/corelib/kernel/qmetacontainer.h19
3 files changed, 48 insertions, 0 deletions
diff --git a/src/corelib/global/qcontainerinfo.h b/src/corelib/global/qcontainerinfo.h
index ad3ef301e4..c6ee9328ec 100644
--- a/src/corelib/global/qcontainerinfo.h
+++ b/src/corelib/global/qcontainerinfo.h
@@ -141,6 +141,11 @@ constexpr bool can_erase_at_iterator_v = false;
template<typename C>
constexpr bool can_erase_at_iterator_v<C, std::void_t<decltype(C().erase(C().begin()))>> = true;
+template<typename, typename = void>
+constexpr bool can_erase_range_at_iterator_v = false;
+template<typename C>
+constexpr bool can_erase_range_at_iterator_v<C, std::void_t<decltype(C().erase(C().begin(), C().end()))>> = true;
+
QT_WARNING_POP
}
diff --git a/src/corelib/kernel/qmetacontainer.cpp b/src/corelib/kernel/qmetacontainer.cpp
index e11381c1bd..9382909092 100644
--- a/src/corelib/kernel/qmetacontainer.cpp
+++ b/src/corelib/kernel/qmetacontainer.cpp
@@ -641,6 +641,30 @@ void QMetaSequence::eraseValueAtIterator(void *container, const void *iterator)
}
/*!
+ Returns \c true if a range between two iterators can be erased from the
+ container, \c false otherwise.
+ */
+bool QMetaSequence::canEraseRangeAtIterator() const
+{
+ if (d_ptr)
+ return d_ptr->eraseRangeAtIteratorFn;
+ return false;
+}
+
+/*!
+ Erases the range of values between the iterators \a iterator1 and
+ \a iterator2 from the \a container, if possible.
+
+ \sa canEraseValueAtIterator(), begin(), end()
+ */
+void QMetaSequence::eraseRangeAtIterator(void *container, const void *iterator1,
+ const void *iterator2) const
+{
+ if (canEraseRangeAtIterator())
+ d_ptr->eraseRangeAtIteratorFn(container, iterator1, iterator2);
+}
+
+/*!
Returns \c true if the underlying container offers a const iterator,
\c false otherwise.
diff --git a/src/corelib/kernel/qmetacontainer.h b/src/corelib/kernel/qmetacontainer.h
index f3a6266eb4..1f7771a0bc 100644
--- a/src/corelib/kernel/qmetacontainer.h
+++ b/src/corelib/kernel/qmetacontainer.h
@@ -113,6 +113,8 @@ public:
InsertValueAtIteratorFn insertValueAtIteratorFn;
using EraseValueAtIteratorFn = void(*)(void *, const void *);
EraseValueAtIteratorFn eraseValueAtIteratorFn;
+ using EraseRangeAtIteratorFn = void(*)(void *, const void *, const void *);
+ EraseRangeAtIteratorFn eraseRangeAtIteratorFn;
using CreateConstIteratorFn = void *(*)(const void *, Position);
CreateConstIteratorFn createConstIteratorFn;
@@ -446,6 +448,19 @@ class QMetaSequenceForContainer
}
}
+ static constexpr QMetaSequenceInterface::EraseRangeAtIteratorFn getEraseRangeAtIteratorFn()
+ {
+ if constexpr (QContainerTraits::has_iterator_v<C>
+ && QContainerTraits::can_erase_range_at_iterator_v<C> && !std::is_const_v<C>) {
+ return [](void *c, const void *i, const void *j) {
+ static_cast<C *>(c)->erase(*static_cast<const QContainerTraits::iterator<C> *>(i),
+ *static_cast<const QContainerTraits::iterator<C> *>(j));
+ };
+ } else {
+ return nullptr;
+ }
+ }
+
static constexpr QMetaSequenceInterface::CreateConstIteratorFn getCreateConstIteratorFn()
{
if constexpr (QContainerTraits::has_const_iterator_v<C>) {
@@ -565,6 +580,7 @@ QMetaSequenceInterface QMetaSequenceForContainer<C>::metaSequence = {
/*.setValueAtIteratorFn=*/ getSetValueAtIteratorFn(),
/*.insertValueAtIteratorFn=*/ getInsertValueAtIteratorFn(),
/*.eraseValueAtIteratorFn=*/ getEraseValueAtIteratorFn(),
+ /*.eraseRangeAtIteratorFn=*/ getEraseRangeAtIteratorFn(),
/*.createConstIteratorFn=*/ getCreateConstIteratorFn(),
/*.destroyConstIteratorFn=*/ getDestroyConstIteratorFn(),
/*.equalConstIteratorFn=*/ getCompareConstIteratorFn(),
@@ -659,6 +675,9 @@ public:
void advanceConstIterator(void *iterator, qsizetype step) const;
qsizetype diffConstIterator(const void *i, const void *j) const;
+ bool canEraseRangeAtIterator() const;
+ void eraseRangeAtIterator(void *container, const void *iterator1, const void *iterator2) const;
+
bool canGetValueAtConstIterator() const;
void valueAtConstIterator(const void *iterator, void *result) const;