#ifndef HALIDE_IR_PRINTER_H
#define HALIDE_IR_PRINTER_H
#include <ostream>
#include "Module.h"
#include "IRVisitor.h"
namespace Halide {
EXPORT std::ostream &operator<<(std::ostream &stream, const Expr &);
EXPORT std::ostream &operator<<(std::ostream &stream, const Type &);
EXPORT std::ostream &operator<<(std::ostream &stream, const Module &);
EXPORT std::ostream &operator<<(std::ostream &stream, const DeviceAPI &);
namespace Internal {
struct AssociativePattern;
struct AssociativeOp;
EXPORT std::ostream &operator<<(std::ostream &stream, const AssociativePattern &);
EXPORT std::ostream &operator<<(std::ostream &stream, const AssociativeOp &);
EXPORT std::ostream &operator<<(std::ostream &stream, const Stmt &);
EXPORT std::ostream &operator<<(std::ostream &stream, const ForType &);
EXPORT std::ostream &operator<<(std::ostream &stream, const NameMangling &);
class IRPrinter : public IRVisitor {
public:
EXPORT IRPrinter(std::ostream &);
EXPORT void print(Expr);
EXPORT void print(Stmt);
EXPORT void print_list(const std::vector<Expr> &exprs);
EXPORT static void test();
protected:
std::ostream &stream;
int indent;
void do_indent();
void visit(const IntImm *);
void visit(const UIntImm *);
void visit(const FloatImm *);
void visit(const StringImm *);
void visit(const Cast *);
void visit(const Variable *);
void visit(const Add *);
void visit(const Sub *);
void visit(const Mul *);
void visit(const Div *);
void visit(const Mod *);
void visit(const Min *);
void visit(const Max *);
void visit(const EQ *);
void visit(const NE *);
void visit(const LT *);
void visit(const LE *);
void visit(const GT *);
void visit(const GE *);
void visit(const And *);
void visit(const Or *);
void visit(const Not *);
void visit(const Select *);
void visit(const Load *);
void visit(const Ramp *);
void visit(const Broadcast *);
void visit(const Call *);
void visit(const Let *);
void visit(const LetStmt *);
void visit(const AssertStmt *);
void visit(const ProducerConsumer *);
void visit(const For *);
void visit(const Store *);
void visit(const Provide *);
void visit(const Allocate *);
void visit(const Free *);
void visit(const Realize *);
void visit(const Block *);
void visit(const IfThenElse *);
void visit(const Evaluate *);
void visit(const Shuffle *);
void visit(const Prefetch *);
};
}
}
#endif