gslcpp
Modern-C++ Wrapper for GSL
v-iterator.hpp
Go to the documentation of this file.
1 /// \file include/gslcpp/vec/v-iterator.hpp
2 /// \copyright 2022 Thomas E. Vaughan, all rights reserved.
3 /// \brief Definition for gsl::v_iterator.
4 
5 #pragma once
6 
7 #include <iterator> // random_access_iterator_tag
8 
9 namespace gsl {
10 
11 
12 /// Iterator for v_iface. There is no `operator->` because element is always
13 /// of type double. Even if vector actually have non-const elements, const
14 /// vector is treated as having const elements.
15 /// @tparam V Either v_iface or v_iface const.
16 template<typename V> class v_iterator {
17 public:
18  /// Type of difference of two iterators.
19  using difference_type= std::ptrdiff_t;
20 
21 private:
22  V &vi_; ///< Reference to instance of container.
23  difference_type off_; ///< Current offset pointed to in container.
24 
25  // Make each type of iterator be a friend to the other.
26  template<typename OV> friend class v_iterator;
27 
28  /// Throw exception if each of two iterators point into different vector.
29  /// @tparam B Type of vector for second iterator.
30  /// @param b Second iterator.
31  template<typename B> void check_same_vector(v_iterator<B> const &b) const {
32  if(&vi_ != &b.vi_) {
33  throw std::runtime_error("iterators for different vectors");
34  }
35  }
36 
37  /// Generic declaration for struct that gives type of vector's element. Even
38  /// if vector actually have non-const elements, const vector is treated as
39  /// having const elements.
40  /// @tparam is_const True for constant-type element.
41  template<bool is_const> struct element;
42 
43  /// Specialization for constant type of element of vector. Even if vector
44  /// actually have non-const elements, const vector is treated as having const
45  /// elements.
46  template<> struct element<true> { using type= typename V::E const; };
47 
48  /// Specialization for non-constant type of element for vector. Even if
49  /// vector actually have non-const elements, const vector is treated as
50  /// having const elements.
51  template<> struct element<false> { using type= typename V::E; };
52 
53  /// Type of element for vector. Even if vector actually have non-const
54  /// elements, const vector is treated as having const elements.
55  using E= typename element<std::is_const_v<V>>::type;
56 
57 public:
58  using pointer= E *; ///< Type of pointer to element in container.
59  using value_type= E; ///< Type of element in container.
60  using reference= E &; ///< Type of reference to element in container.
61 
62  /// Indicate, to standard library, that iterator is random-access.
63  using iterator_category= std::random_access_iterator_tag;
64 
65  /// Construct instance of iterator.
66  /// @param vi Reference to container of element pointed to.
67  /// @param off Offset of element pointed to in container.
68  v_iterator(V &vi, difference_type off): vi_(vi), off_(off) {}
69 
70  /// Dereference iterator.
71  /// @return Reference to element pointed to by iterator.
72  reference operator*() const { return vi_[off_]; }
73 
74  /// Dereference element at offset from element pointed to by iterator.
75  /// @param i Offset from element pointed to by iterator.
76  /// @return Reference to element at offset `i` from current element.
77  reference operator[](difference_type i) const { return vi_[off_ + i]; }
78 
79  /// Increment offset of element pointed to.
80  /// @return Reference to this instance after increment of offset.
81  v_iterator &operator++() {
82  ++off_;
83  return *this;
84  }
85 
86  /// Increment offset of element pointed to.
87  /// @return Copy of this instance made before increment of offset.
88  v_iterator operator++(int) {
89  v_iterator tmp= *this;
90  ++(*this); // Call prefix-increment!
91  return tmp;
92  }
93 
94  /// Decrement offset of element pointed to.
95  /// @return Reference to this instance after decrement of offset.
96  v_iterator &operator--() {
97  --off_;
98  return *this;
99  }
100 
101  /// Decrement offset of element pointed to.
102  /// @return Copy of this instance made before decrement of offset.
103  v_iterator operator--(int) {
104  v_iterator tmp= *this;
105  --(*this); // Call prefix-decrement!
106  return tmp;
107  }
108 
109  /// For positive `n`, increase, by `n`, offset of element pointed to. This
110  /// is like fast forward in place for an iterator. Do nothing when `n == 0`.
111  /// Actually decrease offset when `n < 0`.
112  /// @param n Number by which to increase offset.
113  /// @return Reference to this instance after increase of offset.
114  v_iterator &operator+=(difference_type n) {
115  off_+= n;
116  return *this;
117  }
118 
119  /// For positive `n`, decrease, by `n`, offset of element pointed to. This
120  /// is like fast reverse in place for an iterator. Do nothing when `n == 0`.
121  /// Actually increase offset when `n < 0`.
122  /// @param n Number by which to decrease offset.
123  /// @return Reference to this instance after decrease of offset.
124  v_iterator &operator-=(difference_type n) {
125  off_-= n;
126  return *this;
127  }
128 
129  /// Produce new iterator at offset greater than that of existing iterator.
130  /// This is like fast forward for an iterator.
131  /// @param i Iterator.
132  /// @param n Offset.
133  /// @return Iterator whose internal offset is `n` more than that of `i`.
134  friend v_iterator operator+(v_iterator i, difference_type n) {
135  i+= n;
136  return i;
137  }
138 
139  /// Produce new iterator at offset greater than that of existing iterator.
140  /// This is like fast forward for an iterator.
141  /// @param n Offset.
142  /// @param i Iterator.
143  /// @return Iterator whose internal offset is `n` more than that of `i`.
144  friend v_iterator operator+(difference_type n, v_iterator i) {
145  return i + n;
146  }
147 
148  /// Produce new iterator at offset less than that of existing iterator. This
149  /// is like fast reverse for an iterator.
150  /// @param i Iterator.
151  /// @param n Offset.
152  /// @return Iterator whose internal offset is `n` less than that of `i`.
153  friend v_iterator operator-(v_iterator i, difference_type n) {
154  i-= n;
155  return i;
156  }
157 
158  /// Difference in offset between two iterators. Throw runtime_error if
159  /// iterators do not point into same vector.
160  /// @tparam I Type of vector for iterator with offset to subtract.
161  /// @param i Iterator with offset to subtract.
162  /// @return Difference between offset of this iterator and offset of `i`.
163  template<typename I>
164  difference_type operator-(v_iterator<I> const &i) const {
165  check_same_vector(i);
166  return off_ - i.off_;
167  }
168 
169  /// Compare two iterators for equality. Throw runtime_error if iterators do
170  /// not point into same vector.
171  /// @tparam B Type of vector for second iterator.
172  /// @param b Second iterator.
173  /// @return True only if this and second iterator point to same element.
174  template<typename B> bool operator==(v_iterator<B> const &b) const {
175  check_same_vector(b);
176  return off_ == b.off_;
177  }
178 
179  /// Compare two iterators for inequality. Throw runtime_error if iterators
180  /// do not point into same vector.
181  /// @tparam B Type of vector for second iterator.
182  /// @param b Second iterator.
183  /// @return True only if this and second do not point to same element.
184  template<typename B> bool operator!=(v_iterator<B> const &b) const {
185  check_same_vector(b);
186  return off_ != b.off_;
187  }
188 
189  /// Compare two iterators for ordering. Throw runtime_error if iterators do
190  /// not point into same vector.
191  /// @tparam B Type of vector for second iterator.
192  /// @param b Second iterator.
193  /// @return True only if this iterator point to element earlier in vector
194  /// than element pointed to by second iterator.
195  template<typename B> bool operator<(v_iterator<B> const &b) const {
196  check_same_vector(b);
197  return off_ < b.off_;
198  }
199 
200  /// Compare two iterators for ordering. Throw runtime_error if iterators do
201  /// not point into same vector.
202  /// @tparam B Type of vector for second iterator.
203  /// @param b Second iterator.
204  /// @return True only if this iterator point to element later in vector
205  /// than element pointed to by second iterator.
206  template<typename B> bool operator>(v_iterator<B> const &b) const {
207  check_same_vector(b);
208  return off_ > b.off_;
209  }
210 
211  /// Compare two iterators for ordering. Throw runtime_error if iterators do
212  /// not point into same vector.
213  /// @tparam B Type of vector for second iterator.
214  /// @param b Second iterator.
215  /// @return True only if this iterator point to element either same as or
216  /// earlier in vector than element pointed to by second iterator.
217  template<typename B> bool operator<=(v_iterator<B> const &b) const {
218  check_same_vector(b);
219  return off_ <= b.off_;
220  }
221 
222  /// Compare two iterators for ordering. Throw runtime_error if iterators do
223  /// not point into same vector.
224  /// @tparam B Type of vector for second iterator.
225  /// @param b Second iterator.
226  /// @return True only if this iterator point to element either same as or
227  /// later in vector than element pointed to by second iterator.
228  template<typename B> bool operator>=(v_iterator<B> const &b) const {
229  check_same_vector(b);
230  return off_ >= b.off_;
231  }
232 };
233 
234 
235 } // namespace gsl
236 
237 // EOF
gsl::v_iterator::operator>=
bool operator>=(v_iterator< B > const &b) const
Compare two iterators for ordering.
Definition: v-iterator.hpp:228
gsl::v_iterator::operator*
reference operator*() const
Dereference iterator.
Definition: v-iterator.hpp:72
gsl::v_iterator::operator-
friend v_iterator operator-(v_iterator i, difference_type n)
Produce new iterator at offset less than that of existing iterator.
Definition: v-iterator.hpp:153
gsl::v_iterator::operator-
difference_type operator-(v_iterator< I > const &i) const
Difference in offset between two iterators.
Definition: v-iterator.hpp:164
gsl::v_iterator::operator++
v_iterator operator++(int)
Increment offset of element pointed to.
Definition: v-iterator.hpp:88
gsl::v_iterator::vi_
V & vi_
Reference to instance of container.
Definition: v-iterator.hpp:22
gsl::v_iterator::check_same_vector
void check_same_vector(v_iterator< B > const &b) const
Throw exception if each of two iterators point into different vector.
Definition: v-iterator.hpp:31
gsl::v_iterator::operator+
friend v_iterator operator+(v_iterator i, difference_type n)
Produce new iterator at offset greater than that of existing iterator.
Definition: v-iterator.hpp:134
gsl::v_iterator::operator[]
reference operator[](difference_type i) const
Dereference element at offset from element pointed to by iterator.
Definition: v-iterator.hpp:77
gsl::v_iterator::off_
difference_type off_
Current offset pointed to in container.
Definition: v-iterator.hpp:23
gsl::v_iterator::operator--
v_iterator & operator--()
Decrement offset of element pointed to.
Definition: v-iterator.hpp:96
gsl::v_iterator::operator<=
bool operator<=(v_iterator< B > const &b) const
Compare two iterators for ordering.
Definition: v-iterator.hpp:217
gsl::v_iterator::operator>
bool operator>(v_iterator< B > const &b) const
Compare two iterators for ordering.
Definition: v-iterator.hpp:206
gsl::v_iterator::operator<
bool operator<(v_iterator< B > const &b) const
Compare two iterators for ordering.
Definition: v-iterator.hpp:195
gsl::v_iterator::operator-=
v_iterator & operator-=(difference_type n)
For positive n, decrease, by n, offset of element pointed to.
Definition: v-iterator.hpp:124
gsl::v_iterator::operator++
v_iterator & operator++()
Increment offset of element pointed to.
Definition: v-iterator.hpp:81
gsl::v_iterator::operator==
bool operator==(v_iterator< B > const &b) const
Compare two iterators for equality.
Definition: v-iterator.hpp:174
gsl::v_iterator::v_iterator
v_iterator(V &vi, difference_type off)
Construct instance of iterator.
Definition: v-iterator.hpp:68
gsl::v_iterator::operator+
friend v_iterator operator+(difference_type n, v_iterator i)
Produce new iterator at offset greater than that of existing iterator.
Definition: v-iterator.hpp:144
gsl::v_iterator::operator+=
v_iterator & operator+=(difference_type n)
For positive n, increase, by n, offset of element pointed to.
Definition: v-iterator.hpp:114
gsl
Namespace for C++-interface to GSL.
Definition: v-iface.hpp:51
gsl::v_iterator::operator--
v_iterator operator--(int)
Decrement offset of element pointed to.
Definition: v-iterator.hpp:103
gsl::v_iterator::operator!=
bool operator!=(v_iterator< B > const &b) const
Compare two iterators for inequality.
Definition: v-iterator.hpp:184