CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
ienumerator.h
1
2#pragma once
3
4#include <system/object.h>
5#include <defines.h>
6#include <system/exceptions.h>
7#include <system/idisposable.h>
8#include <system/make_const_ref.h>
9#include <system/collections/virtualized_iterator.h>
10#include <numeric>
11#include <utility>
12
13namespace System {
14namespace Collections {
15namespace Generic {
16
58template<typename T>
59class ASPOSECPP_SHARED_CLASS IEnumerator
60 : virtual public IDisposable
61 , public System::Details::EnumeratorBasedIterator<T>
62 , protected System::Details::IteratorPointerUpdater<T, false>
63{
65 RTTI_INFO_TEMPLATE_CLASS(System::Collections::Generic::IEnumerator<T>, System::BaseTypesInfo<System::IDisposable>);
66
67 using System::Details::IteratorPointerUpdater<T, false>::UpdateIteratorPointer;
68 using System::Details::IteratorPointerUpdater<T, false>::InitializeIteratorPointer;
69
70public:
72 : System::Details::EnumeratorBasedIterator<T>(std::numeric_limits<std::ptrdiff_t>::max())
73 , m_owned_by_virtualized_iterator(false)
74 {}
75
76 virtual ~IEnumerator()
77 {
78 if (m_owned_by_virtualized_iterator)
80 }
81
83 typedef T ValueType;
84
85 // There no need to define an empty virtual dtor, virtual dtor for inheritance already defined in the Object class
88 virtual MakeConstRef_t<T> Current() const { return get_Current(); }
91 virtual MakeConstRef_t<T> get_Current() const = 0;
95 virtual bool MoveNext() = 0;
97 virtual void Reset() { throw System::NotImplementedException(); }
98
100 void InitializeIterator() override
101 {
102 InitializeIteratorPointer(System::Details::VirtualizedIteratorBase<T>::m_pointer);
103 if (MoveNext())
104 {
105 m_offset = 0;
106 UpdateIteratorPointer(System::Details::VirtualizedIteratorBase<T>::m_pointer, get_Current());
107 System::Details::VirtualizedIteratorBase<T>::m_is_end = false;
108 }
109 else
110 System::Details::VirtualizedIteratorBase<T>::m_is_end = true;
111 }
113 void IncrementIterator() override
114 {
115 if (MoveNext())
116 {
117 ++m_offset;
118 UpdateIteratorPointer(System::Details::VirtualizedIteratorBase<T>::m_pointer, get_Current());
119 }
120 else
121 {
122 m_offset = std::numeric_limits<std::ptrdiff_t>::max();
123 System::Details::VirtualizedIteratorBase<T>::m_pointer = nullptr;
124 System::Details::VirtualizedIteratorBase<T>::m_is_end = true;
125 }
126 }
129 System::Details::VirtualizedIteratorBase<T>* CloneIterator() const override
130 {
131 throw System::NotImplementedException();
132 }
136 {
137 InitializeIterator();
138 SharedRefAdded();
139 return this;
140 }
143 {
144 m_owned_by_virtualized_iterator = true;
145 }
146
147protected:
151 : System::Details::EnumeratorBasedIterator<T>(other.m_offset)
152 , m_owned_by_virtualized_iterator(false)
153 {}
154
155 using System::Details::EnumeratorBasedIterator<T>::m_offset;
158};
159
162template <typename Element>
163class EnumeratorWrapperIterator : public System::Details::VirtualizedIteratorBase<Element>
164{
165public:
167 : System::Details::VirtualizedIteratorBase<Element>(false, enumerator->IsEndIterator())
168 , m_enumerator(enumerator)
169 {
170 System::Details::VirtualizedIteratorBase<Element>::m_pointer = m_enumerator->GetElementPointer();
171 }
172
174 virtual ~EnumeratorWrapperIterator() = default;
175
178 void IncrementIterator() override
179 {
180 m_enumerator->IncrementIterator();
181 System::Details::VirtualizedIteratorBase<Element>::m_pointer = m_enumerator->GetElementPointer();
182 System::Details::VirtualizedIteratorBase<Element>::m_is_end = m_enumerator->IsEndIterator();
183 }
187 bool IteratorEquals(System::Details::VirtualizedIteratorBase<Element> *other) const override
188 {
189 return m_enumerator->IteratorEquals(other);
190 }
193 System::Details::VirtualizedIteratorBase<Element>* CloneIterator() const override
194 {
195 return m_enumerator->CloneIterator();
196 }
197
198protected:
201};
202
203
205#define CODEPORTING_NO_API_KEYWORD
206
210#define CODEPORTING_ABSTRACT_ENUMERATOR_ITERATOR_METHODS_DECLARATION(element_type, api_keyword) \
211public: \
212 api_keyword ::System::Details::VirtualizedIteratorBase<element_type>* CloneIterator() const override; \
213 api_keyword void InitializeIterator() override; \
214 api_keyword void IncrementIterator() override;
215
218#define CODEPORTING_ABSTRACT_ENUMERATOR_ITERATOR_MEMBERS_INLINE(element_type) \
219public: \
220 ::System::Details::VirtualizedIteratorBase<element_type>* CloneIterator() const \
221 { \
222 throw System::NotImplementedException(); \
223 } \
224 void InitializeIterator() override \
225 { \
226 ::System::Collections::Generic::IEnumerator<element_type>::InitializeIterator(); \
227 } \
228 void IncrementIterator() override \
229 { \
230 ::System::Collections::Generic::IEnumerator<element_type>::IncrementIterator(); \
231 }
232
236#define CODEPORTING_ABSTRACT_ENUMERATOR_ITERATOR_MEMBERS_IMPLEMENTATION(element_type, type_name) \
237 ::System::Details::VirtualizedIteratorBase<element_type>* type_name::CloneIterator() const \
238 { \
239 throw System::NotImplementedException(); \
240 } \
241 void type_name::InitializeIterator() \
242 { \
243 ::System::Collections::Generic::IEnumerator<element_type>::InitializeIterator(); \
244 } \
245 void type_name::IncrementIterator() \
246 { \
247 ::System::Collections::Generic::IEnumerator<element_type>::IncrementIterator(); \
248 }
249
253#define CODEPORTING_ENUMERATOR_ITERATOR_METHODS_DECLARATION(element_type, api_keyword) \
254public: \
255 api_keyword ::System::Details::VirtualizedIteratorBase<element_type>* CloneIterator() const override; \
256 api_keyword void InitializeIterator() override; \
257 api_keyword void IncrementIterator() override; \
258
263#define CODEPORTING_ENUMERATOR_ITERATOR_MEMBERS_INLINE(element_type, this_type, ptr_type) \
264public: \
265 ::System::Details::VirtualizedIteratorBase<element_type>* CloneIterator() const override \
266 { \
267 if (::System::Details::VirtualizedIteratorBase<element_type>::IsEndIterator()) \
268 return new ::System::Details::EnumeratorBasedEndIterator<element_type>(); \
269 if (::System::Details::EnumeratorBasedIterator<element_type>::m_offset != 0) \
270 throw ::System::NotSupportedException(u"Cloning intermediate state enumerator-based iterator"); \
271 this_type *const copy = new this_type(*this); \
272 std::unique_ptr<ptr_type> holder(copy); \
273 copy->::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end; \
274 copy->::System::Details::IteratorPointerUpdater<element_type, false>::InitializeIteratorPointer(copy->::System::Details::VirtualizedIteratorBase<element_type>::m_pointer); \
275 copy->::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = copy->GetCurrentElementPointer(); \
276 holder.release(); \
277 return copy; \
278 } \
279 void InitializeIterator() override \
280 { \
281 ::System::Details::IteratorPointerUpdater<element_type, false>::InitializeIteratorPointer(::System::Details::EnumeratorBasedIterator<element_type>::m_pointer); \
282 if (MoveNextImplementation()) \
283 { \
284 ::System::Details::EnumeratorBasedIterator<element_type>::m_offset = 0; \
285 ::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = GetCurrentElementPointer(); \
286 ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = false; \
287 } \
288 else \
289 { \
290 ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = true; \
291 } \
292 } \
293 void IncrementIterator() override \
294 { \
295 if (MoveNextImplementation()) \
296 { \
297 ++::System::Details::EnumeratorBasedIterator<element_type>::m_offset; \
298 ::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = GetCurrentElementPointer(); \
299 } \
300 else \
301 { \
302 ::System::Details::EnumeratorBasedIterator<element_type>::m_offset = std::numeric_limits<std::ptrdiff_t>::max(); \
303 ::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = nullptr; \
304 ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = true; \
305 } \
306 }
307
312#define CODEPORTING_ENUMERATOR_ITERATOR_MEMBERS_IMPLEMENTATION(element_type, type_name, ptr_type) \
313 ::System::Details::VirtualizedIteratorBase<element_type>* type_name::CloneIterator() const \
314 { \
315 if (::System::Details::VirtualizedIteratorBase<element_type>::IsEndIterator()) \
316 return new ::System::Details::EnumeratorBasedEndIterator<element_type>(); \
317 if (::System::Details::EnumeratorBasedIterator<element_type>::m_offset != 0) \
318 throw ::System::NotSupportedException(u"Cloning intermediate state enumerator-based iterator"); \
319 type_name *const copy = new type_name(*this); \
320 std::unique_ptr<ptr_type> holder(copy); \
321 copy->::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end; \
322 copy->::System::Details::IteratorPointerUpdater<element_type, false>::InitializeIteratorPointer(copy->::System::Details::VirtualizedIteratorBase<element_type>::m_pointer); \
323 copy->::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = copy->GetCurrentElementPointer(); \
324 holder.release(); \
325 return copy; \
326 } \
327 void type_name::InitializeIterator() \
328 { \
329 ::System::Details::IteratorPointerUpdater<element_type, false>::InitializeIteratorPointer(::System::Details::EnumeratorBasedIterator<element_type>::m_pointer); \
330 if (MoveNextImplementation()) \
331 { \
332 ::System::Details::EnumeratorBasedIterator<element_type>::m_offset = 0; \
333 ::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = GetCurrentElementPointer(); \
334 ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = false; \
335 } \
336 else \
337 { \
338 ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = true; \
339 } \
340 } \
341 void type_name::IncrementIterator() \
342 { \
343 if (MoveNextImplementation()) \
344 { \
345 ++::System::Details::EnumeratorBasedIterator<element_type>::m_offset; \
346 ::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = GetCurrentElementPointer(); \
347 } \
348 else \
349 { \
350 ::System::Details::EnumeratorBasedIterator<element_type>::m_offset = std::numeric_limits<std::ptrdiff_t>::max(); \
351 ::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = nullptr; \
352 ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = true; \
353 } \
354 }
355
356
357} // namespace Generic
358} // namespace Collections
359} // namespace System
Iterator that wraps the pre-created enumerator and redirects all calls into it.
Definition: ienumerator.h:164
const SharedPtr< IEnumerator< Element > > m_enumerator
Wrapped enumerator.
Definition: ienumerator.h:200
EnumeratorWrapperIterator(const SharedPtr< IEnumerator< Element > > &enumerator)
Definition: ienumerator.h:166
void IncrementIterator() override
Moves the iterator step forward. Must update m_is_end and m_pointer.
Definition: ienumerator.h:178
System::Details::VirtualizedIteratorBase< Element > * CloneIterator() const override
Clones current iterator.
Definition: ienumerator.h:193
bool IteratorEquals(System::Details::VirtualizedIteratorBase< Element > *other) const override
Checks if two iterators point to the same item.
Definition: ienumerator.h:187
Interface of enumerator which can be used to iterate through some elements. Objects of this class sho...
Definition: ienumerator.h:63
virtual MakeConstRef_t< T > get_Current() const =0
Gets current element.
IEnumerator * AsVirtualizedIterator()
Prepares the iterator to be used by the VirtualizedIterator class.
Definition: ienumerator.h:135
IEnumerator()
Definition: ienumerator.h:71
virtual bool MoveNext()=0
Moves enumerator to the next element. If no element was referenced before, sets reference to the firs...
void MarkOwnedByVirtualizedIterator()
Marks the enumerator owned by virtualized iterator.
Definition: ienumerator.h:142
T ValueType
Value type.
Definition: ienumerator.h:83
virtual ~IEnumerator()
Definition: ienumerator.h:76
void InitializeIterator() override
Does the first MoveNext() call and prepares the enumerator object to be used by VirtualizedIterator.
Definition: ienumerator.h:100
System::Details::VirtualizedIteratorBase< T > * CloneIterator() const override
Clones current iterator.
Definition: ienumerator.h:129
void IncrementIterator() override
Moves the iterator step forward.
Definition: ienumerator.h:113
virtual void Reset()
Resets enumerator to position before first element.
Definition: ienumerator.h:97
bool m_owned_by_virtualized_iterator
Whether is owned by VirtualizedIterator.
Definition: ienumerator.h:157
IEnumerator(const IEnumerator &other)
Copy constructor.
Definition: ienumerator.h:150
virtual MakeConstRef_t< T > Current() const
Gets current element.
Definition: ienumerator.h:88
Defines method that releases resources owned by the current object. Objects of this class should only...
Definition: idisposable.h:30
int SharedRefRemovedSafe()
Decrements and returns shared reference count. Shouldn't be called directly; instead,...
Definition: object.h:308
Pointer class to wrap types being allocated on heap. Use it to manage memory for classes inheriting O...
Definition: smart_ptr.h:180
Definition: db_command.h:9
typename MakeConstRef< T >::type MakeConstRef_t
Helper type for MakeConstRef modifier.
Definition: make_const_ref.h:20