94class Node :
public virtual INode {
96 virtual bool apply_visitor_preorder(Modifier &v);
97 virtual void apply_visitor_postorder(Modifier &v);
98 virtual void apply_visitor_revisit(Modifier &v,
const Node *n)
const;
99 virtual void apply_visitor_loop_revisit(Modifier &v)
const;
100 virtual bool apply_visitor_preorder(Inspector &v)
const;
101 virtual void apply_visitor_postorder(Inspector &v)
const;
102 virtual void apply_visitor_revisit(Inspector &v)
const;
103 virtual void apply_visitor_loop_revisit(Inspector &v)
const;
104 virtual const Node *apply_visitor_preorder(Transform &v);
105 virtual const Node *apply_visitor_postorder(Transform &v);
106 virtual void apply_visitor_revisit(Transform &v,
const Node *n)
const;
107 virtual void apply_visitor_loop_revisit(Transform &v)
const;
108 Node &operator=(
const Node &) =
default;
109 Node &operator=(Node &&) =
default;
112 static int currentId;
113 void traceVisit(
const char *visitor)
const;
114 friend class ::P4::Visitor;
115 friend class ::P4::Inspector;
116 friend class ::P4::Modifier;
117 friend class ::P4::Transform;
119 unsigned *columnNumber)
const;
125 void traceCreation()
const;
126 Node() : id(currentId++), clone_id(
id) { traceCreation(); }
127 explicit Node(
Util::SourceInfo si) : srcInfo(si), id(currentId++), clone_id(
id) {
130 Node(
const Node &other) : srcInfo(other.srcInfo), id(currentId++), clone_id(other.clone_id) {
134 const Node *apply(Visitor &v,
const Visitor_Context *ctxt =
nullptr)
const;
135 const Node *apply(Visitor &&v,
const Visitor_Context *ctxt =
nullptr)
const {
136 return apply(v, ctxt);
138 virtual Node *clone()
const = 0;
139 void dbprint(std::ostream &out)
const override;
140 virtual void dump_fields(std::ostream &)
const {}
141 const Node *getNode()
const final {
return this; }
142 Node *getNode()
final {
return this; }
144 cstring node_type_name()
const override {
return "Node"_cs; }
145 static cstring static_type_name() {
return "Node"_cs; }
146 virtual int num_children() {
return 0; }
148 cstring toString()
const override {
return node_type_name(); }
154 virtual bool operator==(
const Node &a)
const {
return this->
typeId() == a.
typeId(); }
157 virtual bool equiv(
const Node &a)
const {
return this->
typeId() == a.
typeId(); }
158#define DEFINE_OPEQ_FUNC(CLASS, BASE) \
159 virtual bool operator==(const CLASS &) const { return false; }
160 IRNODE_ALL_SUBCLASSES(DEFINE_OPEQ_FUNC)
161#undef DEFINE_OPEQ_FUNC
162 virtual void visit_children(Visitor &) {}
163 virtual void visit_children(Visitor &)
const {}
165 bool operator!=(
const Node &n)
const {
return !operator==(n); }
170 template <
typename Sink>
172 sink.Append(n->toString());
175 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