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 TRAITS>
58 template <
typename... ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS>
59 inline IteratorImplHelper_<T, DATASTRUCTURE_CONTAINER, TRAITS>::IteratorImplHelper_ (
const DATASTRUCTURE_CONTAINER* data,
60 [[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 TRAITS>
72 template <
typename... ADDITIONAL_BACKEND_ITERATOR_CTOR_ARGUMENTS>
73 inline IteratorImplHelper_<T, DATASTRUCTURE_CONTAINER, TRAITS>::IteratorImplHelper_ ([[maybe_unused]]
const ContainerDebugChangeCounts_* changeCounter,
74 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 TRAITS>
86 ValidateChangeCount ();
87 return make_unique<IteratorImplHelper_> (*
this);
89 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename TRAITS>
93 ValidateChangeCount ();
95 if (advance) [[likely]] {
96 Require (not fIterator.Done ());
99 if (fIterator.Done ()) [[unlikely]] {
103 *result = TRAITS::ConvertDataStructureIterationResult2ContainerIteratorResult (*fIterator);
106 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename TRAITS>
111 const ActualIterImplType_* rrhs = Debug::UncheckedDynamicCast<const ActualIterImplType_*> (rhs);
112 return fIterator == rrhs->fIterator;
114#if qStroika_Foundation_Debug_AssertionsChecked
115 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename TRAITS>
116 void IteratorImplHelper_<T, DATASTRUCTURE_CONTAINER, TRAITS>::Invariant () const noexcept
118 ValidateChangeCount ();
121 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename TRAITS>
124#if qStroika_Foundation_Debug_AssertionsChecked
125 if (fChangeCounter !=
nullptr) {
126 fLastCapturedChangeCount = fChangeCounter->fChangeCount;
130 template <
typename T,
typename DATASTRUCTURE_CONTAINER,
typename TRAITS>
133#if qStroika_Foundation_Debug_AssertionsChecked
134 if (fChangeCounter !=
nullptr) {
135 Require (not fChangeCounter->fDeleted);
136 Require (fChangeCounter->fChangeCount == fLastCapturedChangeCount);
#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...
nonvirtual void ValidateChangeCount() const
virtual void More(optional< T > *result, bool advance) override
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....