6namespace CppClingo::Util {
20 requires std::forward_iterator<T> || std::integral<T>
24template <std::forward_iterator T>
class enumerate<T> {
32 using value_type = std::pair<size_t, typename T::reference>;
40 iterator(
size_t num, T cur) : num_{num}, cur_{cur} {}
60 friend auto operator==(iterator
const &a, iterator
const &b) ->
bool {
return a.cur_ == b.cur_; }
66 static_assert(std::forward_iterator<iterator>);
70 requires std::is_lvalue_reference_v<U>
74 enumerate(T begin, T end) : begin_{begin}, end_{end} {}
77 [[nodiscard]]
auto begin() const -> iterator {
return {0, begin_}; }
79 [[nodiscard]]
auto end() const -> iterator {
return {0, end_}; }
88 requires std::is_lvalue_reference_v<U>
95template <std::
integral T>
class enumerate<T> {
98 enumerate(T begin, T end) : begin_{begin}, end_{end} {}
128 iterator tmp = *
this;
134 friend auto operator==(iterator
const &a, iterator
const &b) ->
bool =
default;
139 static_assert(std::forward_iterator<iterator>);
142 [[nodiscard]]
auto begin() const -> iterator {
return {begin_}; }
144 [[nodiscard]]
auto end() const -> iterator {
return {end_}; }
iterator(value_type cur)
Construct an iterator from an integer.
Definition enumerate.hh:115
auto operator*() const -> value_type
Get the reference.
Definition enumerate.hh:43
auto operator++(int) -> iterator
Advance the iterator.
Definition enumerate.hh:53
friend auto operator==(iterator const &a, iterator const &b) -> bool=default
Compare two iterators.
iterator()=default
Construct an invalid iterator.
auto operator++() -> iterator &
Advance the iterator.
Definition enumerate.hh:46
iterator(size_t num, T cur)
Construct an iterator from an index and a forward iterator.
Definition enumerate.hh:40
std::make_signed_t< size_t > difference_type
The difference type.
Definition enumerate.hh:34
friend auto operator==(iterator const &a, iterator const &b) -> bool
Compare two iterators.
Definition enumerate.hh:60
std::forward_iterator_tag iterator_category
The iterator category.
Definition enumerate.hh:30
std::pair< size_t, typename T::reference > value_type
The index and the reference the iterator is referring to.
Definition enumerate.hh:32
enumerate(T begin, T end)
Enumerate an iterator range.
Definition enumerate.hh:74
auto end() const -> iterator
Get the end iterator (sentinel).
Definition enumerate.hh:79
enumerate(U &&x)
Enumerate an iterable collection.
Definition enumerate.hh:72
auto begin() const -> iterator
Get the begin iterator.
Definition enumerate.hh:77
enumerate(T end)
Enumerate an integer range.
Definition enumerate.hh:100
A python style enumerate/range object.
Definition enumerate.hh:21
Concept ensuring a collection is iterable.
Definition enumerate.hh:13