%PDF- %PDF-
| Direktori : /proc/thread-self/root/usr/lib/python3/dist-packages/pythran/pythonic/include/builtins/ |
| Current File : //proc/thread-self/root/usr/lib/python3/dist-packages/pythran/pythonic/include/builtins/map.hpp |
#ifndef PYTHONIC_INCLUDE_BUILTIN_MAP_HPP
#define PYTHONIC_INCLUDE_BUILTIN_MAP_HPP
#include "pythonic/include/itertools/common.hpp"
#include "pythonic/include/types/NoneType.hpp"
#include "pythonic/include/types/tuple.hpp"
#include "pythonic/include/utils/int_.hpp"
#include "pythonic/include/utils/iterator.hpp"
#include "pythonic/include/utils/functor.hpp"
#include "pythonic/include/utils/seq.hpp"
#include <utility>
PYTHONIC_NS_BEGIN
namespace builtins
{
namespace details
{
template <class Operator, class... Iters>
struct map_res {
using type = decltype(
std::declval<Operator>()(std::declval<typename std::iterator_traits<
typename Iters::iterator>::value_type>()...));
};
template <class... Iters>
struct map_res<types::none_type, Iters...> {
using type =
decltype(types::make_tuple(std::declval<typename std::iterator_traits<
typename Iters::iterator>::value_type>()...));
};
template <typename Operator, typename... Iters>
struct map_iterator
: std::iterator<
typename utils::iterator_min<typename Iters::iterator...>::type,
typename map_res<Operator, Iters...>::type> {
std::tuple<typename Iters::iterator...> it;
Operator _op;
map_iterator() = default;
template <size_t... I>
map_iterator(Operator const &_op, std::tuple<Iters...> &_iters,
utils::index_sequence<I...>);
template <size_t... I>
map_iterator(itertools::npos, Operator const &_op,
std::tuple<Iters...> &_iters, utils::index_sequence<I...>);
typename map_res<Operator, Iters...>::type operator*() const;
map_iterator &operator++();
map_iterator &operator+=(long i);
map_iterator operator+(long i) const;
bool operator==(map_iterator const &other) const;
bool operator!=(map_iterator const &other) const;
bool operator<(map_iterator const &other) const;
long operator-(map_iterator const &other) const;
private:
template <size_t N>
long min_len(map_iterator<Operator, Iters...> const &other,
utils::int_<N>) const;
long min_len(map_iterator<Operator, Iters...> const &other,
utils::int_<0>) const;
template <size_t N>
bool equal(map_iterator const &other, utils::int_<N>) const;
bool equal(map_iterator const &other, utils::int_<0>) const;
template <size_t I>
void advance(long i, utils::int_<I>);
void advance(long i, utils::int_<0>);
template <size_t... I>
void next(utils::index_sequence<I...>);
template <size_t... I>
typename map_res<Operator, Iters...>::type
get_value(utils::index_sequence<I...>, std::true_type) const;
template <size_t... I>
typename map_res<Operator, Iters...>::type
get_value(utils::index_sequence<I...>, std::false_type) const;
};
template <typename Operator, typename... Iters>
struct map : utils::iterator_reminder<true, Iters...>,
map_iterator<Operator, Iters...> {
using iterator = map_iterator<Operator, Iters...>;
using value_type = typename iterator::value_type;
using dtype = typename types::dtype_of<value_type>::type;
static constexpr long value =
1 + utils::nested_container_depth<value_type>::value;
iterator end_iter;
map() = default;
// Use an extra template to enable forwarding
template <class... Types>
map(Operator const &_op, Types &&... _iters);
iterator &begin();
iterator const &begin() const;
iterator const &end() const;
};
}
template <typename Operator, typename... Iter>
auto map(Operator &&_op, Iter &&... iters) -> details::map<
typename std::remove_cv<
typename std::remove_reference<Operator>::type>::type,
typename types::iterator<typename std::remove_cv<
typename std::remove_reference<Iter>::type>::type>::type...>;
DEFINE_FUNCTOR(pythonic::builtins, map);
}
namespace types
{
template <class Op, class Iter>
struct len_of<pythonic::builtins::details::map<Op, Iter>> {
static constexpr long value = len_of<typename std::remove_cv<
typename std::remove_reference<Iter>::type>::type>::value;
};
template <class Op, class I0, class I1, class... Iter>
struct len_of<pythonic::builtins::details::map<Op, I0, I1, Iter...>> {
static constexpr long _head = len_of<typename std::remove_cv<
typename std::remove_reference<I0>::type>::type>::value;
static constexpr long _tail =
len_of<pythonic::builtins::details::map<Op, I1, Iter...>>::value;
// take the minimal value. If one is negative, it will be automatically
// selected
static constexpr long value = (_head < _tail ? _head : _tail);
};
}
PYTHONIC_NS_END
/* type inference stuff {*/
#include "pythonic/include/types/combined.hpp"
template <class E, class Op, class... Iter>
struct __combined<E, pythonic::builtins::details::map<Op, Iter...>> {
using type =
typename __combined<E, container<typename pythonic::builtins::details::
map<Op, Iter...>::value_type>>::type;
};
#endif