HOPS
HOPS class reference
MHO_BidirectionalIndexedIterator.hh
Go to the documentation of this file.
1 #ifndef MHO_BidirectionalIndexedIterator_HH__
2 #define MHO_BidirectionalIndexedIterator_HH__
3 
4 #include <iterator>
5 
6 #include "MHO_Message.hh"
7 #include "MHO_NDArrayMath.hh"
8 
9 namespace hops
10 {
11 
25 template< typename XValueType, std::size_t RANK > class MHO_BidirectionalIndexedIterator
26 {
27  public:
29  typedef XValueType value_type;
30  typedef XValueType& reference;
31  typedef XValueType* pointer;
32  typedef std::bidirectional_iterator_tag iterator_category;
33  typedef std::ptrdiff_t difference_type;
34  typedef std::array< std::size_t, RANK > index_type;
35 
36  MHO_BidirectionalIndexedIterator(pointer begin_ptr, std::size_t position_offset, const std::size_t* dims,
37  const std::size_t* strides)
38  : fBegin(begin_ptr), fPositionOffset(position_offset)
39  {
40  for(std::size_t i = 0; i < RANK; i++)
41  {
42  fDimensions[i] = dims[i];
43  fStrides[i] = strides[i];
44  }
45  fLength = MHO_NDArrayMath::TotalArraySize< RANK >(&(fDimensions[0])); //determine size of array
48  }
49 
51  {
52  for(std::size_t i = 0; i < RANK; i++)
53  {
54  fDimensions[i] = copy.fDimensions[i];
55  fStrides[i] = copy.fStrides[i];
56  fIdx[i] = copy.fIdx[i];
57  }
58  fLength = copy.fLength;
60  fPtr = copy.fPtr;
61  }
62 
64 
66  {
69  {
70  MHO_NDArrayMath::IncrementIndices< RANK >(&(fDimensions[0]), &(fIdx[0]));
71  }
72  else
73  {
75  }
76 
77  fMemoryOffset = MHO_NDArrayMath::OffsetFromStrideIndex< RANK >(&(fStrides[0]), &(fIdx[0]));
79  return *this;
80  }
81 
83  {
84  if(fPositionOffset > 0)
85  {
87  MHO_NDArrayMath::DecrementIndices< RANK >(&(fDimensions[0]), &(fIdx[0]));
88  }
89  else
90  {
91  fPositionOffset = 0;
93  }
94 
95  fMemoryOffset = MHO_NDArrayMath::OffsetFromStrideIndex< RANK >(&(fStrides[0]), &(fIdx[0]));
97  return *this;
98  }
99 
101  {
102  self_type ret_val(*this);
103  ++(*this);
104  return ret_val;
105  }
106 
108  {
109  self_type ret_val(*this);
110  ++(*this);
111  return ret_val;
112  }
113 
115 
116  self_type operator+=(const std::ptrdiff_t& diff)
117  {
118  fPositionOffset += diff; //TODO CHECK AGAINST out_of_range ERRORS
120  fPtr = fBegin + fMemoryOffset; //*!sizeof(XValueType);
121  return *this;
122  }
123 
124  self_type operator-=(const std::ptrdiff_t& diff)
125  {
126  fPositionOffset -= diff; //TODO CHECK AGAINST out_of_range ERRORS
129  return *this;
130  }
131 
132  self_type operator+(const std::ptrdiff_t& diff)
133  {
134  self_type temp(*this);
135  temp += diff;
136  return temp;
137  }
138 
139  self_type operator-(const std::ptrdiff_t& diff)
140  {
141  self_type temp(*this);
142  temp -= diff;
143  return temp;
144  }
145 
146  //access to underlying array item object
147  reference operator*() { return *fPtr; }
148 
149  pointer operator->() { return fPtr; }
150 
151  reference operator*() const { return *fPtr; }
152 
153  const pointer operator->() const { return fPtr; }
154 
156  {
157  if(this != &rhs)
158  {
159  fBegin = rhs.fBegin;
161  for(std::size_t i = 0; i < RANK; i++)
162  {
163  fDimensions[i] = rhs.fDimensions[i];
164  fStrides[i] = rhs.fStrides[i];
165  fIdx[i] = rhs.fIdx[i];
166  }
167  fLength = rhs.fLength;
169  fPtr = rhs.fPtr;
170  }
171  return *this;
172  }
173 
174  bool operator==(const self_type& rhs) const { return fPtr == rhs.fPtr; }
175 
176  bool operator!=(const self_type& rhs) const { return fPtr != rhs.fPtr; }
177 
178  pointer GetPtr() { return fPtr; }
179 
180  const pointer GetPtr() const { return fPtr; }
181 
183 
184  difference_type GetMemoryOffset() const { return std::distance(fBegin, fPtr); }
185 
186  bool IsValid() const { return ((fBegin <= fPtr) && (fPtr < fBegin + fLength)); }
187 
188  protected:
189  //array description
193  std::size_t fLength;
194 
195  //current position in array
197  std::size_t fPositionOffset; //the position in the flattened array [0,fLength)
198  std::size_t fMemoryOffset; //absolute difference in memory from fBegin
200 
202  {
204  {
205  MHO_NDArrayMath::RowMajorIndexFromOffset< RANK >(fPositionOffset, &(fDimensions[0]),
206  &(fIdx[0])); //determine current indexes
207  fMemoryOffset = MHO_NDArrayMath::OffsetFromStrideIndex< RANK >(&(fStrides[0]), &(fIdx[0]));
208  }
209  else
210  {
211  //clamp to the end of the array + 1 (the 'end')
212  fPositionOffset = fLength - 1;
213  MHO_NDArrayMath::RowMajorIndexFromOffset< RANK >(fPositionOffset, &(fDimensions[0]), &(fIdx[0]));
214  fIdx[RANK - 1] += 1; //this index is now out of range (1 past the end)
215  fMemoryOffset = MHO_NDArrayMath::OffsetFromStrideIndex< RANK >(&(fStrides[0]), &(fIdx[0]));
217  }
218  }
219 };
220 
221 } // namespace hops
222 
223 #endif
Class MHO_BidirectionalIndexedIterator.
Definition: MHO_BidirectionalIndexedIterator.hh:26
XValueType value_type
Definition: MHO_BidirectionalIndexedIterator.hh:29
self_type operator-(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIndexedIterator.hh:139
pointer operator->()
Definition: MHO_BidirectionalIndexedIterator.hh:149
MHO_BidirectionalIndexedIterator self_type
Definition: MHO_BidirectionalIndexedIterator.hh:28
MHO_BidirectionalIndexedIterator(const self_type &copy)
Definition: MHO_BidirectionalIndexedIterator.hh:50
const pointer operator->() const
Definition: MHO_BidirectionalIndexedIterator.hh:153
self_type operator+(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIndexedIterator.hh:132
difference_type GetPositionOffset() const
Definition: MHO_BidirectionalIndexedIterator.hh:182
std::size_t fMemoryOffset
Definition: MHO_BidirectionalIndexedIterator.hh:198
self_type operator++()
Definition: MHO_BidirectionalIndexedIterator.hh:65
pointer GetPtr()
Definition: MHO_BidirectionalIndexedIterator.hh:178
self_type operator=(const self_type &rhs)
Definition: MHO_BidirectionalIndexedIterator.hh:155
bool operator==(const self_type &rhs) const
Definition: MHO_BidirectionalIndexedIterator.hh:174
XValueType & reference
Definition: MHO_BidirectionalIndexedIterator.hh:30
reference operator*()
Definition: MHO_BidirectionalIndexedIterator.hh:147
bool operator!=(const self_type &rhs) const
Definition: MHO_BidirectionalIndexedIterator.hh:176
index_type fDimensions
Definition: MHO_BidirectionalIndexedIterator.hh:191
pointer fBegin
Definition: MHO_BidirectionalIndexedIterator.hh:190
self_type operator-=(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIndexedIterator.hh:124
self_type operator--()
Definition: MHO_BidirectionalIndexedIterator.hh:82
difference_type GetMemoryOffset() const
Definition: MHO_BidirectionalIndexedIterator.hh:184
self_type operator++(int)
Definition: MHO_BidirectionalIndexedIterator.hh:100
std::bidirectional_iterator_tag iterator_category
Definition: MHO_BidirectionalIndexedIterator.hh:32
index_type fIdx
Definition: MHO_BidirectionalIndexedIterator.hh:199
self_type operator+=(const std::ptrdiff_t &diff)
Definition: MHO_BidirectionalIndexedIterator.hh:116
bool IsValid() const
Definition: MHO_BidirectionalIndexedIterator.hh:186
std::ptrdiff_t difference_type
Definition: MHO_BidirectionalIndexedIterator.hh:33
reference operator*() const
Definition: MHO_BidirectionalIndexedIterator.hh:151
const pointer GetPtr() const
Definition: MHO_BidirectionalIndexedIterator.hh:180
index_type fStrides
Definition: MHO_BidirectionalIndexedIterator.hh:192
virtual ~MHO_BidirectionalIndexedIterator()
Definition: MHO_BidirectionalIndexedIterator.hh:63
std::array< std::size_t, RANK > index_type
Definition: MHO_BidirectionalIndexedIterator.hh:34
std::size_t fLength
Definition: MHO_BidirectionalIndexedIterator.hh:193
XValueType * pointer
Definition: MHO_BidirectionalIndexedIterator.hh:31
MHO_BidirectionalIndexedIterator(pointer begin_ptr, std::size_t position_offset, const std::size_t *dims, const std::size_t *strides)
Definition: MHO_BidirectionalIndexedIterator.hh:36
void CalculateOffsets()
Definition: MHO_BidirectionalIndexedIterator.hh:201
difference_type operator-(const self_type &iter)
Definition: MHO_BidirectionalIndexedIterator.hh:114
std::size_t fPositionOffset
Definition: MHO_BidirectionalIndexedIterator.hh:197
self_type operator--(int)
Definition: MHO_BidirectionalIndexedIterator.hh:107
pointer fPtr
Definition: MHO_BidirectionalIndexedIterator.hh:196
Definition: MHO_ChannelLabeler.hh:17