25 struct AnalyticExprWrapper :
public std::shared_ptr<AnalyticExpr<T>>
27 AnalyticExprWrapper(
const AnalyticExprWrapper<T>& e)
28 : std::shared_ptr<AnalyticExpr<T>>(e)
31 AnalyticExprWrapper(
const std::shared_ptr<AnalyticExpr<T>>& e)
32 : std::shared_ptr<AnalyticExpr<T>>(e)
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()) })
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))
48 inline AnalyticExprWrapper<ScalarType> operator[](Index i)
const
49 requires std::is_same_v<T,VectorType>
51 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,VectorType>>(*
this,i) };
54 inline AnalyticExprWrapper<VectorType> subvector(Index i, Index j)
const
55 requires std::is_same_v<T,VectorType>
57 return { std::make_shared<AnalyticOperationExpr<SubvectorOp,VectorType,VectorType>>(*
this,i,j) };
60 inline AnalyticExprWrapper<ScalarType> operator()(Index i, Index j)
const
61 requires std::is_same_v<T,MatrixType>
63 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,MatrixType>>(*
this,i,j) };
67 using ScalarExpr = AnalyticExprWrapper<ScalarType>;
68 using VectorExpr = AnalyticExprWrapper<VectorType>;
69 using MatrixExpr = AnalyticExprWrapper<MatrixType>;
72 concept IsScalarExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<ScalarExpr,X>);
75 concept IsVectorExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<VectorExpr,X>);
78 concept IsMatrixExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<MatrixExpr,X>);