HOPS
HOPS class reference
MHO_BidirectionalIterator.hh
Go to the documentation of this file.
1 #ifndef MHO_BidirectionalIterator_HH__
2 #define MHO_BidirectionalIterator_HH__
3 
4 #include <iterator>
5 #include <stddef.h>
6 
7 namespace hops
8 {
9 
21 template< typename XValueType > class MHO_BidirectionalIterator
22 {
23  public:
24  //typedef MHO_BidirectionalIterator self_type;
25  // typedef XValueType value_type;
26  // typedef XValueType& reference;
27  // typedef XValueType* pointer;
28  // typedef std::bidirectional_iterator_tag iterator_category;
29  // typedef std::ptrdiff_t difference_type;
30 
32  using value_type = XValueType;
33  using reference = XValueType&;
34  using pointer = XValueType*;
35  using iterator_category = std::bidirectional_iterator_tag;
36  using difference_type = std::ptrdiff_t;
37 
38  MHO_BidirectionalIterator(pointer begin_ptr, pointer ptr, std::size_t length)
39  : fBegin(begin_ptr), fPtr(ptr), fLength(length){};
40 
42 
44 
46  {
47  ++fPtr;
48  return *this;
49  }
50 
52  {
53  --fPtr;
54  return *this;
55  }
56 
58  {
59  self_type ret_val(*this);
60  ++fPtr;
61  return ret_val;
62  }
63 
65  {
66  self_type ret_val(*this);
67  --fPtr;
68  return ret_val;
69  }
70 
71  difference_type operator-(const self_type& iter) { return std::distance(iter.GetPtr(), fPtr); }
72 
73  self_type operator+=(const std::ptrdiff_t& diff)
74  {
75  fPtr += diff;
76  return *this;
77  }
78 
79  self_type operator-=(const std::ptrdiff_t& diff)
80  {
81  fPtr -= diff;
82  return *this;
83  }
84 
85  self_type operator+(const std::ptrdiff_t& diff)
86  {
87  self_type temp(*this);
88  temp += diff;
89  return temp;
90  }
91 
92  self_type operator-(const std::ptrdiff_t& diff)
93  {
94  self_type temp(*this);
95  temp -= diff;
96  return temp;
97  }
98 
99  //access to underlying array item object
100  reference operator*() { return *fPtr; }
101 
102  const reference operator*() const { return *fPtr; }
103 
104  pointer operator->() { return fPtr; }
105 
106  const pointer operator->() const { return fPtr; }
107 
109  {
110  if(this != &rhs)
111  {
112  fBegin = rhs.fBegin;
113  fPtr = rhs.fPtr;
114  }
115  return *this;
116  }
117 
118  bool operator==(const self_type& rhs) const { return fPtr == rhs.fPtr; }
119 
120  bool operator!=(const self_type& rhs) const { return fPtr != rhs.fPtr; }
121 
122  pointer GetPtr() { return fPtr; }
123 
124  const pointer GetPtr() const { return fPtr; }
125 
126  std::size_t GetOffset() const { return std::distance(fBegin, fPtr); }
127 
128  bool IsValid() const { return ((fBegin <= fPtr) && (fPtr < fBegin + fLength)); }
129 
130  protected:
133  std::size_t fLength;
134 };
135 
139 
143 template< typename XValueType > class MHO_BidirectionalConstIterator
144 {
145  public:
147  using value_type = XValueType;
148  using reference = const XValueType&;
149  using pointer = const XValueType*;
150  using iterator_category = std::bidirectional_iterator_tag;
151  using difference_type = std::ptrdiff_t;
152 
153  MHO_BidirectionalConstIterator(pointer begin_ptr, pointer ptr, std::size_t length)
154  : fBegin(begin_ptr), fPtr(const_cast< XValueType* >(ptr)), //we promise not to touch the contents
155  fLength(length){};
156 
158 
160 
162  {
163  ++fPtr;
164  return *this;
165  }
166 
168  {
169  --fPtr;
170  return *this;
171  }
172 
174  {
175  self_type ret_val(*this);
176  ++fPtr;
177  return ret_val;
178  }
179 
181  {
182  self_type ret_val(*this);
183  --fPtr;
184  return ret_val;
185  }
186 
187  difference_type operator-(const self_type& iter) { return std::distance(iter.GetPtr(), fPtr); }
188 
189  self_type operator+=(const std::ptrdiff_t& diff)
190  {
191  fPtr += diff;
192  return *this;
193  }
194 
195  self_type operator-=(const std::ptrdiff_t& diff)
196  {
197  fPtr -= diff;
198  return *this;
199  }
200 
201  self_type operator+(const std::ptrdiff_t& diff)
202  {
203  self_type temp(*this);
204  temp += diff;
205  return temp;
206  }
207 
208  self_type operator-(const std::ptrdiff_t& diff)
209  {
210  self_type temp(*this);
211  temp -= diff;
212  return temp;
213  }
214 
215  //access to underlying array item object is always const
216  reference operator*() const { return *fPtr; }
217 
218  pointer operator->() const { return fPtr; }
219 
221  {
222  if(this != &rhs)
223  {
224  fBegin = rhs.fBegin;
225  fPtr = rhs.fPtr;
226  }
227  return *this;
228  }
229 
230  bool operator==(const self_type& rhs) const { return fPtr == rhs.fPtr; }
231 
232  bool operator!=(const self_type& rhs) const { return fPtr != rhs.fPtr; }
233 
234  pointer GetPtr() const { return fPtr; }
235 
236  std::size_t GetOffset() const { return std::distance(fBegin, fPtr); }
237 
238  bool IsValid() const { return ((fBegin <= fPtr) && (fPtr < fBegin + fLength)); }
239 
240  protected:
243  std::size_t fLength;
244 };
245 
246 } // namespace hops
247 
248 #endif
Class MHO_BidirectionalConstIterator.
Definition: MHO_BidirectionalIterator.hh:144
bool operator==(const self_type &rhs) const
Definition: MHO_BidirectionalIterator.hh:230
std::bidirectional_iterator_tag iterator_category
Definition: MHO_BidirectionalIterator.hh:150
self_type operator=(const self_type &rhs)
Definition: MHO_BidirectionalIterator.hh:220
bool IsValid() const
Definition: MHO_BidirectionalIterator.hh:238
MHO_BidirectionalConstIterator(const self_type &copy)
Definition: MHO_BidirectionalIterator.hh:157
XValueType value_type
Definition: MHO_BidirectionalIterator.hh:147
pointer operator->() const
Definition: MHO_BidirectionalIterator.hh:218
std::size_t GetOffset() const
Definition: MHO_BidirectionalIterator.hh:236
self_type operator++(int)
Definition: MHO_BidirectionalIterator.hh:173
self_type operator++()
Definition: MHO_BidirectionalIterator.hh:161
pointer GetPtr() const
Definition: MHO_BidirectionalIterator.hh:234
const XValueType & reference
Definition: MHO_BidirectionalIterator.hh:148
const pointer fBegin
Definition: MHO_BidirectionalIterator.hh:241
bool operator!=(const self_type &rhs) const
Definition: MHO_BidirectionalIterator.hh:232
const XValueType * pointer
Definition: MHO_BidirectionalIterator.hh:149
virtual ~MHO_BidirectionalConstIterator()
Definition: MHO_BidirectionalIterator.hh:159
self_type operator--()
Definition: MHO_BidirectionalIterator.hh:167
self_type operator+(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIterator.hh:201
std::size_t fLength
Definition: MHO_BidirectionalIterator.hh:243
std::ptrdiff_t difference_type
Definition: MHO_BidirectionalIterator.hh:151
self_type operator-=(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIterator.hh:195
pointer fPtr
Definition: MHO_BidirectionalIterator.hh:242
difference_type operator-(const self_type &iter)
Definition: MHO_BidirectionalIterator.hh:187
self_type operator+=(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIterator.hh:189
MHO_BidirectionalConstIterator(pointer begin_ptr, pointer ptr, std::size_t length)
Definition: MHO_BidirectionalIterator.hh:153
self_type operator--(int)
Definition: MHO_BidirectionalIterator.hh:180
reference operator*() const
Definition: MHO_BidirectionalIterator.hh:216
self_type operator-(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIterator.hh:208
Class MHO_BidirectionalIterator.
Definition: MHO_BidirectionalIterator.hh:22
self_type operator=(const self_type &rhs)
Definition: MHO_BidirectionalIterator.hh:108
difference_type operator-(const self_type &iter)
Definition: MHO_BidirectionalIterator.hh:71
MHO_BidirectionalIterator(const self_type &copy)
Definition: MHO_BidirectionalIterator.hh:41
const pointer operator->() const
Definition: MHO_BidirectionalIterator.hh:106
pointer operator->()
Definition: MHO_BidirectionalIterator.hh:104
self_type operator--(int)
Definition: MHO_BidirectionalIterator.hh:64
std::size_t GetOffset() const
Definition: MHO_BidirectionalIterator.hh:126
self_type operator++()
Definition: MHO_BidirectionalIterator.hh:45
self_type operator-(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIterator.hh:92
self_type operator+(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIterator.hh:85
self_type operator++(int)
Definition: MHO_BidirectionalIterator.hh:57
XValueType value_type
Definition: MHO_BidirectionalIterator.hh:32
pointer fPtr
Definition: MHO_BidirectionalIterator.hh:132
virtual ~MHO_BidirectionalIterator()
Definition: MHO_BidirectionalIterator.hh:43
std::bidirectional_iterator_tag iterator_category
Definition: MHO_BidirectionalIterator.hh:35
std::ptrdiff_t difference_type
Definition: MHO_BidirectionalIterator.hh:36
self_type operator-=(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIterator.hh:79
MHO_BidirectionalIterator(pointer begin_ptr, pointer ptr, std::size_t length)
Definition: MHO_BidirectionalIterator.hh:38
bool IsValid() const
Definition: MHO_BidirectionalIterator.hh:128
self_type operator+=(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIterator.hh:73
std::size_t fLength
Definition: MHO_BidirectionalIterator.hh:133
pointer GetPtr()
Definition: MHO_BidirectionalIterator.hh:122
bool operator!=(const self_type &rhs) const
Definition: MHO_BidirectionalIterator.hh:120
const reference operator*() const
Definition: MHO_BidirectionalIterator.hh:102
XValueType & reference
Definition: MHO_BidirectionalIterator.hh:33
const pointer GetPtr() const
Definition: MHO_BidirectionalIterator.hh:124
pointer fBegin
Definition: MHO_BidirectionalIterator.hh:131
self_type operator--()
Definition: MHO_BidirectionalIterator.hh:51
reference operator*()
Definition: MHO_BidirectionalIterator.hh:100
XValueType * pointer
Definition: MHO_BidirectionalIterator.hh:34
bool operator==(const self_type &rhs) const
Definition: MHO_BidirectionalIterator.hh:118
Definition: MHO_ChannelLabeler.hh:17