44class Node :
public virtual INode {
46 virtual bool apply_visitor_preorder(Modifier &v);
47 virtual void apply_visitor_postorder(Modifier &v);
48 virtual void apply_visitor_revisit(Modifier &v,
const Node *n)
const;
49 virtual void apply_visitor_loop_revisit(Modifier &v)
const;
50 virtual bool apply_visitor_preorder(Inspector &v)
const;
51 virtual void apply_visitor_postorder(Inspector &v)
const;
52 virtual void apply_visitor_revisit(Inspector &v)
const;
53 virtual void apply_visitor_loop_revisit(Inspector &v)
const;
54 virtual const Node *apply_visitor_preorder(Transform &v);
55 virtual const Node *apply_visitor_postorder(Transform &v);
56 virtual void apply_visitor_revisit(Transform &v,
const Node *n)
const;
57 virtual void apply_visitor_loop_revisit(Transform &v)
const;
58 Node &operator=(
const Node &) =
default;
59 Node &operator=(Node &&) =
default;
63 void traceVisit(
const char *visitor)
const;
64 friend class ::P4::Visitor;
65 friend class ::P4::Inspector;
66 friend class ::P4::Modifier;
67 friend class ::P4::Transform;
69 unsigned *columnNumber)
const;
75 void traceCreation()
const;
76 Node() : id(currentId++), clone_id(
id) { traceCreation(); }
77 explicit Node(
Util::SourceInfo si) : srcInfo(si), id(currentId++), clone_id(
id) {
80 Node(
const Node &other) : srcInfo(other.srcInfo), id(currentId++), clone_id(other.clone_id) {
84 const Node *apply(Visitor &v,
const Visitor_Context *ctxt =
nullptr)
const;
85 const Node *apply(Visitor &&v,
const Visitor_Context *ctxt =
nullptr)
const {
86 return apply(v, ctxt);
88 virtual Node *clone()
const = 0;
89 void dbprint(std::ostream &out)
const override;
90 virtual void dump_fields(std::ostream &)
const {}
91 const Node *getNode()
const final {
return this; }
92 Node *getNode()
final {
return this; }
94 cstring node_type_name()
const override {
return "Node"_cs; }
95 static cstring static_type_name() {
return "Node"_cs; }
96 virtual int num_children() {
return 0; }
98 cstring toString()
const override {
return node_type_name(); }
105 virtual bool operator==(
const Node &a)
const {
return this->
typeId() == a.
typeId(); }
108 virtual bool equiv(
const Node &a)
const {
return this->
typeId() == a.
typeId(); }
109#define DEFINE_OPEQ_FUNC(CLASS, BASE) \
110 virtual bool operator==(const CLASS &) const { return false; }
111 IRNODE_ALL_SUBCLASSES(DEFINE_OPEQ_FUNC)
112#undef DEFINE_OPEQ_FUNC
113 virtual void visit_children(Visitor &,
const char * =
nullptr) {}
114 virtual void visit_children(Visitor &,
const char * =
nullptr)
const {}
116 bool operator!=(
const Node &n)
const {
return !operator==(n); }
121 template <
typename Sink>
123 sink.Append(n->toString());
126 DECLARE_TYPEINFO_WITH_TYPEID(
Node, NodeKind::Node,
INode);
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13