30 bool operator==(
const ExprID& i)
const;
31 bool operator<(
const ExprID& i)
const;
36 static Index _id_counter;
39 class ExprBase :
public std::enable_shared_from_this<ExprBase>
44 virtual std::shared_ptr<ExprBase> copy()
const = 0;
45 virtual void replace_expr(
const ExprID& old_expr_id,
const std::shared_ptr<ExprBase>& new_expr) = 0;
47 const ExprID& unique_id()
const;
48 bool operator==(
const ExprBase& e)
const;
49 virtual ~ExprBase() =
default;
53 const ExprID _unique_id;
56 template<
typename... X>
57 class OperationExprBase
61 OperationExprBase(std::shared_ptr<X>... x)
62 : _x(std::make_tuple((x)...))
65 OperationExprBase(
const OperationExprBase<X...>& e)
71 ((x = _copy(x)), ...);
75 void replace_expr(
const ExprID& old_expr_id,
const std::shared_ptr<ExprBase>& new_expr)
78 [old_expr_id,new_expr](
auto &&... x)
80 (__replace_single_expr(x,old_expr_id,new_expr), ...);
87 static std::shared_ptr<X_> _copy(
const std::shared_ptr<X_>& x)
89 return std::dynamic_pointer_cast<X_>(x->copy());
93 static void __replace_single_expr(std::shared_ptr<D>& x,
const ExprID& old_expr_id,
const std::shared_ptr<ExprBase>& new_expr)
95 if(x->unique_id() == old_expr_id)
97 assert(std::dynamic_pointer_cast<VarBase>(x) &&
"this subexpr should be some variable");
98 x = std::dynamic_pointer_cast<D>(new_expr->copy() );
101 x->replace_expr(old_expr_id, new_expr);
104 std::tuple<std::shared_ptr<X>...> _x;