codac 1.5.6
Loading...
Searching...
No Matches
codac2_ScalarExprList.h
Go to the documentation of this file.
1
9
10#pragma once
11
13
14namespace codac2
15{
16 // Template parameter packs cannot be used for ScalarExprList because arguments are
17 // provided by std::initializer_list (see template deduction guides for AnalyticFunction)
18
19 template<typename S>
20 concept IsScalar = std::is_same_v<S,ScalarExpr> || std::is_same_v<S,ScalarVar> ||
21 std::is_same_v<typename ValueType<S>::Type,ScalarType>;
22
23 struct ScalarExprList : public AnalyticExprWrapper<VectorType>
24 {
25 template<typename S1>
26 requires IsScalar<S1>
27 ScalarExprList(const S1& y1)
28 : AnalyticExprWrapper<VectorType>(vec(to_ScalarExpr(y1)))
29 { }
30
31 template<typename S1,typename S2>
32 requires IsScalar<S1> && IsScalar<S2>
33 ScalarExprList(const S1& y1, const S2& y2)
34 : AnalyticExprWrapper<VectorType>(vec(
35 to_ScalarExpr(y1),to_ScalarExpr(y2)
36 ))
37 { }
38
39 template<typename S1,typename S2,typename S3>
40 requires IsScalar<S1> && IsScalar<S2> && IsScalar<S3>
41 ScalarExprList(const S1& y1, const S2& y2, const S3& y3)
42 : AnalyticExprWrapper<VectorType>(vec(
43 to_ScalarExpr(y1), to_ScalarExpr(y2), to_ScalarExpr(y3)
44 ))
45 { }
46
47 template<typename S1,typename S2,typename S3,typename S4>
48 requires IsScalar<S1> && IsScalar<S2> && IsScalar<S3> && IsScalar<S4>
49 ScalarExprList(const S1& y1, const S2& y2, const S3& y3, const S4& y4)
50 : AnalyticExprWrapper<VectorType>(vec(
51 to_ScalarExpr(y1), to_ScalarExpr(y2), to_ScalarExpr(y3), to_ScalarExpr(y4)
52 ))
53 { }
54
55 template<typename S1,typename S2,typename S3,typename S4,typename S5>
56 requires IsScalar<S1> && IsScalar<S2> && IsScalar<S3> && IsScalar<S4> && IsScalar<S5>
57 ScalarExprList(const S1& y1, const S2& y2, const S3& y3, const S4& y4, const S5& y5)
58 : AnalyticExprWrapper<VectorType>(vec(
59 to_ScalarExpr(y1), to_ScalarExpr(y2), to_ScalarExpr(y3), to_ScalarExpr(y4), to_ScalarExpr(y5)
60 ))
61 { }
62
63 template<typename S1,typename S2,typename S3,typename S4,typename S5,
64 typename S6>
65 requires IsScalar<S1> && IsScalar<S2> && IsScalar<S3> && IsScalar<S4> && IsScalar<S5>
66 && IsScalar<S6>
67 ScalarExprList(const S1& y1, const S2& y2, const S3& y3, const S4& y4, const S5& y5,
68 const S6& y6)
69 : AnalyticExprWrapper<VectorType>(vec(
70 to_ScalarExpr(y1), to_ScalarExpr(y2), to_ScalarExpr(y3), to_ScalarExpr(y4), to_ScalarExpr(y5),
71 to_ScalarExpr(y6)
72 ))
73 { }
74
75 template<typename S1,typename S2,typename S3,typename S4,typename S5,
76 typename S6,typename S7>
77 requires IsScalar<S1> && IsScalar<S2> && IsScalar<S3> && IsScalar<S4> && IsScalar<S5>
78 && IsScalar<S6> && IsScalar<S7>
79 ScalarExprList(const S1& y1, const S2& y2, const S3& y3, const S4& y4, const S5& y5,
80 const S6& y6, const S7& y7)
81 : AnalyticExprWrapper<VectorType>(vec(
82 to_ScalarExpr(y1), to_ScalarExpr(y2), to_ScalarExpr(y3), to_ScalarExpr(y4), to_ScalarExpr(y5),
83 to_ScalarExpr(y6), to_ScalarExpr(y7)
84 ))
85 { }
86
87 template<typename S1,typename S2,typename S3,typename S4,typename S5,
88 typename S6,typename S7,typename S8>
89 requires IsScalar<S1> && IsScalar<S2> && IsScalar<S3> && IsScalar<S4> && IsScalar<S5>
90 && IsScalar<S6> && IsScalar<S7> && IsScalar<S8>
91 ScalarExprList(const S1& y1, const S2& y2, const S3& y3, const S4& y4, const S5& y5,
92 const S6& y6, const S7& y7, const S8& y8)
93 : AnalyticExprWrapper<VectorType>(vec(
94 to_ScalarExpr(y1), to_ScalarExpr(y2), to_ScalarExpr(y3), to_ScalarExpr(y4), to_ScalarExpr(y5),
95 to_ScalarExpr(y6), to_ScalarExpr(y7), to_ScalarExpr(y8)
96 ))
97 { }
98
99 template<typename S1,typename S2,typename S3,typename S4,typename S5,
100 typename S6,typename S7,typename S8,typename S9>
101 requires IsScalar<S1> && IsScalar<S2> && IsScalar<S3> && IsScalar<S4> && IsScalar<S5>
102 && IsScalar<S6> && IsScalar<S7> && IsScalar<S8> && IsScalar<S9>
103 ScalarExprList(const S1& y1, const S2& y2, const S3& y3, const S4& y4, const S5& y5,
104 const S6& y6, const S7& y7, const S8& y8, const S9& y9)
105 : AnalyticExprWrapper<VectorType>(vec(
106 to_ScalarExpr(y1), to_ScalarExpr(y2), to_ScalarExpr(y3), to_ScalarExpr(y4), to_ScalarExpr(y5),
107 to_ScalarExpr(y6), to_ScalarExpr(y7), to_ScalarExpr(y8), to_ScalarExpr(y9)
108 ))
109 { }
110
111 template<typename S1,typename S2,typename S3,typename S4,typename S5,
112 typename S6,typename S7,typename S8,typename S9,typename S10>
113 requires IsScalar<S1> && IsScalar<S2> && IsScalar<S3> && IsScalar<S4> && IsScalar<S5>
114 && IsScalar<S6> && IsScalar<S7> && IsScalar<S8> && IsScalar<S9> && IsScalar<S10>
115 ScalarExprList(const S1& y1, const S2& y2, const S3& y3, const S4& y4, const S5& y5,
116 const S6& y6, const S7& y7, const S8& y8, const S9& y9, const S10& y10)
117 : AnalyticExprWrapper<VectorType>(vec(
118 to_ScalarExpr(y1), to_ScalarExpr(y2), to_ScalarExpr(y3), to_ScalarExpr(y4), to_ScalarExpr(y5),
119 to_ScalarExpr(y6), to_ScalarExpr(y7), to_ScalarExpr(y8), to_ScalarExpr(y9), to_ScalarExpr(y10)
120 ))
121 { }
122
123 const ScalarExpr& to_ScalarExpr(const ScalarExpr& e)
124 {
125 return e;
126 }
127
128 template<typename T>
129 requires std::is_same_v<typename ValueType<T>::Type,ScalarType>
130 ScalarExpr to_ScalarExpr(const T& e)
131 {
132 return const_value(e);
133 }
134 };
135}