#ifndef PYTHONIC_NUMPY_NDENUMERATE_HPP #define PYTHONIC_NUMPY_NDENUMERATE_HPP #include "pythonic/include/numpy/ndenumerate.hpp" #include "pythonic/utils/functor.hpp" PYTHONIC_NS_BEGIN namespace numpy { template ndenumerate_iterator::ndenumerate_iterator() { } template ndenumerate_iterator::ndenumerate_iterator(E const &expr, long first) : index(first), expr(expr), iter(expr.buffer) { } template std::tuple, typename E::dtype> ndenumerate_iterator::operator*() const { types::array out; auto shape = sutils::getshape(expr); long mult = 1; for (long j = E::value - 1; j > 0; j--) { out[j] = (index / mult) % shape[j]; mult *= shape[j]; } out[0] = index / mult; return std::tuple, typename E::dtype>{out, *iter}; } template ndenumerate_iterator &ndenumerate_iterator::operator++() { ++index, ++iter; return *this; } template ndenumerate_iterator &ndenumerate_iterator::operator+=(long n) { index += n, iter += n; return *this; } template bool ndenumerate_iterator:: operator!=(ndenumerate_iterator const &other) const { return index != other.index; } template bool ndenumerate_iterator:: operator<(ndenumerate_iterator const &other) const { return index < other.index; } template long ndenumerate_iterator:: operator-(ndenumerate_iterator const &other) const { return index - other.index; } template _ndenumerate::_ndenumerate() { } template _ndenumerate::_ndenumerate(E const &expr) : ndenumerate_iterator(expr, 0), expr(expr), end_iter(expr, expr.flat_size()) { } template typename _ndenumerate::iterator &_ndenumerate::begin() { return *this; } template typename _ndenumerate::iterator const &_ndenumerate::begin() const { return *this; } template typename _ndenumerate::iterator _ndenumerate::end() const { return end_iter; } template _ndenumerate> ndenumerate(types::ndarray const &expr) { return {expr}; } NUMPY_EXPR_TO_NDARRAY0_IMPL(ndenumerate); } PYTHONIC_NS_END #endif