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/corelib/kernel/qmetacontainer.h | |
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/corelib/kernel/qmetacontainer.h')
-rw-r--r-- | src/corelib/kernel/qmetacontainer.h | 19 |
1 files changed, 19 insertions, 0 deletions
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; |