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)
35 AnalyticExprWrapper<T>& operator=(
const AnalyticExprWrapper<T>&) =
default;
36 AnalyticExprWrapper<T>& operator=(AnalyticExprWrapper<T>&&) noexcept = default;
39 requires std::is_base_of_v<AnalyticVarExpr<T>,V>
40 AnalyticExprWrapper(const V& e)
41 : std::shared_ptr<AnalyticExpr<T>>({ std::dynamic_pointer_cast<AnalyticExpr<T>>(e.copy()) })
45 requires (!std::is_base_of_v<AnalyticVarExpr<T>,C>)
46 AnalyticExprWrapper(
const C& e)
47 requires std::is_same_v<typename ExprType<C>::Type,T>
48 : std::shared_ptr<AnalyticExpr<T>>(const_value(e))
51 inline AnalyticExprWrapper<ScalarType> operator[](Index i)
const
52 requires std::is_same_v<T,VectorType>
54 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,VectorType>>(*
this,i) };
57 inline AnalyticExprWrapper<VectorType> subvector(Index i, Index j)
const
58 requires std::is_same_v<T,VectorType>
60 return { std::make_shared<AnalyticOperationExpr<SubvectorOp,VectorType,VectorType>>(*
this,i,j) };
63 inline AnalyticExprWrapper<ScalarType> operator()(Index i, Index j)
const
64 requires std::is_same_v<T,MatrixType>
66 return { std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,MatrixType>>(*
this,i,j) };
70 using ScalarExpr = AnalyticExprWrapper<ScalarType>;
71 using VectorExpr = AnalyticExprWrapper<VectorType>;
72 using MatrixExpr = AnalyticExprWrapper<MatrixType>;
75 concept IsScalarExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<ScalarExpr,X>);
78 concept IsVectorExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<VectorExpr,X>);
81 concept IsMatrixExprOrVar = (std::is_base_of_v<VarBase,X> || std::is_base_of_v<MatrixExpr,X>);
Definition codac2_OctaSym.h:21