#ifndef PYTHONIC_INCLUDE_NUMPY_NDENUMERATE_HPP #define PYTHONIC_INCLUDE_NUMPY_NDENUMERATE_HPP #include "pythonic/include/utils/functor.hpp" PYTHONIC_NS_BEGIN namespace numpy { template struct ndenumerate_iterator : std::iterator< std::random_access_iterator_tag, std::tuple, typename E::dtype>> { long index; E const &expr; typename E::dtype *iter; ndenumerate_iterator(); ndenumerate_iterator(E const &expr, long first); std::tuple, typename E::dtype> operator*() const; ndenumerate_iterator &operator++(); ndenumerate_iterator &operator+=(long n); bool operator!=(ndenumerate_iterator const &other) const; bool operator<(ndenumerate_iterator const &other) const; long operator-(ndenumerate_iterator const &other) const; }; template struct _ndenumerate : ndenumerate_iterator { using iterator = ndenumerate_iterator; E expr; // we need to keep one ref over the enumerated sequence alive iterator end_iter; _ndenumerate(); _ndenumerate(E const &expr); iterator &begin(); iterator const &begin() const; iterator end() const; }; template _ndenumerate> ndenumerate(types::ndarray const &expr); NUMPY_EXPR_TO_NDARRAY0_DECL(ndenumerate); DEFINE_FUNCTOR(pythonic::numpy, ndenumerate); } PYTHONIC_NS_END #endif