Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
RandomAccessIterator.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
5
6namespace Stroika::Foundation::Traversal {
7
8#if 0
9
10 /*
11 ********************************************************************************
12 *********************** Iterator<T>::Rep_Cloner_ *******************************
13 ********************************************************************************
14 */
15 template <typename T>
16 inline shared_ptr<typename Iterator<T>::IRep> Iterator<T>::Rep_Cloner_::Copy (const IRep& t)
17 {
18 return Iterator<T>::Clone_ (t);
19 }
20
21
22 /*
23 ********************************************************************************
24 ****************************** Iterator<T>::IRep *******************************
25 ********************************************************************************
26 */
27 template <typename T>
28 inline Iterator<T>::IRep::IRep ()
29 {
30 }
31 template <typename T>
32 inline Iterator<T>::IRep::~IRep ()
33 {
34 }
35
36
37 /*
38 ********************************************************************************
39 ********************************** Iterator<T> *********************************
40 ********************************************************************************
41 */
42 template <typename T>
43 inline Iterator<T>::Iterator (const Iterator<T>& from)
44 : fIterator_ {from.fIterator_}
45 , fCurrent_ {from.fCurrent_}
46 {
47 Require (fIterator_.get () != nullptr or Done ()); // if not special 'auto-done' we must have legit iterator rep
48 }
49 template <typename T>
50 inline Iterator<T>::Iterator (const RandomAccessIteratorRepSharedPtr& rep)
51 : fIterator_ {rep}
52 , fCurrent_ {}
53 {
54 RequireNotNull (rep.get ());
55 // Reason for cast stuff is to avoid Clone if unneeded.
56 const_cast<IRep*> (rep.get ())->More (&fCurrent_, false);
57 }
58 template <typename T>
59 inline Iterator<T>::Iterator (ConstructionFlagForceAtEnd_)
60 : fIterator_ (nullptr)
61 , fCurrent_ ()
62 {
63 Assert (Done ());
64 }
65 template <typename T>
66 inline Iterator<T>& Iterator<T>::operator= (const Iterator<T>& rhs)
67 {
68 Require (rhs.fIterator_.get () != nullptr or rhs.Done ()); // if not special 'auto-done' we must have legit iterator rep
69 fIterator_ = rhs.fIterator_;
70 fCurrent_ = rhs.fCurrent_;
71 return *this;
72 }
73 template <typename T>
74 inline typename Iterator<T>::IRep& Iterator<T>::GetRep ()
75 {
76 EnsureNotNull (fIterator_);
77 return *fIterator_;
78 }
79 template <typename T>
80 inline const typename Iterator<T>::IRep& Iterator<T>::GetRep () const
81 {
82 EnsureNotNull (fIterator_);
83 return *fIterator_;
84 }
85 template <typename T>
86 inline T Iterator<T>::Current () const
87 {
88 RequireNotNull (fIterator_);
89 Require (fCurrent_.has_value ());
90 return *fCurrent_;
91 }
92 template <typename T>
93 inline bool Iterator<T>::Done () const
94 {
95 return not fCurrent_.has_value ();
96 }
97 template <typename T>
98 inline T Iterator<T>::operator* () const
99 {
100 Require (not Done ());
101 RequireNotNull (fIterator_);
102 return *fCurrent_;
103 }
104 template <typename T>
105 inline T* Iterator<T>::operator-> ()
106 {
107 Require (not Done ());
108 RequireNotNull (fIterator_);
109 return fCurrent_.get ();
110 }
111 template <typename T>
112 inline const T* Iterator<T>::operator-> () const
113 {
114 Require (not Done ());
115 RequireNotNull (fIterator_);
116 return fCurrent_.get ();
117 }
118 template <typename T>
119 inline void Iterator<T>::operator++ ()
120 {
121 Require (not Done ());
122 RequireNotNull (fIterator_);
123 fIterator_->More (&fCurrent_, true);
124 }
125 template <typename T>
126 inline void Iterator<T>::operator++ (int)
127 {
128 RequireNotNull (fIterator_);
129 Require (not Done ());
130 fIterator_->More (&fCurrent_, true);
131 }
132 template <typename T>
133 inline Iterator<T>::operator bool () const
134 {
135 return not Done ();
136 }
137 template <typename T>
138 inline bool Iterator<T>::Equals (const Iterator& rhs) const
139 {
140 /*
141 * Equals is checked by first checking handling the case of special 'done' iterators. If two
142 * iterators differ on Done () - they cannot be equal. And if they are both done (this is special -
143 * even if from different sources) they are considered equal.
144 *
145 * But then - we check that they are the same dynamic type, and if so, hand to one,
146 * and let it do the dynamic/concrete type specific checks for equality.
147 */
148 bool lDone = Done ();
149 bool rDone = rhs.Done ();
150 if (lDone != rDone) {
151 return false;
152 }
153 if (lDone) {
154 Assert (rDone);
155 return true;
156 }
157 Assert (not lDone and not rDone);
158 // assigning to local variables to ensure const version called
159 const Iterator<T>::IRep* lhsRep = fIterator_.get ();
160 const Iterator<T>::IRep* rhsRep = rhs.fIterator_.get ();
161 Ensure (lhsRep->Equals (rhsRep) == rhsRep->Equals (lhsRep));
162 return lhsRep->Equals (rhsRep);
163 }
164 template <typename T>
165 inline bool Iterator<T>::operator== (const Iterator& rhs) const
166 {
167 return Equals (rhs);
168 }
169 template <typename T>
170 inline bool Iterator<T>::operator!= (const Iterator& rhs) const
171 {
172 return not Equals (rhs);
173 }
174 template <typename T>
175 inline typename Iterator<T>::RandomAccessIteratorRepSharedPtr Iterator<T>::Clone_ (const typename Iterator<T>::IRep& rep)
176 {
177 return rep.Clone ();
178 }
179 template <typename T>
180 inline Iterator<T> Iterator<T>::GetEmptyIterator ()
181 {
182 return Iterator<T> (ConstructionFlagForceAtEnd_::ForceAtEnd);
183 }
184#endif
185
186}
#define EnsureNotNull(p)
Definition Assertions.h:340
#define RequireNotNull(p)
Definition Assertions.h:347
bool Equals(const T *lhs, const T *rhs)
strcmp or wsccmp() as appropriate == 0