BRICKS
Small, useful blocks of code, to build bigger things.
Loading...
Searching...
No Matches
reverse.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <iterator>
4
5namespace bricks::detail {
6
7template <typename Range>
8class reverse_iter {
9 private:
10 typename Range::reverse_iterator iter_;
11
12 public:
13 using difference_type = std::ptrdiff_t;
14 using value_type = typename Range::value_type;
15 using pointer = value_type*;
16 using reference = value_type&;
17 using iterator_category = std::forward_iterator_tag;
18
19 explicit reverse_iter(typename Range::reverse_iterator iter) : iter_{iter} {}
20
21 auto operator++() -> reverse_iter&
22 {
23 ++iter_;
24 return *this;
25 }
26
27 auto operator++(int) -> reverse_iter
28 {
29 auto tmp = *this;
30 ++*this;
31 return tmp;
32 }
33
34 auto operator==(const reverse_iter& other) const -> bool { return iter_ == other.iter_; }
35 auto operator!=(const reverse_iter& other) const -> bool { return !(*this == other); }
36
37 auto operator*() const -> value_type& { return *iter_; }
38};
39
40template <typename Range>
41class reverser {
42 private:
43 Range& range_;
44
45 public:
46 explicit reverser(Range& range) : range_{range} {}
47
48 auto begin() -> reverse_iter<Range> { return reverse_iter<Range>{std::rbegin(range_)}; }
49 auto end() -> reverse_iter<Range> { return reverse_iter<Range>{std::rend(range_)}; }
50};
51
52} // namespace bricks::detail