CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
base_enumerator.h
1
2#pragma once
3
4#include "system/collections/ienumerator.h"
5
6namespace System { namespace Collections { namespace Generic {
7
16template <typename Container, typename Element>
17class ASPOSECPP_SHARED_CLASS BaseEnumerator : public IEnumerator<Element>
18{
19protected:
23 Container& m_data;
25 typename Container::iterator m_it;
28
29public:
30
34 BaseEnumerator(const Object::ptr& owner, Container& cont) : m_owner(owner), m_data(cont), m_inited(false) {}
35 // There no need to define an empty virtual dtor, virtual dtor for inheritance already defined in the Object class
36
39 bool IsValid() const
40 {
41 return m_inited && m_it != m_data.end();
42 }
45 bool MoveNext() override
46 {
47 if (!m_inited)
48 {
49 m_it = m_data.begin();
50 m_inited = true;
51 }
52 else if (m_it != m_data.end())
53 {
54 ++m_it;
55 }
56
57 return m_it != m_data.end();
58 }
60 void Reset() override { m_inited = false; }
61
62protected:
63#ifdef ASPOSE_GET_SHARED_MEMBERS
65 virtual void GetSharedMembers(System::Object::shared_members_type& result) const override
66 {
67 Object::GetSharedMembers(result);
68 result.Add("System::Collections::Generic::BaseEnumerator<Container,Element>::m_owner", m_owner);
69 }
70#endif
71};
72
79template <typename Container, typename Element = typename Container::value_type>
80class SimpleEnumerator : public BaseEnumerator<Container, Element>
81{
82public:
86 SimpleEnumerator(Object::ptr owner, Container& cont) : BaseEnumerator<Container, Element>(owner, cont) {}
87
91 {
92 return this->IsValid() ? *(this->m_it) : System::Default<Element>();
93 }
94
97 System::Details::VirtualizedIteratorBase<Element>* CloneIterator() const override
98 {
99 return new SimpleEnumerator(*this);
100 }
101};
102
103
107template <typename KVPair, typename Container>
109{
110public:
111 using iterator_category = std::bidirectional_iterator_tag;
112 using value_type = KVPair;
113 using difference_type = std::ptrdiff_t;
114 using pointer = value_type * ;
116
117 KVPairIterator(typename Container::const_iterator current) : mCurrent(std::move(current)) {}
118
119 friend bool operator==(const KVPairIterator& lhs, const KVPairIterator& rhs)
120 {
121 return lhs.mCurrent == rhs.mCurrent;
122 }
123
124 friend bool operator!=(const KVPairIterator& lhs, const KVPairIterator& rhs)
125 {
126 return lhs.mCurrent != rhs.mCurrent;
127 }
128
129 KVPair operator*() const
130 {
131 return KVPair(*mCurrent);
132 }
133
135 {
136 ++mCurrent;
137 return *this;
138 }
139
141 {
142 KVPairIterator tmp = KVPairIterator(mCurrent);
143 ++mCurrent;
144 return tmp;
145 }
146
148 {
149 --mCurrent;
150 return *this;
151 }
152
154 {
155 KVPairIterator tmp = KVPairIterator(mCurrent);
156 --mCurrent;
157 return tmp;
158 }
159private:
160 typename Container::const_iterator mCurrent;
161};
162
163
170template <typename Container, typename Element = typename Container::value_type>
171class ReverseEnumerator : public IEnumerator<Element>
172{
173protected:
177 Container& m_data;
179 typename Container::reverse_iterator m_it;
182
183public:
184
188 ReverseEnumerator(const Object::ptr& owner, Container& cont) : m_owner(owner), m_data(cont), m_inited(false) {}
191
194 bool IsValid() const
195 {
196 return m_inited && m_it != m_data.rend();
197 }
200 bool MoveNext() override
201 {
202 if (!m_inited)
203 {
204 m_it = m_data.rbegin();
205 m_inited = true;
206 }
207 else if (m_it != m_data.rend())
208 {
209 ++m_it;
210 }
211
212 return m_it != m_data.rend();
213 }
216 virtual MakeConstRef_t<Element> get_Current() const override
217 {
218 return this->IsValid() ? *(this->m_it) : System::Default<Element>();
219 }
221 void Reset() override { m_inited = false; }
222
223protected:
224#ifdef ASPOSE_GET_SHARED_MEMBERS
226 virtual void GetSharedMembers(System::Object::shared_members_type& result) const override
227 {
228 Object::GetSharedMembers(result);
229 result.Add("System::Collections::Generic::ReverseEnumerator<Container,Element>::m_owner", m_owner);
230 }
231#endif
232};
233
234}}} // namespace System::Collections::Generic
Enumerator definition to wrap STL-styled types for C#-styled usage. Makes no assertions on container ...
Definition: base_enumerator.h:18
Object::ptr m_owner
Pointer to owner container object to make sure it is not deleted before enumerator is.
Definition: base_enumerator.h:21
BaseEnumerator(const Object::ptr &owner, Container &cont)
Initializes iterator.
Definition: base_enumerator.h:34
void Reset() override
Resets enumerator to allow re-enumerating elements.
Definition: base_enumerator.h:60
bool IsValid() const
Checks whether MoveNext() was called and end was not reached.
Definition: base_enumerator.h:39
Container::iterator m_it
Actual STL iterator.
Definition: base_enumerator.h:25
Container & m_data
Container inner data structure reference.
Definition: base_enumerator.h:23
bool MoveNext() override
Enumerator-style increment.
Definition: base_enumerator.h:45
bool m_inited
Whether MoveNext() was ever called.
Definition: base_enumerator.h:27
Interface of enumerator which can be used to iterate through some elements. Objects of this class sho...
Definition: ienumerator.h:63
Adapting iterator, wraps std::pair into KVPair expected from Dictionary.
Definition: base_enumerator.h:109
value_type & reference
Definition: base_enumerator.h:115
KVPairIterator & operator--()
Definition: base_enumerator.h:147
KVPairIterator operator++(int)
Definition: base_enumerator.h:140
std::bidirectional_iterator_tag iterator_category
Definition: base_enumerator.h:111
KVPair value_type
Definition: base_enumerator.h:112
std::ptrdiff_t difference_type
Definition: base_enumerator.h:113
friend bool operator==(const KVPairIterator &lhs, const KVPairIterator &rhs)
Definition: base_enumerator.h:119
value_type * pointer
Definition: base_enumerator.h:114
KVPairIterator & operator++()
Definition: base_enumerator.h:134
KVPair operator*() const
Definition: base_enumerator.h:129
KVPairIterator(typename Container::const_iterator current)
Definition: base_enumerator.h:117
friend bool operator!=(const KVPairIterator &lhs, const KVPairIterator &rhs)
Definition: base_enumerator.h:124
KVPairIterator operator--(int)
Definition: base_enumerator.h:153
Enumerator that reverse-iterates through container. Objects of this class should only be allocated us...
Definition: base_enumerator.h:172
Container & m_data
Container inner data structure reference.
Definition: base_enumerator.h:177
virtual MakeConstRef_t< Element > get_Current() const override
Gets 'current' element.
Definition: base_enumerator.h:216
Container::reverse_iterator m_it
Actual STL iterator.
Definition: base_enumerator.h:179
bool IsValid() const
Checks whether MoveNext() was called and end was not reached.
Definition: base_enumerator.h:194
ReverseEnumerator(const Object::ptr &owner, Container &cont)
Initializes iterator.
Definition: base_enumerator.h:188
virtual ~ReverseEnumerator()
Destructor.
Definition: base_enumerator.h:190
void Reset() override
Resets enumerator to allow re-enumerating elements.
Definition: base_enumerator.h:221
Object::ptr m_owner
Pointer to owner container object to make sure it is not deleted before enumerator is.
Definition: base_enumerator.h:175
bool m_inited
Whether MoveNext() was ever called.
Definition: base_enumerator.h:181
bool MoveNext() override
Enumerator-style increment.
Definition: base_enumerator.h:200
Iterator class for simple containers holding elements directly using rbegin() and rend() functions....
Definition: base_enumerator.h:81
System::Details::VirtualizedIteratorBase< Element > * CloneIterator() const override
Clones current iterator.
Definition: base_enumerator.h:97
MakeConstRef_t< Element > get_Current() const override
Gets 'current' element.
Definition: base_enumerator.h:90
SimpleEnumerator(Object::ptr owner, Container &cont)
Creates simple iterator.
Definition: base_enumerator.h:86
Definition: db_command.h:9
typename MakeConstRef< T >::type MakeConstRef_t
Helper type for MakeConstRef modifier.
Definition: make_const_ref.h:20