#ifndef PYTHONIC_ITERTOOLS_ISLICE_HPP #define PYTHONIC_ITERTOOLS_ISLICE_HPP #include "pythonic/include/itertools/islice.hpp" #include "pythonic/utils/functor.hpp" #include "pythonic/itertools/common.hpp" #include "pythonic/builtins/range.hpp" #include PYTHONIC_NS_BEGIN namespace itertools { template islice_iterator::islice_iterator() { } template islice_iterator::islice_iterator(Iterable const &iterable, builtins::range const &xr) : iterable_ref(iterable), iterable(iterable_ref.begin()), xr_ref(xr), state(xr_ref.begin()), prev(*state) { std::advance(this->iterable, *state); } template islice_iterator::islice_iterator(npos const &n, Iterable const &iterable, builtins::range const &xr) : iterable_ref(iterable), iterable(iterable_ref.begin()), xr_ref(xr), state(xr_ref.end()), prev(0) { } template typename Iterable::value_type islice_iterator::operator*() const { return *iterable; } template islice_iterator &islice_iterator::operator++() { ++state; std::advance(this->iterable, *state - prev); prev = *state; return *this; } template bool islice_iterator:: operator==(islice_iterator const &other) const { return (state == other.state); } template bool islice_iterator:: operator!=(islice_iterator const &other) const { return state != other.state; } template bool islice_iterator:: operator<(islice_iterator const &other) const { return state != other.state; } template int islice_iterator:: operator-(islice_iterator const &other) const { return state - other.state; } template _islice::_islice() { } template _islice::_islice(Iterable const &iterable, builtins::range const &xr) : iterator(iterable, xr), end_iter(npos(), iterable, xr) { } template typename _islice::iterator &_islice::begin() { return *this; } template typename _islice::iterator const &_islice::begin() const { return *this; } template typename _islice::iterator _islice::end() const { return end_iter; } template _islice::type>::type> islice(Iterable &&iterable, long start, long stop, long step) { return {iterable, builtins::range(start, stop, step)}; } template _islice::type>::type> islice(Iterable &&iterable, long stop) { return {iterable, builtins::range(0, stop, 1)}; } } PYTHONIC_NS_END #endif