#ifndef HALIDE_IR_MUTATOR_H
#define HALIDE_IR_MUTATOR_H
#include "IRVisitor.h"
namespace Halide {
namespace Internal {
class IRMutator : public IRVisitor {
public:
EXPORT virtual Expr mutate(Expr expr);
EXPORT virtual Stmt mutate(Stmt stmt);
protected:
Expr expr;
Stmt stmt;
EXPORT virtual void visit(const IntImm *);
EXPORT virtual void visit(const UIntImm *);
EXPORT virtual void visit(const FloatImm *);
EXPORT virtual void visit(const StringImm *);
EXPORT virtual void visit(const Cast *);
EXPORT virtual void visit(const Variable *);
EXPORT virtual void visit(const Add *);
EXPORT virtual void visit(const Sub *);
EXPORT virtual void visit(const Mul *);
EXPORT virtual void visit(const Div *);
EXPORT virtual void visit(const Mod *);
EXPORT virtual void visit(const Min *);
EXPORT virtual void visit(const Max *);
EXPORT virtual void visit(const EQ *);
EXPORT virtual void visit(const NE *);
EXPORT virtual void visit(const LT *);
EXPORT virtual void visit(const LE *);
EXPORT virtual void visit(const GT *);
EXPORT virtual void visit(const GE *);
EXPORT virtual void visit(const And *);
EXPORT virtual void visit(const Or *);
EXPORT virtual void visit(const Not *);
EXPORT virtual void visit(const Select *);
EXPORT virtual void visit(const Load *);
EXPORT virtual void visit(const Ramp *);
EXPORT virtual void visit(const Broadcast *);
EXPORT virtual void visit(const Call *);
EXPORT virtual void visit(const Let *);
EXPORT virtual void visit(const LetStmt *);
EXPORT virtual void visit(const AssertStmt *);
EXPORT virtual void visit(const ProducerConsumer *);
EXPORT virtual void visit(const For *);
EXPORT virtual void visit(const Store *);
EXPORT virtual void visit(const Provide *);
EXPORT virtual void visit(const Allocate *);
EXPORT virtual void visit(const Free *);
EXPORT virtual void visit(const Realize *);
EXPORT virtual void visit(const Block *);
EXPORT virtual void visit(const IfThenElse *);
EXPORT virtual void visit(const Evaluate *);
EXPORT virtual void visit(const Shuffle *);
EXPORT virtual void visit(const Prefetch *);
};
class IRGraphMutator : public IRMutator {
protected:
std::map<Expr, Expr, ExprCompare> expr_replacements;
std::map<Stmt, Stmt, Stmt::Compare> stmt_replacements;
public:
EXPORT Stmt mutate(Stmt s);
EXPORT Expr mutate(Expr e);
};
}
}
#endif