diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-09-08 15:34:42 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-09-12 09:12:41 +0200 |
commit | a7b85e59931443dd33adeb02c7201c1bd1d7cd1d (patch) | |
tree | 462e58e1a438174fa80c514ee5f25af8f3b44522 /src | |
parent | ac493c335c5465ede7fc8bf139e5e2fac8ae522e (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.h | 5 | ||||
-rw-r--r-- | src/corelib/kernel/qmetacontainer.cpp | 24 | ||||
-rw-r--r-- | src/corelib/kernel/qmetacontainer.h | 19 |
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; |