25 struct AnalyticExprWrapper :
public std::shared_ptr<AnalyticExpr<T>>
27 AnalyticExprWrapper(
const AnalyticExprWrapper& e)
28 : std::shared_ptr<AnalyticExpr<T>>(e)
31 AnalyticExprWrapper(
const std::shared_ptr<AnalyticExpr<T>>& e)
32 : std::shared_ptr<AnalyticExpr<T>>(e)
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()) })
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()) })
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()) })
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))
56 inline AnalyticExprWrapper<ScalarType> operator[](Index i)
const
57 requires std::is_same_v<T,VectorType>
59 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,VectorType>>(*
this,i) };
62 inline AnalyticExprWrapper<VectorType> subvector(Index i, Index j)
const
63 requires std::is_same_v<T,VectorType>
65 return { std::make_shared<AnalyticOperationExpr<SubvectorOp,VectorType,VectorType>>(*
this,i,j) };
68 inline AnalyticExprWrapper<ScalarType> operator()(Index i, Index j)
const
69 requires std::is_same_v<T,MatrixType>
71 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,MatrixType>>(*
this,i,j) };
75 using ScalarExpr = AnalyticExprWrapper<ScalarType>;
76 using VectorExpr = AnalyticExprWrapper<VectorType>;
77 using MatrixExpr = AnalyticExprWrapper<MatrixType>;
80 concept IsScalarExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<ScalarExpr,X>);
83 concept IsVectorExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<VectorExpr,X>);
86 concept IsMatrixExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<MatrixExpr,X>);