11 template <
typename T,
typename A>
12 constexpr bool IsStdForwardList_ (forward_list<T, A>*)
16 constexpr bool IsStdForwardList_ (...)
21 constexpr bool IsStdForwardList ()
23 return IsStdForwardList_ ((T*)
nullptr);
28#ifndef qStroika_Foundation_Containers_DataStructures_STLContainerWrapper_IncludeSlowDebugChecks_
29#define qStroika_Foundation_Containers_DataStructures_STLContainerWrapper_IncludeSlowDebugChecks_ 0
37 template <
typename STL_CONTAINER_OF_T>
38 template <
typename... EXTRA_ARGS>
40 : inherited{forward<EXTRA_ARGS> (args)...}
43 template <
typename STL_CONTAINER_OF_T>
46 AssertExternallySynchronizedChecker::ReadContext declareContext{*
this};
47 return this->find (item) != this->end ();
49 template <
typename STL_CONTAINER_OF_T>
50 template <invocable<
typename STL_CONTAINER_OF_T::const_iterator,
typename STL_CONTAINER_OF_T::const_iterator> POINT_TO_SAME_THING>
51 void STLContainerWrapper<STL_CONTAINER_OF_T>::MoveIteratorHereAfterClone (ForwardIterator* pi,
const STLContainerWrapper* movedFrom,
52 [[maybe_unused]] POINT_TO_SAME_THING&& pointToSameThingTester)
const
53 requires (convertible_to<invoke_result_t<POINT_TO_SAME_THING, typename STL_CONTAINER_OF_T::const_iterator, typename STL_CONTAINER_OF_T::const_iterator>,
bool>)
55 AssertExternallySynchronizedChecker::ReadContext declareContext{*
this};
61 pi->AssertDataMatches (movedFrom);
62 auto newI = this->begin ();
63 [[maybe_unused]]
auto newE = this->end ();
64 auto oldI = movedFrom->begin ();
65 [[maybe_unused]]
auto oldE = movedFrom->end ();
66 while (not forward<POINT_TO_SAME_THING> (pointToSameThingTester) (oldI, newI)) {
67 Assert (newI != newE);
68 Assert (oldI != oldE);
71 Assert (newI != newE);
72 Assert (oldI != oldE);
74 Assert (oldI == pi->_fStdIterator);
75 pi->_fStdIterator = newI;
78 template <
typename STL_CONTAINER_OF_T>
79 template <invocable<
typename STL_CONTAINER_OF_T::value_type> FUNCTION>
82 AssertExternallySynchronizedChecker::ReadContext declareContext{*
this};
83 for (
auto i = this->begin (); i != this->end (); ++i) {
87 template <
typename STL_CONTAINER_OF_T>
88 template <predicate<
typename STL_CONTAINER_OF_T ::value_type> FUNCTION>
91 AssertExternallySynchronizedChecker::ReadContext declareContext{*
this};
92 for (
auto i = this->begin (); i != this->end (); ++i) {
99 template <
typename STL_CONTAINER_OF_T>
100 template <predicate<
typename STL_CONTAINER_OF_T ::value_type> FUNCTION>
104 for (
auto i = this->begin (); i != this->end (); ++i) {
105 if (firstThat (*i)) {
111 template <
typename STL_CONTAINER_OF_T>
112 template <predicate<
typename STL_CONTAINER_OF_T::value_type> PREDICATE>
113 inline bool STLContainerWrapper<STL_CONTAINER_OF_T>::FindIf (PREDICATE&& pred)
const
115 AssertExternallySynchronizedChecker::ReadContext declareContext{*
this};
116 return find_if (this->begin (), this->end (), forward<PREDICATE> (pred)) != this->end ();
118 template <
typename STL_CONTAINER_OF_T>
119 inline void STLContainerWrapper<STL_CONTAINER_OF_T>::Invariant () const noexcept
122 template <
typename STL_CONTAINER_OF_T>
123 inline auto STLContainerWrapper<STL_CONTAINER_OF_T>::remove_constness (const_iterator it) -> iterator
126 if constexpr (Private_::IsStdForwardList<STL_CONTAINER_OF_T> ()) {
127 return this->erase_after (it, it);
130 return this->erase (it, it);
139 template <
typename STL_CONTAINER_OF_T>
142 , _fStdIterator{startAt}
146 template <
typename STL_CONTAINER_OF_T>
151 template <
typename STL_CONTAINER_OF_T>
156 template <
typename STL_CONTAINER_OF_T>
159#if qStroika_Foundation_Containers_DataStructures_STLContainerWrapper_IncludeSlowDebugChecks_
160 AssertExternallySynchronizedChecker::ReadContext declareContext{*_fData};
163 return _fStdIterator == _fData->end ();
165 template <
typename STL_CONTAINER_OF_T>
166 inline auto STLContainerWrapper<STL_CONTAINER_OF_T>::ForwardIterator::operator++ () noexcept -> ForwardIterator&
168 Require (not AtEnd ());
172 template <
typename STL_CONTAINER_OF_T>
173 inline auto STLContainerWrapper<STL_CONTAINER_OF_T>::ForwardIterator::operator++ (
int)
noexcept -> ForwardIterator
175 ForwardIterator result{*
this};
179 template <
typename STL_CONTAINER_OF_T>
180 inline auto STLContainerWrapper<STL_CONTAINER_OF_T>::ForwardIterator::operator* () const -> const value_type&
182 AssertExternallySynchronizedChecker::ReadContext declareContext{*_fData};
184 Require (not AtEnd ());
185 return *_fStdIterator;
187 template <
typename STL_CONTAINER_OF_T>
190 AssertExternallySynchronizedChecker::ReadContext declareContext{*_fData};
192 Require (not AtEnd ());
193 return &*_fStdIterator;
195 template <
typename STL_CONTAINER_OF_T>
196 inline size_t STLContainerWrapper<STL_CONTAINER_OF_T>::ForwardIterator::CurrentIndex ()
const
198 AssertExternallySynchronizedChecker::ReadContext declareContext{*_fData};
200 return static_cast<size_t> (std::distance (_fData->begin (), _fStdIterator));
202 template <
typename STL_CONTAINER_OF_T>
203 inline auto STLContainerWrapper<STL_CONTAINER_OF_T>::ForwardIterator::GetUnderlyingIteratorRep () const ->
UnderlyingIteratorRep
205 AssertExternallySynchronizedChecker::ReadContext declareContext{*_fData};
206 return _fStdIterator;
208 template <
typename STL_CONTAINER_OF_T>
209 inline void STLContainerWrapper<STL_CONTAINER_OF_T>::ForwardIterator::SetUnderlyingIteratorRep (
UnderlyingIteratorRep l)
211 AssertExternallySynchronizedChecker::ReadContext declareContext{*_fData};
214 template <
typename STL_CONTAINER_OF_T>
217#if qStroika_Foundation_Debug_AssertionsChecked
218 Require (data == _fData);
221 template <
typename STL_CONTAINER_OF_T>
224 AssertExternallySynchronizedChecker::ReadContext declareContext{*_fData};
225 return _fStdIterator == rhs._fStdIterator;
233 template <
typename STL_CONTAINER_OF_T>
236 inherited::operator++ ();
239 template <
typename STL_CONTAINER_OF_T>
246 template <
typename STL_CONTAINER_OF_T>
247 inline bool STLContainerWrapper<STL_CONTAINER_OF_T>::BidirectionalIterator::AtStart () const noexcept
250 return this->_fStdIterator == this->_fData->begin ();
252 template <
typename STL_CONTAINER_OF_T>
255 Require (not this->AtStart ());
256 --this->_fStdIterator;
259 template <
typename STL_CONTAINER_OF_T>
272 template <
typename STL_CONTAINER_OF_T>
275 inherited::operator++ ();
278 template <
typename STL_CONTAINER_OF_T>
285 template <
typename STL_CONTAINER_OF_T>
286 inline auto STLContainerWrapper<STL_CONTAINER_OF_T>::RandomAccessIterator::operator-- () noexcept ->
RandomAccessIterator&
288 inherited::operator-- ();
291 template <
typename STL_CONTAINER_OF_T>
292 inline auto STLContainerWrapper<STL_CONTAINER_OF_T>::RandomAccessIterator::operator-- (
int)
noexcept -> RandomAccessIterator
294 RandomAccessIterator result{*
this};
298 template <
typename STL_CONTAINER_OF_T>
299 inline auto STLContainerWrapper<STL_CONTAINER_OF_T>::RandomAccessIterator::operator+ (difference_type i)
const -> RandomAccessIterator
301 RandomAccessIterator result{*
this};
305 template <
typename STL_CONTAINER_OF_T>
312 template <
typename STL_CONTAINER_OF_T>
316 [[maybe_unused]] difference_type newIdx =
static_cast<difference_type
> (this->
CurrentIndex ()) + i;
317 Require (newIdx >= 0 and
static_cast<size_t> (newIdx) <= this->_fData->size ());
318 this->_fStdIterator += i;
321 template <
typename STL_CONTAINER_OF_T>
322 inline auto STLContainerWrapper<STL_CONTAINER_OF_T>::RandomAccessIterator::operator-= (difference_type i) ->
RandomAccessIterator&
324 return this->operator+= (-i);
326 template <
typename STL_CONTAINER_OF_T>
330 return *(this->_fStdIterator + i);
332 template <
typename STL_CONTAINER_OF_T>
335 return (*
this - rhs) <=> 0;
#define RequireNotNull(p)
#define RequireExpression(c)
like ForwardIterator, but adding the ability to reverse direction.
nonvirtual BidirectionalIterator & operator--() noexcept
nonvirtual BidirectionalIterator & operator++() noexcept
same as inherited operator++ () - advances iterator - but returning the subclass iterator type.
constexpr ForwardIterator() noexcept=default
constexpr void AssertDataMatches(const STLContainerWrapper *data) const
like BidirectionalIterator, but adding random access (operator+=, operator[], etc).
nonvirtual const value_type & operator[](difference_type i) const
access the element at the specified index, relative to the current position.
friend difference_type operator-(const RandomAccessIterator &lhs, const RandomAccessIterator &rhs)
difference between two iterators - handling the 'sentinel' (default-constructed, _fData == nullptr,...
nonvirtual RandomAccessIterator & operator++() noexcept
same as inherited operator++ ()/operator-- () - but returning the subclass iterator type.
const_iterator UnderlyingIteratorRep
STLContainerWrapper(EXTRA_ARGS &&... args)
nonvirtual void Apply(FUNCTION &&doToElement) const
nonvirtual iterator Find(FUNCTION &&firstThat)
unique_lock< AssertExternallySynchronizedChecker > WriteContext
Instantiate AssertExternallySynchronizedChecker::WriteContext to designate an area of code where prot...
A BidirectionalIterator is an Iterator that can be moved both forward and backward.
conditional_t<(sizeof(CHECK_T)<=2 *sizeof(void *)) and is_trivially_copyable_v< CHECK_T >, CHECK_T, const CHECK_T & > ArgByValueType
This is an alias for 'T' - but how we want to pass it on stack as formal parameter.
nonvirtual ForwardIterator & operator++() noexcept
nonvirtual size_t CurrentIndex(const DoublyLinkedList *data) const