27 FunctionBase(
const std::vector<std::reference_wrapper<VarBase>>& args,
const std::shared_ptr<E>& y)
28 : FunctionBase(FunctionArgsList(args),y)
31 FunctionBase(
const FunctionArgsList& args,
const std::shared_ptr<E>& y)
32 : _y(std::dynamic_pointer_cast<E>(y->copy())), _args(args)
35 FunctionBase(
const FunctionBase<E>& f)
36 : _y(std::dynamic_pointer_cast<E>(f.expr()->copy())), _args(f.args())
39 virtual ~FunctionBase()
42 const FunctionArgsList& args()
const
47 const std::shared_ptr<E>& expr()
const
52 template<
typename... X>
53 std::shared_ptr<E> operator()(
const X&... x)
const
55 auto expr_copy = expr()->copy();
57 (expr_copy->replace_expr(_args[i++]->unique_id(), this->__get_copy(x)), ...);
58 assert_release(i == this->args().size() &&
59 "Invalid arguments: wrong number of input arguments");
60 return std::dynamic_pointer_cast<E>(expr_copy);
63 std::shared_ptr<E> operator()(
const std::vector<std::shared_ptr<ExprBase>>& x)
const
65 assert_release(x.size() == this->args().size() &&
66 "Invalid arguments: wrong number of input arguments");
67 auto expr_copy = expr()->copy();
68 for(
size_t i = 0 ; i < x.size() ; i++)
69 expr_copy->replace_expr(_args[i]->unique_id(), x[i]->copy());
70 return std::dynamic_pointer_cast<E>(expr_copy);
73 Index input_size()
const
75 return this->_args.total_size();
81 std::shared_ptr<X> __get_copy(std::shared_ptr<X> x)
const
83 return std::dynamic_pointer_cast<X>(x->copy());
87 std::shared_ptr<ExprBase> __get_copy(
const AnalyticExprWrapper<X>& x)
const
93 auto __get_copy(
const A& x)
const
95 if constexpr(std::is_base_of_v<VarBase,A>)
96 return std::dynamic_pointer_cast<A>(x.copy());
100 return const_value(x);
104 const std::shared_ptr<E> _y;
105 const FunctionArgsList _args;