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#ifdef __DBG_FOR_EACH_MEMBER
73public:
76 void DBG_for_each_member(DBG::for_each_member_visitor& visitor) const override
77 {
78 System::Object::DBG_for_each_member(visitor);
79
80 visitor.add_self(this);
81 visitor.add_member(this, m_owner, "m_owner");
82 }
83
86 const char* DBG_class_name() const override { return "BaseEnumerator<T>"; }
87#endif
88};
89
96template <typename Container, typename Element = typename Container::value_type>
97class SimpleEnumerator : public BaseEnumerator<Container, Element>
98{
99public:
103 SimpleEnumerator(Object::ptr owner, Container& cont) : BaseEnumerator<Container, Element>(owner, cont) {}
104
108 {
109 return this->IsValid() ? *(this->m_it) : System::Default<Element>();
110 }
111
114 System::Details::VirtualizedIteratorBase<Element>* CloneIterator() const override
115 {
116 return new SimpleEnumerator(*this);
117 }
118};
119
120
124template <typename KVPair, typename Container>
126{
127public:
128 using iterator_category = std::bidirectional_iterator_tag;
129 using value_type = KVPair;
130 using difference_type = std::ptrdiff_t;
131 using pointer = value_type * ;
133
134 KVPairIterator(typename Container::const_iterator current) : mCurrent(std::move(current)) {}
135
136 friend bool operator==(const KVPairIterator& lhs, const KVPairIterator& rhs)
137 {
138 return lhs.mCurrent == rhs.mCurrent;
139 }
140
141 friend bool operator!=(const KVPairIterator& lhs, const KVPairIterator& rhs)
142 {
143 return lhs.mCurrent != rhs.mCurrent;
144 }
145
146 KVPair operator*() const
147 {
148 return KVPair(*mCurrent);
149 }
150
152 {
153 ++mCurrent;
154 return *this;
155 }
156
158 {
159 KVPairIterator tmp = KVPairIterator(mCurrent);
160 ++mCurrent;
161 return tmp;
162 }
163
165 {
166 --mCurrent;
167 return *this;
168 }
169
171 {
172 KVPairIterator tmp = KVPairIterator(mCurrent);
173 --mCurrent;
174 return tmp;
175 }
176private:
177 typename Container::const_iterator mCurrent;
178};
179
180
187template <typename Container, typename Element = typename Container::value_type>
188class ReverseEnumerator : public IEnumerator<Element>
189{
190protected:
194 Container& m_data;
196 typename Container::reverse_iterator m_it;
199
200public:
201
205 ReverseEnumerator(const Object::ptr& owner, Container& cont) : m_owner(owner), m_data(cont), m_inited(false) {}
208
211 bool IsValid() const
212 {
213 return m_inited && m_it != m_data.rend();
214 }
217 bool MoveNext() override
218 {
219 if (!m_inited)
220 {
221 m_it = m_data.rbegin();
222 m_inited = true;
223 }
224 else if (m_it != m_data.rend())
225 {
226 ++m_it;
227 }
228
229 return m_it != m_data.rend();
230 }
233 virtual MakeConstRef_t<Element> get_Current() const override
234 {
235 return this->IsValid() ? *(this->m_it) : System::Default<Element>();
236 }
238 void Reset() override { m_inited = false; }
239
240protected:
241#ifdef ASPOSE_GET_SHARED_MEMBERS
243 virtual void GetSharedMembers(System::Object::shared_members_type& result) const override
244 {
245 Object::GetSharedMembers(result);
246 result.Add("System::Collections::Generic::ReverseEnumerator<Container,Element>::m_owner", m_owner);
247 }
248#endif
249
250#ifdef __DBG_FOR_EACH_MEMBER
251public:
254 void DBG_for_each_member(DBG::for_each_member_visitor& visitor) const override
255 {
256 System::Object::DBG_for_each_member(visitor);
257
258 visitor.add_self(this);
259 visitor.add_member(this, m_owner, "m_owner");
260 }
261
264 const char* DBG_class_name() const override { return "ReverseEnumerator<T>"; }
265#endif
266};
267
268}}} // 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:126
value_type & reference
Definition: base_enumerator.h:132
KVPairIterator & operator--()
Definition: base_enumerator.h:164
KVPairIterator operator++(int)
Definition: base_enumerator.h:157
std::bidirectional_iterator_tag iterator_category
Definition: base_enumerator.h:128
KVPair value_type
Definition: base_enumerator.h:129
std::ptrdiff_t difference_type
Definition: base_enumerator.h:130
friend bool operator==(const KVPairIterator &lhs, const KVPairIterator &rhs)
Definition: base_enumerator.h:136
value_type * pointer
Definition: base_enumerator.h:131
KVPairIterator & operator++()
Definition: base_enumerator.h:151
KVPair operator*() const
Definition: base_enumerator.h:146
KVPairIterator(typename Container::const_iterator current)
Definition: base_enumerator.h:134
friend bool operator!=(const KVPairIterator &lhs, const KVPairIterator &rhs)
Definition: base_enumerator.h:141
KVPairIterator operator--(int)
Definition: base_enumerator.h:170
Enumerator that reverse-iterates through container. Objects of this class should only be allocated us...
Definition: base_enumerator.h:189
Container & m_data
Container inner data structure reference.
Definition: base_enumerator.h:194
virtual MakeConstRef_t< Element > get_Current() const override
Gets 'current' element.
Definition: base_enumerator.h:233
Container::reverse_iterator m_it
Actual STL iterator.
Definition: base_enumerator.h:196
bool IsValid() const
Checks whether MoveNext() was called and end was not reached.
Definition: base_enumerator.h:211
ReverseEnumerator(const Object::ptr &owner, Container &cont)
Initializes iterator.
Definition: base_enumerator.h:205
virtual ~ReverseEnumerator()
Destructor.
Definition: base_enumerator.h:207
void Reset() override
Resets enumerator to allow re-enumerating elements.
Definition: base_enumerator.h:238
Object::ptr m_owner
Pointer to owner container object to make sure it is not deleted before enumerator is.
Definition: base_enumerator.h:192
bool m_inited
Whether MoveNext() was ever called.
Definition: base_enumerator.h:198
bool MoveNext() override
Enumerator-style increment.
Definition: base_enumerator.h:217
Iterator class for simple containers holding elements directly using rbegin() and rend() functions....
Definition: base_enumerator.h:98
System::Details::VirtualizedIteratorBase< Element > * CloneIterator() const override
Clones current iterator.
Definition: base_enumerator.h:114
MakeConstRef_t< Element > get_Current() const override
Gets 'current' element.
Definition: base_enumerator.h:107
SimpleEnumerator(Object::ptr owner, Container &cont)
Creates simple iterator.
Definition: base_enumerator.h:103
Definition: db_command.h:9
typename MakeConstRef< T >::type MakeConstRef_t
Helper type for MakeConstRef modifier.
Definition: make_const_ref.h:20