53class Node :
public virtual INode {
55 virtual bool apply_visitor_preorder(Modifier &v);
56 virtual void apply_visitor_postorder(Modifier &v);
57 virtual void apply_visitor_revisit(Modifier &v,
const Node *n)
const;
58 virtual void apply_visitor_loop_revisit(Modifier &v)
const;
59 virtual bool apply_visitor_preorder(Inspector &v)
const;
60 virtual void apply_visitor_postorder(Inspector &v)
const;
61 virtual void apply_visitor_revisit(Inspector &v)
const;
62 virtual void apply_visitor_loop_revisit(Inspector &v)
const;
63 virtual const Node *apply_visitor_preorder(Transform &v);
64 virtual const Node *apply_visitor_postorder(Transform &v);
65 virtual void apply_visitor_revisit(Transform &v,
const Node *n)
const;
66 virtual void apply_visitor_loop_revisit(Transform &v)
const;
67 Node &operator=(
const Node &) =
default;
68 Node &operator=(Node &&) =
default;
72 void traceVisit(
const char *visitor)
const;
73 friend class ::P4::Visitor;
74 friend class ::P4::Inspector;
75 friend class ::P4::Modifier;
76 friend class ::P4::Transform;
78 unsigned *columnNumber)
const;
84 void traceCreation()
const;
85 Node() : id(currentId++), clone_id(
id) { traceCreation(); }
86 explicit Node(
Util::SourceInfo si) : srcInfo(si), id(currentId++), clone_id(
id) {
89 Node(
const Node &other) : srcInfo(other.srcInfo), id(currentId++), clone_id(other.clone_id) {
93 const Node *apply(Visitor &v,
const Visitor_Context *ctxt =
nullptr)
const;
94 const Node *apply(Visitor &&v,
const Visitor_Context *ctxt =
nullptr)
const {
95 return apply(v, ctxt);
97 virtual Node *clone()
const = 0;
98 void dbprint(std::ostream &out)
const override;
99 virtual void dump_fields(std::ostream &)
const {}
100 const Node *getNode()
const final {
return this; }
101 Node *getNode()
final {
return this; }
103 cstring node_type_name()
const override {
return "Node"_cs; }
104 static cstring static_type_name() {
return "Node"_cs; }
105 virtual int num_children() {
return 0; }
107 cstring toString()
const override {
return node_type_name(); }
114 virtual bool operator==(
const Node &a)
const {
return this->
typeId() == a.
typeId(); }
117 virtual bool equiv(
const Node &a)
const {
return this->
typeId() == a.
typeId(); }
118#define DEFINE_OPEQ_FUNC(CLASS, BASE) \
119 virtual bool operator==(const CLASS &) const { return false; }
120 IRNODE_ALL_SUBCLASSES(DEFINE_OPEQ_FUNC)
121#undef DEFINE_OPEQ_FUNC
122 virtual void visit_children(Visitor &,
const char * =
nullptr) {}
123 virtual void visit_children(Visitor &,
const char * =
nullptr)
const {}
125 bool operator!=(
const Node &n)
const {
return !operator==(n); }
130 template <
typename Sink>
132 sink.Append(n->toString());
135 DECLARE_TYPEINFO_WITH_TYPEID(
Node, NodeKind::Node,
INode);
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24