#ifndef PYTHONIC_INCLUDE_FUNCTOOLS_PARTIAL_HPP #define PYTHONIC_INCLUDE_FUNCTOOLS_PARTIAL_HPP #include "pythonic/include/utils/functor.hpp" #include "pythonic/include/utils/seq.hpp" #include #include PYTHONIC_NS_BEGIN namespace functools { namespace details { /* a task that captures its environment for later call */ template struct task { using callable = void; friend std::ostream &operator<<(std::ostream &os, task) { return os << "partial_function_wrapper"; } mutable std::tuple closure; // closure associated to // the task, mutable // because pythran assumes // all function calls are // const task(); task(task const &) = default; task(ClosureTypes const &... types); template auto call(utils::index_sequence, Types &&... types) const -> decltype(std::get<0>(closure)(std::get(closure)..., std::forward(types)...)) { return std::get<0>(closure)(std::get(closure)..., std::forward(types)...); } template auto operator()(Types &&... types) const -> decltype( this->call(utils::make_index_sequence(), std::forward(types)...)); }; } template // remove references as closure capture the env by copy details::task::type>::type...> partial(Types &&... types); DEFINE_FUNCTOR(pythonic::functools, partial); } PYTHONIC_NS_END #endif