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