codac 1.5.6
Loading...
Searching...
No Matches
codac2_AnalyticExprWrapper.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include "codac2_AnalyticExpr.h"
13#include "codac2_ValueType.h"
15#include "codac2_component.h"
16#include "codac2_subvector.h"
18
19namespace codac2
20{
21 class ScalarVar;
22 class VectorVar;
23
24 template<typename T>
25 struct AnalyticExprWrapper : public std::shared_ptr<AnalyticExpr<T>>
26 {
27 AnalyticExprWrapper(const AnalyticExprWrapper& e)
28 : std::shared_ptr<AnalyticExpr<T>>(e)
29 { }
30
31 AnalyticExprWrapper(const std::shared_ptr<AnalyticExpr<T>>& e)
32 : std::shared_ptr<AnalyticExpr<T>>(e)
33 { }
34
35 AnalyticExprWrapper(const ScalarVar& e)
36 requires std::is_same_v<T,ScalarType>
37 : std::shared_ptr<AnalyticExpr<T>>({ std::dynamic_pointer_cast<AnalyticExpr<T>>(e.copy()) })
38 { }
39
40 AnalyticExprWrapper(const VectorVar& e)
41 requires std::is_same_v<T,VectorType>
42 : std::shared_ptr<AnalyticExpr<T>>({ std::dynamic_pointer_cast<AnalyticExpr<T>>(e.copy()) })
43 { }
44
45 AnalyticExprWrapper(const MatrixVar& e)
46 requires std::is_same_v<T,MatrixType>
47 : std::shared_ptr<AnalyticExpr<T>>({ std::dynamic_pointer_cast<AnalyticExpr<T>>(e.copy()) })
48 { }
49
50 template<typename V>
51 AnalyticExprWrapper(const V& e)
52 requires std::is_same_v<typename ValueType<V>::Type,T>
53 : std::shared_ptr<AnalyticExpr<T>>(const_value(e))
54 { }
55
56 inline AnalyticExprWrapper<ScalarType> operator[](Index i) const
57 requires std::is_same_v<T,VectorType>
58 {
59 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,VectorType>>(*this,i) };
60 }
61
62 inline AnalyticExprWrapper<VectorType> subvector(Index i, Index j) const
63 requires std::is_same_v<T,VectorType>
64 {
65 return { std::make_shared<AnalyticOperationExpr<SubvectorOp,VectorType,VectorType>>(*this,i,j) };
66 }
67
68 inline AnalyticExprWrapper<ScalarType> operator()(Index i, Index j) const
69 requires std::is_same_v<T,MatrixType>
70 {
71 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,MatrixType>>(*this,i,j) };
72 }
73 };
74
75 using ScalarExpr = AnalyticExprWrapper<ScalarType>;
76 using VectorExpr = AnalyticExprWrapper<VectorType>;
77 using MatrixExpr = AnalyticExprWrapper<MatrixType>;
78
79 template<class X>
80 concept IsScalarExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<ScalarExpr,X>);
81
82 template<class X>
83 concept IsVectorExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<VectorExpr,X>);
84
85 template<class X>
86 concept IsMatrixExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<MatrixExpr,X>);
87}