19 #ifdef PYSTON_GRAPH_FUNCTION_IMPL
23 template <
typename R,
size_t N,
typename... Evaluated>
24 struct FunctionEvalHelper {
25 template <
typename Functor,
typename ChildrenSet>
26 static R eval(
const Context& context,
const Arguments& args,
const Functor& functor,
const ChildrenSet& children,
27 Evaluated&&... evaluated) {
28 auto&& a = std::get<
N - 1>(children)->eval(context, args);
29 return FunctionEvalHelper<R,
N - 1, decltype(a), Evaluated...>::eval(
30 context, args, functor, children,
std::forward<decltype(a)>(a), std::forward<Evaluated>(evaluated)...);
34 template <
typename R,
typename... Evaluated>
35 struct FunctionEvalHelper<R, 0, Evaluated...> {
36 template <
typename Functor,
typename ChildrenSet>
37 static R eval(
const Context& context,
const Arguments&,
const Functor& functor,
const ChildrenSet&,
38 Evaluated&&... evaluated) {
39 return functor(context, std::forward<Evaluated>(evaluated)...);
44 struct FunctionVisitHelper {
45 template <
typename ChildrenSet>
46 static void visit(Visitor& visitor,
const ChildrenSet& children) {
47 FunctionVisitHelper<N - 1>::visit(visitor, children);
48 std::get<N - 1>(children)->visit(visitor);
53 struct FunctionVisitHelper<0> {
54 template <
typename ChildrenSet>
55 static void visit(Visitor&,
const ChildrenSet&) {}
58 template <
typename R,
typename... Args>
60 return FunctionEvalHelper<R,
sizeof...(Args)>::eval(context, args, m_functor, m_children);
63 template <
typename R,
typename... Args>
66 FunctionVisitHelper<
sizeof...(Args)>::visit(visitor, m_children);
std::map< std::string, boost::any > Context
std::vector< Value > Arguments
R eval(const Context &context, const Arguments &args) const final
void visit(Visitor &visitor) const final