15 explicit EnumerateWrapper(T&& iterable)
16 : iterable_(std::forward<T>(iterable))
20 template <
typename IterType>
24 using iterator_category = std::input_iterator_tag;
25 using difference_type = std::ptrdiff_t;
26 using element_reference =
decltype(*std::declval<IterType&>());
27 using value_type = std::tuple<std::size_t, std::remove_cvref_t<element_reference>>;
29 using reference = std::tuple<std::size_t, element_reference>;
31 Iterator(IterType iter,
const std::size_t index)
37 Iterator& operator++()
44 Iterator operator++(
int)
46 Iterator previous = *
this;
51 bool operator==(
const Iterator& other)
const
53 return iter_ == other.iter_;
56 bool operator!=(
const Iterator& other)
const
58 return !(*
this == other);
61 reference operator*()
const
63 return reference{ index_, *iter_ };
73 return Iterator<
decltype(std::begin(iterable_))>{ std::begin(iterable_), 0 };
78 return Iterator<
decltype(std::end(iterable_))>{ std::end(iterable_), 0 };
83 return Iterator<
decltype(std::begin(iterable_))>{ std::begin(iterable_), 0 };
88 return Iterator<
decltype(std::end(iterable_))>{ std::end(iterable_), 0 };