6namespace Stroika::Foundation::Traversal {
10 struct [[deprecated (
"Since Stroika v3.0d1")]] IteratorBase {
12 template <
typename SHARED_T>
13 using PtrImplementationTemplate [[deprecated (
"Since Stroika v3.0d1 - use unique_ptr directly")]] = unique_ptr<SHARED_T>;
16 template <
typename SHARED_T,
typename... ARGS_TYPE>
17 [[deprecated (
"Since Stroika v3.0d1 - make_unique directly")]]
static unique_ptr<SHARED_T> MakeSmartPtr (ARGS_TYPE&&... args)
19 return make_unique<SHARED_T> (forward<ARGS_TYPE> (args)...);
28#if qStroika_Foundation_Debug_AssertionsChecked
29 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
30 inline void Iterator<T, ITERATOR_TRAITS>::IRep::Invariant () const noexcept
40 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
43 , _fCurrentValue{fRep_->Current ()}
48 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
49 inline Iterator<T, ITERATOR_TRAITS>::Iterator (unique_ptr<IRep>&& rep) noexcept
51 , _fCurrentValue{fRep_->Current ()}
56 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
57 inline Iterator<T, ITERATOR_TRAITS>::Iterator (
const Iterator& src)
58 : fRep_{src.fRep_ == nullptr ? nullptr : Clone_ (*src.fRep_)}
59 , _fCurrentValue{src._fCurrentValue}
63 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
64 inline Iterator<T, ITERATOR_TRAITS>::Iterator (Iterator&& src) noexcept
65 : fRep_{move (src.fRep_)}
66 , _fCurrentValue{move (src._fCurrentValue)}
70 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
71 constexpr Iterator<T, ITERATOR_TRAITS>::Iterator (
const default_sentinel_t&) noexcept
76 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
77 constexpr Iterator<T, ITERATOR_TRAITS>::Iterator (nullptr_t) noexcept
78 : Iterator{default_sentinel}
81 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
82 constexpr Iterator<T, ITERATOR_TRAITS>::Iterator () noexcept
83 : Iterator{default_sentinel}
86 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
89 if (&rhs !=
this) [[likely]] {
90 fRep_ = rhs.fRep_ ==
nullptr ? nullptr : Clone_ (*rhs.fRep_);
91 _fCurrentValue = rhs._fCurrentValue;
96 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
99 if (&rhs !=
this) [[likely]] {
100 fRep_ = move (rhs.fRep_);
101 _fCurrentValue = move (rhs._fCurrentValue);
106 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
112 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
118 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
121 this->_fCurrentValue = fRep_->Current ();
124 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
130 Assert ((not this->_fCurrentValue.has_value ()) == fRep_->AtEnd ());
134 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
138 Require (_fCurrentValue.has_value ());
140 return *_fCurrentValue;
142 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
146 return not _fCurrentValue.has_value ();
148 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
151 *
this = GetEmptyIterator ();
153 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
156 *
this = GetEmptyIterator ();
158 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
161 Require (not AtEnd ());
164 return *_fCurrentValue;
166 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
169 Require (not AtEnd ());
172 return _fCurrentValue.operator->();
174 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
177 Require (not AtEnd ());
179 _fCurrentValue = fRep_->More ();
183 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
190 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
201 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
206 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
217 bool lDone = AtEnd ();
218 bool rDone = rhs.
AtEnd ();
219 if (lDone != rDone) [[likely]] {
226 Assert (not lDone and not rDone);
229 Ensure (lhsRep->
Equals (rhsRep) == rhsRep->
Equals (lhsRep));
230 return lhsRep->
Equals (rhsRep);
232 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
235 return this->AtEnd ();
237 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
238 inline auto Iterator<T, ITERATOR_TRAITS>::Clone_ (
const typename Iterator<T, ITERATOR_TRAITS>::IRep& rep) -> unique_ptr<IRep>
242 template <
typename T, Support::IIteratorTraits ITERATOR_TRAITS>
245 return default_sentinel;
253 template <
typename ITERATOR>
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)
constexpr iterator_traits< ITERATOR >::pointer Iterator2Pointer(ITERATOR i)
More clear way of writing '&*' - convert iterator to pointer.
Implementation detail for iterator implementors.
virtual bool Equals(const IRep *rhs) const =0
two iterators must be iterating over the same source, and be up to the same position.
An Iterator<T> is a copyable object which allows traversing the contents of some container.
nonvirtual void reset()
Set to AtEnd and disassociate with owner.
nonvirtual IRep & GetRep()
Get a reference to the IRep owned by the iterator. This is an implementation detail,...
nonvirtual const IRep & ConstGetRep() const
Get a reference to the IRep owned by the iterator. This is an implementation detail,...
nonvirtual Iterator operator+(ptrdiff_t i) const
nonvirtual void clear()
Set to AtEnd and disassociate with owner.
typename ITERATOR_TRAITS::value_type value_type
value_type = typename ITERATOR_TRAITS::value_type;
nonvirtual void Invariant() const noexcept
Invariant does nothing if !qStroika_Foundation_Debug_AssertionsChecked, but if qStroika_Foundation_De...
nonvirtual const T & Current() const
Returns the value of the current item visited by the Iterator<T>, and is illegal to call if AtEnd()
nonvirtual const value_type * operator->() const
Return a pointer to the current value pointed to by the Iterator<T> (like Current())
static constexpr default_sentinel_t GetEmptyIterator() noexcept
Used by someContainer::end ()
nonvirtual bool operator==(const Iterator &rhs) const
Equals () checks if two iterators are equal to one another (point to the same position in the sequenc...
nonvirtual Iterator & operator=(Iterator &&rhs) noexcept
Iterators are safely copyable, preserving their current position. Copy-Assigning could throw since it...
nonvirtual Iterator & operator++()
Advance iterator; support for range-based-for, and STL style iteration in general (containers must al...
nonvirtual const T & operator*() const
Return the Current value pointed to by the Iterator<T> (same as Current())
nonvirtual bool AtEnd() const
AtEnd () means there is nothing left in this iterator (a synonym for (it == container....
nonvirtual void Refresh()
Refresh the current iterator state based on what is in the underlying IRep.