5namespace bricks::detail {
7template <
typename Range>
11 typename Range::iterator iter_;
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;
20 explicit enumerate_iter(
typename Range::iterator iter) : iter_{iter} {}
22 auto operator++() -> enumerate_iter&
29 auto operator++(
int) -> enumerate_iter
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); }
39 auto operator*() const -> value_type {
return {counter_, *iter_}; }
42template <
typename Range>
48 explicit enumerator(Range& range) : range_{range} {}
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_)}; }