4#include <system/object.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>
14namespace Collections {
61 ,
public System::Details::EnumeratorBasedIterator<T>
62 ,
protected System::Details::IteratorPointerUpdater<T, false>
67 using System::Details::IteratorPointerUpdater<T,
false>::UpdateIteratorPointer;
68 using System::Details::IteratorPointerUpdater<T,
false>::InitializeIteratorPointer;
72 :
System::Details::EnumeratorBasedIterator<T>(std::numeric_limits<std::ptrdiff_t>::max())
73 , m_owned_by_virtualized_iterator(false)
78 if (m_owned_by_virtualized_iterator)
97 virtual void Reset() {
throw System::NotImplementedException(); }
102 InitializeIteratorPointer(System::Details::VirtualizedIteratorBase<T>::m_pointer);
106 UpdateIteratorPointer(System::Details::VirtualizedIteratorBase<T>::m_pointer, get_Current());
107 System::Details::VirtualizedIteratorBase<T>::m_is_end =
false;
110 System::Details::VirtualizedIteratorBase<T>::m_is_end =
true;
118 UpdateIteratorPointer(System::Details::VirtualizedIteratorBase<T>::m_pointer, get_Current());
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;
131 throw System::NotImplementedException();
137 InitializeIterator();
144 m_owned_by_virtualized_iterator =
true;
151 :
System::Details::EnumeratorBasedIterator<T>(other.m_offset)
152 , m_owned_by_virtualized_iterator(false)
155 using System::Details::EnumeratorBasedIterator<T>::m_offset;
162template <
typename Element>
167 :
System::Details::VirtualizedIteratorBase<Element>(false, enumerator->IsEndIterator())
170 System::Details::VirtualizedIteratorBase<Element>::m_pointer =
m_enumerator->GetElementPointer();
181 System::Details::VirtualizedIteratorBase<Element>::m_pointer =
m_enumerator->GetElementPointer();
182 System::Details::VirtualizedIteratorBase<Element>::m_is_end =
m_enumerator->IsEndIterator();
187 bool IteratorEquals(System::Details::VirtualizedIteratorBase<Element> *other)
const override
193 System::Details::VirtualizedIteratorBase<Element>*
CloneIterator()
const override
205#define CODEPORTING_NO_API_KEYWORD
210#define CODEPORTING_ABSTRACT_ENUMERATOR_ITERATOR_METHODS_DECLARATION(element_type, api_keyword) \
212 api_keyword ::System::Details::VirtualizedIteratorBase<element_type>* CloneIterator() const override; \
213 api_keyword void InitializeIterator() override; \
214 api_keyword void IncrementIterator() override;
218#define CODEPORTING_ABSTRACT_ENUMERATOR_ITERATOR_MEMBERS_INLINE(element_type) \
220 ::System::Details::VirtualizedIteratorBase<element_type>* CloneIterator() const \
222 throw System::NotImplementedException(); \
224 void InitializeIterator() override \
226 ::System::Collections::Generic::IEnumerator<element_type>::InitializeIterator(); \
228 void IncrementIterator() override \
230 ::System::Collections::Generic::IEnumerator<element_type>::IncrementIterator(); \
236#define CODEPORTING_ABSTRACT_ENUMERATOR_ITERATOR_MEMBERS_IMPLEMENTATION(element_type, type_name) \
237 ::System::Details::VirtualizedIteratorBase<element_type>* type_name::CloneIterator() const \
239 throw System::NotImplementedException(); \
241 void type_name::InitializeIterator() \
243 ::System::Collections::Generic::IEnumerator<element_type>::InitializeIterator(); \
245 void type_name::IncrementIterator() \
247 ::System::Collections::Generic::IEnumerator<element_type>::IncrementIterator(); \
253#define CODEPORTING_ENUMERATOR_ITERATOR_METHODS_DECLARATION(element_type, api_keyword) \
255 api_keyword ::System::Details::VirtualizedIteratorBase<element_type>* CloneIterator() const override; \
256 api_keyword void InitializeIterator() override; \
257 api_keyword void IncrementIterator() override; \
263#define CODEPORTING_ENUMERATOR_ITERATOR_MEMBERS_INLINE(element_type, this_type, ptr_type) \
265 ::System::Details::VirtualizedIteratorBase<element_type>* CloneIterator() const override \
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(); \
279 void InitializeIterator() override \
281 ::System::Details::IteratorPointerUpdater<element_type, false>::InitializeIteratorPointer(::System::Details::EnumeratorBasedIterator<element_type>::m_pointer); \
282 if (MoveNextImplementation()) \
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; \
290 ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = true; \
293 void IncrementIterator() override \
295 if (MoveNextImplementation()) \
297 ++::System::Details::EnumeratorBasedIterator<element_type>::m_offset; \
298 ::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = GetCurrentElementPointer(); \
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; \
312#define CODEPORTING_ENUMERATOR_ITERATOR_MEMBERS_IMPLEMENTATION(element_type, type_name, ptr_type) \
313 ::System::Details::VirtualizedIteratorBase<element_type>* type_name::CloneIterator() const \
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(); \
327 void type_name::InitializeIterator() \
329 ::System::Details::IteratorPointerUpdater<element_type, false>::InitializeIteratorPointer(::System::Details::EnumeratorBasedIterator<element_type>::m_pointer); \
330 if (MoveNextImplementation()) \
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; \
338 ::System::Details::VirtualizedIteratorBase<element_type>::m_is_end = true; \
341 void type_name::IncrementIterator() \
343 if (MoveNextImplementation()) \
345 ++::System::Details::EnumeratorBasedIterator<element_type>::m_offset; \
346 ::System::Details::VirtualizedIteratorBase<element_type>::m_pointer = GetCurrentElementPointer(); \
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; \
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
virtual ~EnumeratorWrapperIterator()=default
Destructor.
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