7namespace Stroika::Foundation::Traversal {
9#if qStroika_Foundation_Debug_AssertionsChecked
15 template <
typename T,
typename NEW_ITERATOR_REP_TYPE,
typename CONTEXT_FOR_EACH_ITERATOR>
16 inline IterableFromIterator<T, NEW_ITERATOR_REP_TYPE, CONTEXT_FOR_EACH_ITERATOR>::_Rep::_IteratorTracker::~_IteratorTracker ()
18 Assert (*fCountRunning == 0);
20 template <
typename T,
typename NEW_ITERATOR_REP_TYPE,
typename CONTEXT_FOR_EACH_ITERATOR>
22 IterableFromIterator<T, NEW_ITERATOR_REP_TYPE, CONTEXT_FOR_EACH_ITERATOR>::_Rep::_IteratorTracker::MakeDelegatedIterator (
const Iterator<T>& sourceIterator)
24 return DelegatedIterator<T, shared_ptr<unsigned int>> (sourceIterator, fCountRunning);
33 template <
typename T,
typename NEW_ITERATOR_REP_TYPE,
typename CONTEXT_FOR_EACH_ITERATOR>
34 inline IterableFromIterator<T, NEW_ITERATOR_REP_TYPE, CONTEXT_FOR_EACH_ITERATOR>::_Rep::_Rep (
const _ContextObjectType& contextForEachIterator)
35 requires (same_as<void, CONTEXT_FOR_EACH_ITERATOR>)
36 : _fContextForEachIterator{contextForEachIterator}
39 template <
typename T,
typename NEW_ITERATOR_REP_TYPE,
typename CONTEXT_FOR_EACH_ITERATOR>
40 Iterator<T> IterableFromIterator<T, NEW_ITERATOR_REP_TYPE, CONTEXT_FOR_EACH_ITERATOR>::_Rep::MakeIterator ()
const
42 if constexpr (same_as<NEW_ITERATOR_REP_TYPE, void>) {
47#if qStroika_Foundation_Debug_AssertionsChecked
48 return fIteratorTracker_.MakeDelegatedIterator (Iterator<T>{make_unique<NEW_ITERATOR_REP_TYPE> (_fContextForEachIterator)});
50 return Iterator<T>{make_unique<NEW_ITERATOR_REP_TYPE> (_fContextForEachIterator)};
63 struct MyIterable_ :
public Iterable<T> {
65#if qStroika_Foundation_Debug_AssertionsChecked
67 using _IteratorTracker =
typename inherited::_IteratorTracker;
70#if qStroika_Foundation_Debug_AssertionsChecked
71 mutable _IteratorTracker fIteratorTracker_{};
74 : fOriginalIterator{originalIterator}
79#if qStroika_Foundation_Debug_AssertionsChecked
80 return fIteratorTracker_.MakeDelegatedIterator (fOriginalIterator);
82 return fOriginalIterator;
85 virtual shared_ptr<typename Iterable<T>::_IRep> Clone ()
const override
87 return Memory::MakeSharedPtr<Rep> (*
this);
91 :
Iterable<T>{Memory::MakeSharedPtr<Rep> (originalIterator)}
95 return MyIterable_{iterator};
#define AssertNotReached()
conditional_t< qStroika_Foundation_Memory_PreferBlockAllocation and andTrueCheck, BlockAllocationUseHelper< T >, Common::Empty > UseBlockAllocationIfAppropriate
Use this to enable block allocation for a particular class. Beware of subclassing.
Iterable< T > MakeIterableFromIterator(const Iterator< T > &iterator)
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
An Iterator<T> is a copyable object which allows traversing the contents of some container....