libsequence  1.9.5
col_view_iterator.hpp
1 #ifndef SEQUENCE_COL_VIEW_ITERATOR_HPP__
2 #define SEQUENCE_COL_VIEW_ITERATOR_HPP__
3 
4 #include <iterator>
5 #include <stdexcept>
6 
7 namespace Sequence
8 {
9  template <typename POINTER> struct col_view_iterator
15  {
16  static_assert(std::is_pointer<POINTER>::value,
17  "iterator must wrap a pointer type");
19  using difference_type =
20  typename std::iterator_traits<POINTER>::difference_type;
22  using value_type = typename std::iterator_traits<POINTER>::value_type;
24  using reference = typename std::iterator_traits<POINTER>::reference;
26  using pointer = POINTER;
28  using iterator_category =
29  typename std::iterator_traits<POINTER>::iterator_category;
30 
35  mutable POINTER start;
37  mutable POINTER data;
38 
43  explicit col_view_iterator(POINTER data_, difference_type stride_,
44  difference_type offset_)
46  : start{ data_ }, data{ data_ }, stride{ stride_ }, offset{
47  offset_
48  }
49  {
50  }
51 
52  col_view_iterator(const col_view_iterator&) = default;
53 
55  reference operator*() { return *(data + offset); }
56 
58  const reference operator*() const { return *(data + offset); }
59 
61  reference operator[](difference_type n) { return *(*this + n); }
64  {
65  return *(*this + n);
66  }
67 
71  {
72  this->start = rhs.start;
73  this->data = rhs.data;
74  this->stride = rhs.stride;
75  this->offset = rhs.offset;
76  return *this;
77  }
78 
79  bool
80  operator<=(const col_view_iterator rhs) const
81  {
82  return (this->data + this->offset) <= (rhs.data + rhs.offset);
83  }
84  bool
85  operator<(const col_view_iterator rhs) const
86  {
87  return (this->data + this->offset) < (rhs.data + rhs.offset);
88  }
89  bool
90  operator>(const col_view_iterator rhs) const
91  {
92  return !(*this <= rhs);
93  }
94  bool
95  operator>=(const col_view_iterator rhs) const
96  {
97  return !(*this < rhs);
98  }
99  bool
100  operator==(const col_view_iterator rhs) const
101  {
102  return !(*this < rhs) && !(*this > rhs);
103  }
104  bool
105  operator!=(const col_view_iterator rhs) const
106  {
107  return !(*this == rhs);
108  }
109  };
110 
111  template <typename POINTER>
117  {
118  auto rv(i);
119  rv.offset += d * rv.stride;
120  return rv;
121  }
122 
123  template <typename POINTER>
129  {
130  return i + d;
131  }
132 
133  template <typename POINTER>
138  {
139  i.offset += i.stride;
140  return i;
141  }
142 
143  template <typename POINTER>
149  {
150  auto rv(i);
151  rv.offset -= d * rv.stride;
152  return rv;
153  }
154 
155  template <typename POINTER>
161  {
162  return i - d;
163  }
164 
165  template <typename POINTER>
170  {
171  i.offset -= i.stride;
172  return i;
173  }
174 
175  template <typename POINTER>
181  {
182  i.offset += d * i.stride;
183  return i;
184  }
185 
186  template <typename POINTER>
192  {
193  i.offset -= d * i.stride;
194  return i;
195  }
196 
197  template <typename POINTER>
202  {
203  if (i.start != j.start)
204  {
205  throw std::invalid_argument("attempt to subtract "
206  "iterators from different "
207  "columns");
208  }
209  return (i.offset - j.offset) / i.stride;
210  }
211 }
212 
213 #endif
difference_type stride
Stride needed to increment/decrement.
col_view_iterator< POINTER > & operator++(col_view_iterator< POINTER > &i)
const reference operator*() const
Get value pointed to.
col_view_iterator< POINTER > operator-(col_view_iterator< POINTER > i, typename col_view_iterator< POINTER >::difference_type d)
The namespace in which this library resides.
difference_type offset
Offset w.r.to data.
POINTER data
Iterator data.
reference operator*()
Get value pointed to.
reference operator[](difference_type n)
Access a reference n elements away.
col_view_iterator< POINTER > & operator-=(col_view_iterator< POINTER > &i, typename col_view_iterator< POINTER >::difference_type d)
typename std::iterator_traits< POINTER >::value_type value_type
Value type.
col_view_iterator< POINTER > & operator+=(col_view_iterator< POINTER > &i, typename col_view_iterator< POINTER >::difference_type d)
col_view_iterator & operator=(const col_view_iterator &rhs)
Assignment operator.
Iterator for column views.
typename std::iterator_traits< POINTER >::difference_type difference_type
Difference type.
typename std::iterator_traits< POINTER >::reference reference
Reference type.
col_view_iterator(POINTER data_, difference_type stride_, difference_type offset_)
Constructor.
const reference operator[](difference_type n) const
Access a const reference n elements away.
typename std::iterator_traits< POINTER >::iterator_category iterator_category
Iterator category.
POINTER pointer
Pointer type.
col_view_iterator< POINTER > & operator--(col_view_iterator< POINTER > &i)
col_view_iterator< POINTER > operator+(col_view_iterator< POINTER > i, typename col_view_iterator< POINTER >::difference_type d)