codac 1.5.6
Loading...
Searching...
No Matches
codac2_FunctionBase.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <map>
13#include "codac2_ExprBase.h"
16
17// todo: remove this:
19
20namespace codac2
21{
22 template<typename E>
23 class FunctionBase
24 {
25 public:
26
27 FunctionBase(const std::vector<std::reference_wrapper<VarBase>>& args, const std::shared_ptr<E>& y)
28 : FunctionBase(FunctionArgsList(args),y)
29 { }
30
31 FunctionBase(const FunctionArgsList& args, const std::shared_ptr<E>& y)
32 : _y(std::dynamic_pointer_cast<E>(y->copy())), _args(args)
33 { }
34
35 FunctionBase(const FunctionBase<E>& f)
36 : _y(std::dynamic_pointer_cast<E>(f.expr()->copy())), _args(f.args()) // todo: keep this dynamic_pointer_cast?
37 { }
38
39 virtual ~FunctionBase()
40 { }
41
42 const FunctionArgsList& args() const
43 {
44 return _args;
45 }
46
47 const std::shared_ptr<E>& expr() const
48 {
49 return _y;
50 }
51
52 template<typename... X>
53 std::shared_ptr<E> operator()(const X&... x) const
54 {
55 auto expr_copy = expr()->copy();
56 size_t i = 0;
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);
61 }
62
63 std::shared_ptr<E> operator()(const std::vector<std::shared_ptr<ExprBase>>& x) const
64 {
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);
71 }
72
73 Index input_size() const
74 {
75 return this->_args.total_size();
76 }
77
78 protected:
79
80 template<typename X>
81 std::shared_ptr<X> __get_copy(std::shared_ptr<X> x) const
82 {
83 return std::dynamic_pointer_cast<X>(x->copy());
84 }
85
86 template<typename X>
87 std::shared_ptr<ExprBase> __get_copy(const AnalyticExprWrapper<X>& x) const
88 {
89 return x->copy();
90 }
91
92 template<typename A>
93 auto __get_copy(const A& x) const
94 {
95 if constexpr(std::is_base_of_v<VarBase,A>)
96 return std::dynamic_pointer_cast<A>(x.copy());
97 else
98 {
99 // todo: make this generic (analytic / set):
100 return const_value(x);
101 }
102 }
103
104 const std::shared_ptr<E> _y;
105 const FunctionArgsList _args;
106 };
107}