14template <
typename Iterator>
class EnumerateIterator
17 using iterator_category =
18 typename std::iterator_traits<Iterator>::iterator_category;
20 std::pair<std::size_t, typename std::iterator_traits<Iterator>::value_type>;
21 using difference_type =
22 typename std::iterator_traits<Iterator>::difference_type;
24 std::pair<std::size_t, typename std::iterator_traits<Iterator>::pointer>;
26 std::pair<std::size_t, typename std::iterator_traits<Iterator>::reference>;
29 std::pair<std::size_t, decltype (*std::declval<Iterator> ())>;
31 EnumerateIterator (Iterator it, std::size_t index = 0)
32 : index_ (index), it_ (it)
36 ValueType operator* ()
const {
return { index_, *it_ }; }
38 EnumerateIterator &operator++ ()
44 EnumerateIterator operator++ (
int)
51 bool operator== (
const EnumerateIterator &other)
const
53 return it_ == other.it_;
55 bool operator!= (
const EnumerateIterator &other)
const
57 return !(*
this == other);
60 bool operator== (
const Iterator &other)
const {
return it_ == other; }