#ifndef PYTHONIC_OPERATOR_ITEMGETTER_HPP #define PYTHONIC_OPERATOR_ITEMGETTER_HPP #include "pythonic/include/operator_/itemgetter.hpp" #include "pythonic/utils/functor.hpp" #include "pythonic/types/tuple.hpp" #include "pythonic/utils/int_.hpp" PYTHONIC_NS_BEGIN namespace operator_ { itemgetter_return::itemgetter_return(long const &item) : i(item) { } template auto itemgetter_return::operator()(A const &a) const -> decltype(a[i]) { return a[i]; } itemgetter_return itemgetter(long item) { return itemgetter_return(item); } template itemgetter_tuple_return::itemgetter_tuple_return(Types... items) : items(items...) { } template itemgetter_tuple_return::itemgetter_tuple_return() { } template template void itemgetter_tuple_return::helper(T &t, A const &a, utils::int_) const { std::get(t) = a[std::get(items)]; helper(t, a, utils::int_()); } template template void itemgetter_tuple_return::helper(T &t, A const &a, utils::int_<0>) const { std::get<0>(t) = a[std::get<0>(items)]; } template template auto itemgetter_tuple_return::operator()(A const &a) const -> std::tuple()])>::type>::type...> { std::tuple()])>::type>::type...> t; helper(t, a, utils::int_()); return t; } template itemgetter_tuple_return itemgetter(long const &item1, long const &item2, L... items) { return {item1, item2, items...}; } } PYTHONIC_NS_END #endif