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