%PDF- %PDF-
| Direktori : /proc/thread-self/root/lib/python3/dist-packages/pythran/pythonic/include/builtins/ |
| Current File : //proc/thread-self/root/lib/python3/dist-packages/pythran/pythonic/include/builtins/enumerate.hpp |
#ifndef PYTHONIC_INCLUDE_BUILTIN_ENUMERATE_HPP
#define PYTHONIC_INCLUDE_BUILTIN_ENUMERATE_HPP
#include "pythonic/include/types/tuple.hpp"
#include "pythonic/include/utils/functor.hpp"
#include <iterator>
PYTHONIC_NS_BEGIN
namespace builtins
{
namespace details
{
// FIXME return value may be a type::make_tuple
template <class Iterator>
using enumerate_iterator_base = std::iterator<
typename std::iterator_traits<Iterator>::iterator_category,
types::make_tuple_t<
long, typename std::iterator_traits<Iterator>::value_type>>;
template <class Iterator>
struct enumerate_iterator : public enumerate_iterator_base<Iterator> {
long value;
Iterator iter;
enumerate_iterator();
enumerate_iterator(Iterator const &iter, long first);
typename enumerate_iterator_base<Iterator>::value_type operator*() const
{
return types::make_tuple(value, *iter);
}
enumerate_iterator &operator++()
{
++value, ++iter;
return *this;
}
enumerate_iterator &operator+=(long n);
bool operator!=(enumerate_iterator const &other) const;
bool operator<(enumerate_iterator const &other) const;
long operator-(enumerate_iterator const &other) const;
bool operator==(enumerate_iterator const &it) const;
};
template <class Iterable>
struct enumerate
: private Iterable, /* to hold a reference on the iterable */
public enumerate_iterator<
typename Iterable::iterator> /* to be compatible with
builtins.next*/
{
using iterator = enumerate_iterator<typename Iterable::iterator>;
using iterator::operator*;
iterator end_iter;
enumerate();
enumerate(Iterable seq, long first);
iterator &begin();
iterator const &begin() const;
iterator end() const;
};
}
template <class Iterable>
details::enumerate<typename std::remove_cv<
typename std::remove_reference<Iterable>::type>::type>
enumerate(Iterable &&seq, long first = 0L);
DEFINE_FUNCTOR(pythonic::builtins, enumerate);
}
PYTHONIC_NS_END
#endif