16#if qStroika_Foundation_Debug_AssertionsChecked
17 inline ContainerDebugChangeCounts_::ChangeCountType ContainerDebugChangeCounts_::mkInitial_ ()
22 uniform_int_distribution<ChangeCountType> distrib{1, 1000};
26 inline ContainerDebugChangeCounts_::ContainerDebugChangeCounts_ ()
27#if qStroika_Foundation_Debug_AssertionsChecked
28 : fChangeCount{mkInitial_ ()}
32 inline ContainerDebugChangeCounts_::ContainerDebugChangeCounts_ ([[maybe_unused]]
const ContainerDebugChangeCounts_& src)
33#if qStroika_Foundation_Debug_AssertionsChecked
34 : fDeleted{src.fDeleted}
35 , fChangeCount{src.fChangeCount.load ()}
39 inline ContainerDebugChangeCounts_::~ContainerDebugChangeCounts_ ()
41#if qStroika_Foundation_Debug_AssertionsChecked
45 inline void ContainerDebugChangeCounts_::PerformedChange ()
47#if qStroika_Foundation_Debug_AssertionsChecked
57 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename DATASTRUCTURE_CONTAINER_ITERATOR,
typename DATASTRUCTURE_CONTAINER_VALUE>
58 template <
typename... ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS>
59 inline IteratorImplHelper_<T, DATASTRUCTURE_CONTAINER, DATASTRUCTURE_CONTAINER_ITERATOR, DATASTRUCTURE_CONTAINER_VALUE>::IteratorImplHelper_ (
60 const DATASTRUCTURE_CONTAINER* data, [[maybe_unused]]
const ContainerDebugChangeCounts_* changeCounter,
61 ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS&&... args)
62 requires (constructible_from<DATASTRUCTURE_CONTAINER_ITERATOR,
const DATASTRUCTURE_CONTAINER*, ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS...>)
63 : fIterator{data, forward<ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS> (args)...}
65 , fChangeCounter{changeCounter}
66 , fLastCapturedChangeCount{(changeCounter == nullptr) ? 0 : changeCounter->fChangeCount.load ()}
71 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename DATASTRUCTURE_CONTAINER_ITERATOR,
typename DATASTRUCTURE_CONTAINER_VALUE>
72 template <
typename... ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS>
73 inline IteratorImplHelper_<T, DATASTRUCTURE_CONTAINER, DATASTRUCTURE_CONTAINER_ITERATOR, DATASTRUCTURE_CONTAINER_VALUE>::IteratorImplHelper_ (
74 [[maybe_unused]]
const ContainerDebugChangeCounts_* changeCounter, ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS&&... args)
75 requires (constructible_from<DATASTRUCTURE_CONTAINER_ITERATOR, ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS...>)
76 : fIterator{forward<ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS> (args)...}
78 , fChangeCounter{changeCounter}
79 , fLastCapturedChangeCount{(changeCounter == nullptr) ? 0 : changeCounter->fChangeCount.load ()}
83 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename DATASTRUCTURE_CONTAINER_ITERATOR,
typename DATASTRUCTURE_CONTAINER_VALUE>
85 -> unique_ptr<typename
Iterator<T>::IRep>
87 ValidateChangeCount ();
88 return make_unique<IteratorImplHelper_> (*
this);
90 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename DATASTRUCTURE_CONTAINER_ITERATOR,
typename DATASTRUCTURE_CONTAINER_VALUE>
93 if constexpr (convertible_to<
decltype (*fIterator), T>) {
95 ValidateChangeCount ();
97 if (advance) [[likely]] {
98 Require (not fIterator.Done ());
101 if (fIterator.Done ()) [[unlikely]] {
105 *result = *fIterator;
112 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename DATASTRUCTURE_CONTAINER_ITERATOR,
typename DATASTRUCTURE_CONTAINER_VALUE>
113 bool IteratorImplHelper_<T, DATASTRUCTURE_CONTAINER, DATASTRUCTURE_CONTAINER_ITERATOR, DATASTRUCTURE_CONTAINER_VALUE>::Equals (
118 const ActualIterImplType_* rrhs = Debug::UncheckedDynamicCast<const ActualIterImplType_*> (rhs);
119 return fIterator == rrhs->fIterator;
121#if qStroika_Foundation_Debug_AssertionsChecked
122 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename DATASTRUCTURE_CONTAINER_ITERATOR,
typename DATASTRUCTURE_CONTAINER_VALUE>
125 ValidateChangeCount ();
128 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename DATASTRUCTURE_CONTAINER_ITERATOR,
typename DATASTRUCTURE_CONTAINER_VALUE>
131#if qStroika_Foundation_Debug_AssertionsChecked
132 if (fChangeCounter !=
nullptr) {
133 fLastCapturedChangeCount = fChangeCounter->fChangeCount;
137 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename DATASTRUCTURE_CONTAINER_ITERATOR,
typename DATASTRUCTURE_CONTAINER_VALUE>
140#if qStroika_Foundation_Debug_AssertionsChecked
141 if (fChangeCounter !=
nullptr) {
142 Require (not fChangeCounter->fDeleted);
143 Require (fChangeCounter->fChangeCount == fLastCapturedChangeCount);
#define RequireNotReached()
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)
helper to wrap a low level 'DataStructure Container Iterator' into a 'Stroika' Iterator::IRep iterato...
virtual void More(optional< T > *result, bool advance) override
nonvirtual void ValidateChangeCount() const
nonvirtual void UpdateChangeCount()
virtual unique_ptr< typename Iterator< T >::IRep > Clone() const override
Implementation detail for iterator implementors.
An Iterator<T> is a copyable object which allows traversing the contents of some container....