60template <
typename Rewriter>
struct Mutator {
61 Mutator(Rewriter &rewriter) : rewriter_(rewriter) {}
63 template <
typename T,
typename U = llvm::remove_cvref_t<T>>
65 if constexpr (std::is_lvalue_reference_v<T>) {
68 return Mutate(std::move(x));
73 template <
typename T>
struct LambdaWithRvalueCapture {
74 LambdaWithRvalueCapture(Rewriter &r,
Expr<T> &&c)
75 : rewriter_(r), capture_(std::move(c)) {}
76 template <
typename S>
Expr<T> operator()(
const S &s) {
77 return rewriter_(std::move(capture_), s);
85 template <
typename T,
typename = std::enable_if_t<!is_operation_v<T>>>
86 T Mutate(T &&x)
const {
90 template <
typename D,
typename = std::enable_if_t<is_operation_v<D>>>
91 D Mutate(D &&op, std::make_index_sequence<D::operands> t = {})
const {
92 return MutateOp(std::move(op), t);
100 return Expr<T>(Mutate(std::move(s)));
106 return common::visit(
107 LambdaWithRvalueCapture<T>(rewriter_, std::move(n)), std::move(n.u));
110 template <
typename... Ts>
111 std::variant<Ts...> Mutate(std::variant<Ts...> &&u)
const {
112 return common::visit(
113 [
this](
auto &&s) {
return Mutate(std::move(s)); }, std::move(u));
116 template <
typename... Ts>
117 std::tuple<Ts...> Mutate(std::tuple<Ts...> &&t)
const {
118 return MutateTuple(std::move(t), std::index_sequence_for<Ts...>{});
121 template <
typename... Ts,
size_t... Is>
122 std::tuple<Ts...> MutateTuple(
123 std::tuple<Ts...> &&t, std::index_sequence<Is...>)
const {
124 return std::make_tuple(Mutate(std::move(std::get<Is>(t))...));
127 template <
typename D,
size_t... Is>
128 D MutateOp(D &&op, std::index_sequence<Is...>)
const {
129 return D(Mutate(std::move(op.template operand<Is>()))...);
132 template <
typename T,
size_t... Is>
135 op.ordering, Mutate(std::move(op.template operand<Is>()))...);
138 template <
int K,
size_t... Is>
142 op.isImaginaryPart, Mutate(std::move(op.template operand<Is>()))...);
145 template <
int K,
size_t... Is>
149 op.logicalOperator, Mutate(std::move(op.template operand<Is>()))...);