5namespace bricks::detail {
7template <
typename Range>
10 typename Range::reverse_iterator iter_;
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;
19 explicit reverse_iter(
typename Range::reverse_iterator iter) : iter_{iter} {}
21 auto operator++() -> reverse_iter&
27 auto operator++(
int) -> reverse_iter
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); }
37 auto operator*() const -> value_type& {
return *iter_; }
40template <
typename Range>
46 explicit reverser(Range& range) : range_{range} {}
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_)}; }