codac 2.0.0
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<T>& 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 template<typename V>
36 requires std::is_base_of_v<AnalyticVarExpr<T>,V>
37 AnalyticExprWrapper(const V& e)
38 : std::shared_ptr<AnalyticExpr<T>>({ std::dynamic_pointer_cast<AnalyticExpr<T>>(e.copy()) })
39 { }
40
41 template<typename C>
42 requires (!std::is_base_of_v<AnalyticVarExpr<T>,C>)
43 AnalyticExprWrapper(const C& e)
44 requires std::is_same_v<typename ValueType<C>::Type,T>
45 : std::shared_ptr<AnalyticExpr<T>>(const_value(e))
46 { }
47
48 inline AnalyticExprWrapper<ScalarType> operator[](Index i) const
49 requires std::is_same_v<T,VectorType>
50 {
51 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,VectorType>>(*this,i) };
52 }
53
54 inline AnalyticExprWrapper<VectorType> subvector(Index i, Index j) const
55 requires std::is_same_v<T,VectorType>
56 {
57 return { std::make_shared<AnalyticOperationExpr<SubvectorOp,VectorType,VectorType>>(*this,i,j) };
58 }
59
60 inline AnalyticExprWrapper<ScalarType> operator()(Index i, Index j) const
61 requires std::is_same_v<T,MatrixType>
62 {
63 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,MatrixType>>(*this,i,j) };
64 }
65 };
66
67 using ScalarExpr = AnalyticExprWrapper<ScalarType>;
68 using VectorExpr = AnalyticExprWrapper<VectorType>;
69 using MatrixExpr = AnalyticExprWrapper<MatrixType>;
70
71 template<class X>
72 concept IsScalarExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<ScalarExpr,X>);
73
74 template<class X>
75 concept IsVectorExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<VectorExpr,X>);
76
77 template<class X>
78 concept IsMatrixExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<MatrixExpr,X>);
79}