#ifndef PYTHONIC_BUILTIN_ENUMERATE_HPP #define PYTHONIC_BUILTIN_ENUMERATE_HPP #include "pythonic/include/builtins/enumerate.hpp" #include "pythonic/utils/functor.hpp" #include PYTHONIC_NS_BEGIN namespace builtins { namespace details { /// enumerate_iterator implementation template enumerate_iterator::enumerate_iterator() { } template enumerate_iterator::enumerate_iterator(Iterator const &iter, long first) : value(first), iter(iter) { } template enumerate_iterator &enumerate_iterator:: operator+=(long n) { value += n, iter += n; return *this; } // Comparison operators can't use value as end() doesn't have a valid // value content // du to the lake of size information for generator // TODO : We could handle case with && without size if there is a // performances benefits template bool enumerate_iterator:: operator!=(enumerate_iterator const &other) const { return !(*this == other); } template bool enumerate_iterator:: operator<(enumerate_iterator const &other) const { return iter < other.iter; } template bool enumerate_iterator:: operator==(enumerate_iterator const &other) const { return iter == other.iter; } template long enumerate_iterator:: operator-(enumerate_iterator const &other) const { return iter - other.iter; } /// details::enumerate implementation template enumerate::enumerate() { } template enumerate::enumerate(Iterable seq, long first) : Iterable(seq), iterator(Iterable::begin(), first), end_iter(Iterable::end(), -1) { } template typename enumerate::iterator &enumerate::begin() { return *this; } template typename enumerate::iterator const & enumerate::begin() const { return *this; } template typename enumerate::iterator enumerate::end() const { return end_iter; } } /// enumerate implementation template details::enumerate::type>::type> enumerate(Iterable &&seq, long first) { return {std::forward(seq), first}; } } PYTHONIC_NS_END #endif