My Project
reverse_iterator.hpp
Go to the documentation of this file.
1 
28 #ifndef BSL_REVERSE_ITERATOR_HPP
29 #define BSL_REVERSE_ITERATOR_HPP
30 
31 #include "cstdint.hpp"
32 
33 // TODO
34 // - We need to implement the remianing functions that are part of the
35 // reverse iterator specification. Specifically, the increment and
36 // decrement by "n" functions as they all require the safe_int class
37 // to be effective at preventing wrapping, overruns and underruns.
38 // Currently we only support the ++/-- functions as those are simple
39 // to implement without the need for safe_int. Also note that we would
40 // need some extra logic to ensure the iterator stays in-bounds.
41 //
42 
43 namespace bsl
44 {
77  template<typename Iter>
78  class reverse_iterator final
79  {
80  public:
82  using value_type = typename Iter::value_type;
88  using reference_type = typename Iter::value_type &;
90  using const_reference_type = typename Iter::value_type const &;
92  using pointer_type = typename Iter::value_type *;
94  using const_pointer_type = typename Iter::value_type const *;
95 
105  explicit constexpr reverse_iterator(Iter const &i) noexcept // --
106  : m_i{i}
107  {}
108 
116  [[nodiscard]] constexpr Iter
117  base() const noexcept
118  {
119  return m_i;
120  }
121 
129  [[nodiscard]] constexpr pointer_type
130  data() noexcept
131  {
132  return m_i.data();
133  }
134 
142  [[nodiscard]] constexpr const_pointer_type
143  data() const noexcept
144  {
145  return m_i.data();
146  }
147 
155  [[nodiscard]] constexpr size_type
156  size() const noexcept
157  {
158  return m_i.size();
159  }
160 
169  [[nodiscard]] constexpr size_type
170  index() const noexcept
171  {
172  if (m_i.index() == 0U) {
173  return m_i.size();
174  }
175 
176  return m_i.index() - 1U;
177  }
178 
186  [[nodiscard]] constexpr bool
187  empty() const noexcept
188  {
189  return m_i.empty();
190  }
191 
199  [[nodiscard]] constexpr bool
200  is_end() const noexcept
201  {
202  return 0U == m_i.index();
203  }
204 
222  [[nodiscard]] constexpr pointer_type
223  get_if() noexcept
224  {
225  if (nullptr == m_i.data()) {
226  return nullptr;
227  }
228 
229  if (m_i.index() == 0U) {
230  return nullptr;
231  }
232 
233  return &m_i.data()[m_i.index() - 1U]; // PRQA S 4024 // NOLINT
234  }
235 
243  [[maybe_unused]] constexpr reverse_iterator &
244  operator++() noexcept
245  {
246  --m_i;
247  return *this;
248  }
249 
257  [[maybe_unused]] constexpr reverse_iterator &
258  operator--() noexcept
259  {
260  ++m_i;
261  return *this;
262  }
263 
264  private:
266  Iter m_i;
267  };
268 
280  template<typename T>
281  [[nodiscard]] constexpr bool
282  operator==(reverse_iterator<T> const &lhs, reverse_iterator<T> const &rhs) noexcept
283  {
284  return lhs.base() == rhs.base();
285  }
286 
298  template<typename T>
299  [[nodiscard]] constexpr bool
300  operator!=(reverse_iterator<T> const &lhs, reverse_iterator<T> const &rhs) noexcept
301  {
302  return !(lhs == rhs);
303  }
304 
316  template<typename T>
317  [[nodiscard]] constexpr bool
318  operator<(reverse_iterator<T> const &lhs, reverse_iterator<T> const &rhs) noexcept
319  {
320  return lhs.base() > rhs.base();
321  }
322 
334  template<typename T>
335  [[nodiscard]] constexpr bool
336  operator<=(reverse_iterator<T> const &lhs, reverse_iterator<T> const &rhs) noexcept
337  {
338  return lhs.base() >= rhs.base();
339  }
340 
352  template<typename T>
353  [[nodiscard]] constexpr bool
354  operator>(reverse_iterator<T> const &lhs, reverse_iterator<T> const &rhs) noexcept
355  {
356  return lhs.base() < rhs.base();
357  }
358 
370  template<typename T>
371  [[nodiscard]] constexpr bool
372  operator>=(reverse_iterator<T> const &lhs, reverse_iterator<T> const &rhs) noexcept
373  {
374  return lhs.base() <= rhs.base();
375  }
376 
386  template<typename Iter>
387  constexpr reverse_iterator<Iter>
388  make_reverse_iterator(Iter const &i) noexcept
389  {
390  return {i};
391  }
392 }
393 
394 #endif
typename Iter::value_type value_type
alias for: typename Iter::value_type
Definition: reverse_iterator.hpp:82
constexpr bool operator==(reverse_iterator< T > const &lhs, reverse_iterator< T > const &rhs) noexcept
Returns lhs.base() == rhs.base()
Definition: reverse_iterator.hpp:282
bsl::uintmax difference_type
alias for: bsl::uintmax
Definition: reverse_iterator.hpp:86
constexpr reverse_iterator & operator++() noexcept
Increments the iterator.
Definition: reverse_iterator.hpp:244
constexpr reverse_iterator & operator--() noexcept
Decrements the iterator.
Definition: reverse_iterator.hpp:258
typename Iter::value_type & reference_type
alias for: typename Iter::value_type &
Definition: reverse_iterator.hpp:88
constexpr bool operator!=(reverse_iterator< T > const &lhs, reverse_iterator< T > const &rhs) noexcept
Returns lhs.base() != rhs.base()
Definition: reverse_iterator.hpp:300
bsl::uintmax size_type
alias for: bsl::uintmax
Definition: reverse_iterator.hpp:84
constexpr size_type index() const noexcept
Returns the iterator's current index. If the iterator is at the end, this function returns size().
Definition: reverse_iterator.hpp:170
constexpr bool operator>=(reverse_iterator< T > const &lhs, reverse_iterator< T > const &rhs) noexcept
Returns lhs.base() >= rhs.base()
Definition: reverse_iterator.hpp:372
constexpr bool is_end() const noexcept
Returns index() == 0.
Definition: reverse_iterator.hpp:200
typename Iter::value_type const & const_reference_type
alias for: typename Iter::value_type const &
Definition: reverse_iterator.hpp:90
Provides a reverse iterator as defined by the C++ specification, with the follwing differences:
Definition: reverse_iterator.hpp:78
constexpr reverse_iterator(Iter const &i) noexcept
Creates a reverse iterator given a an iterator to reverse. It should be noted that you should not cal...
Definition: reverse_iterator.hpp:105
typename Iter::value_type * pointer_type
alias for: typename Iter::value_type *
Definition: reverse_iterator.hpp:92
constexpr pointer_type data() noexcept
Returns a pointer to the array being iterated.
Definition: reverse_iterator.hpp:130
constexpr bool operator>(reverse_iterator< T > const &lhs, reverse_iterator< T > const &rhs) noexcept
Returns lhs.base() > rhs.base()
Definition: reverse_iterator.hpp:354
constexpr bool empty() const noexcept
Returns nullptr == data()
Definition: reverse_iterator.hpp:187
constexpr size_type size() const noexcept
Returns the number of elements in the array being iterated.
Definition: reverse_iterator.hpp:156
constexpr reverse_iterator< Iter > make_reverse_iterator(Iter const &i) noexcept
Constructs a reverse_iterator for a given provided iterator.
Definition: reverse_iterator.hpp:388
typename Iter::value_type const * const_pointer_type
alias for: typename Iter::value_type const *
Definition: reverse_iterator.hpp:94
::uintmax_t uintmax
defines a unsigned integer with the maximum possible size
Definition: cstdint.hpp:97
constexpr Iter base() const noexcept
Returns a pointer to the array being iterated.
Definition: reverse_iterator.hpp:117
constexpr pointer_type get_if() noexcept
Returns a pointer to the instance of T stored at the iterator's current index. If the index is out of...
Definition: reverse_iterator.hpp:223
constexpr const_pointer_type data() const noexcept
Returns a pointer to the array being iterated.
Definition: reverse_iterator.hpp:143