Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
IterableFromIterator.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "DelegatedIterator.h"
6
7namespace Stroika::Foundation::Traversal {
8
9#if qStroika_Foundation_Debug_AssertionsChecked
10 /*
11 ********************************************************************************
12 * IterableFromIterator<T, NEW_ITERATOR_REP_TYPE, CONTEXT_FOR_EACH_ITERATOR>::_Rep::_IteratorTracker *
13 ********************************************************************************
14 */
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 ()
17 {
18 Assert (*fCountRunning == 0);
19 }
20 template <typename T, typename NEW_ITERATOR_REP_TYPE, typename CONTEXT_FOR_EACH_ITERATOR>
21 inline Iterator<T>
22 IterableFromIterator<T, NEW_ITERATOR_REP_TYPE, CONTEXT_FOR_EACH_ITERATOR>::_Rep::_IteratorTracker::MakeDelegatedIterator (const Iterator<T>& sourceIterator)
23 {
24 return DelegatedIterator<T, shared_ptr<unsigned int>> (sourceIterator, fCountRunning);
25 }
26#endif
27
28 /*
29 ********************************************************************************
30 * IterableFromIterator<T, NEW_ITERATOR_REP_TYPE, CONTEXT_FOR_EACH_ITERATOR>::_Rep *
31 ********************************************************************************
32 */
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}
37 {
38 }
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
41 {
42 if constexpr (same_as<NEW_ITERATOR_REP_TYPE, void>) {
44 return nullptr;
45 }
46 else {
47#if qStroika_Foundation_Debug_AssertionsChecked
48 return fIteratorTracker_.MakeDelegatedIterator (Iterator<T>{make_unique<NEW_ITERATOR_REP_TYPE> (_fContextForEachIterator)});
49#else
50 return Iterator<T>{make_unique<NEW_ITERATOR_REP_TYPE> (_fContextForEachIterator)};
51#endif
52 }
53 }
54
55 /*
56 ********************************************************************************
57 **************************** MakeIterableFromIterator **************************
58 ********************************************************************************
59 */
60 template <typename T>
62 {
63 struct MyIterable_ : public Iterable<T> {
64 struct Rep : public IterableFromIterator<T>::_Rep, public Memory::UseBlockAllocationIfAppropriate<Rep> {
65#if qStroika_Foundation_Debug_AssertionsChecked
66 using inherited = typename IterableFromIterator<T>::_Rep;
67 using _IteratorTracker = typename inherited::_IteratorTracker;
68#endif
69 Iterator<T> fOriginalIterator;
70#if qStroika_Foundation_Debug_AssertionsChecked
71 mutable _IteratorTracker fIteratorTracker_{};
72#endif
73 Rep (const Iterator<T>& originalIterator)
74 : fOriginalIterator{originalIterator}
75 {
76 }
77 virtual Iterator<T> MakeIterator () const override
78 {
79#if qStroika_Foundation_Debug_AssertionsChecked
80 return fIteratorTracker_.MakeDelegatedIterator (fOriginalIterator);
81#else
82 return fOriginalIterator;
83#endif
84 }
85 virtual shared_ptr<typename Iterable<T>::_IRep> Clone () const override
86 {
87 return Memory::MakeSharedPtr<Rep> (*this);
88 }
89 };
90 MyIterable_ (const Iterator<T>& originalIterator)
91 : Iterable<T>{Memory::MakeSharedPtr<Rep> (originalIterator)}
92 {
93 }
94 };
95 return MyIterable_{iterator};
96 }
97
98}
#define AssertNotReached()
Definition Assertions.h:355
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.
Definition Iterable.h:237
An Iterator<T> is a copyable object which allows traversing the contents of some container....
Definition Iterator.h:225