P4C
The P4 Compiler
Loading...
Searching...
No Matches
nodemap.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef IR_NODEMAP_H_
9#define IR_NODEMAP_H_
10
11#include "ir/node.h"
12#include "lib/cstring.h"
13
14namespace P4::IR {
15
16template <class KEY, class VALUE,
17 template <class K, class V, class COMP, class ALLOC> class MAP = std::map,
18 class COMP = std::less<cstring>,
19 class ALLOC = std::allocator<std::pair<const KEY *const, const VALUE *>>>
20class NodeMap : public Node {
21 typedef MAP<const KEY *, const VALUE *, COMP, ALLOC> map_t;
22 map_t symbols;
23
24 public:
25 typedef typename map_t::value_type value_type;
26 typedef typename map_t::iterator iterator;
27 typedef typename map_t::const_iterator const_iterator;
28 typedef typename map_t::reverse_iterator reverse_iterator;
29 typedef typename map_t::const_reverse_iterator const_reverse_iterator;
30
31 private:
32 struct elem_ref {
33 NodeMap &self;
34 const KEY *key;
35 elem_ref(NodeMap &s, const KEY *k) : self(s), key(k) {}
36 const VALUE *operator=(const VALUE *v) const { return self.symbols[key] = v; }
37 operator const VALUE *() const { return self.symbols.at(key); }
38 };
39
40 public:
41 const_iterator begin() const { return symbols.begin(); }
42 const_iterator end() const { return symbols.end(); }
43 iterator begin() { return symbols.begin(); }
44 iterator end() { return symbols.end(); }
45 const_reverse_iterator rbegin() const { return symbols.rbegin(); }
46 const_reverse_iterator rend() const { return symbols.rend(); }
47 reverse_iterator rbegin() { return symbols.rbegin(); }
48 reverse_iterator rend() { return symbols.rend(); }
49 size_t count(cstring name) const { return symbols.count(name); }
50 size_t size() const { return symbols.size(); }
51 bool empty() const { return symbols.empty(); }
52 size_t erase(const KEY *k) { return symbols.erase(k); }
53 iterator erase(const_iterator p) { return symbols.erase(p); }
54 iterator erase(const_iterator f, const_iterator l) { return symbols.erase(f, l); }
55 const_iterator find(const KEY *k) const { return symbols.find(k); }
56 template <class U>
57 const U *get(const KEY *k) const {
58 for (auto it = symbols.find(k); it != symbols.end() && it->first == k; it++)
59 if (auto rv = it->second->template to<U>()) return rv;
60 return nullptr;
61 }
62 elem_ref operator[](const KEY *k) { return elem_ref(*this, k); }
63 const VALUE *operator[](const KEY *k) const { return symbols.at(k); }
64 const VALUE *&at(const KEY *k) { return symbols.at(k); }
65 const VALUE *const &at(const KEY *k) const { return symbols.at(k); }
66 IRNODE_SUBCLASS(NodeMap)
67 bool operator==(const Node &a) const override { return a == *this; }
68 bool operator==(const NodeMap &a) const { return symbols == a.symbols; }
69 bool equiv(const Node &a_) const override {
70 if (static_cast<const Node *>(this) == &a_) return true;
71 if (this->typeId() != a_.typeId()) return false;
72 auto &a = static_cast<const NodeMap<KEY, VALUE, MAP, COMP, ALLOC> &>(a_);
73 if (size() != a.size()) return false;
74 auto it = a.begin();
75 for (auto &el : *this)
76 if (el.first != it->first || !el.second->equiv(*(it++)->second)) return false;
77 return true;
78 }
79 cstring node_type_name() const override {
80 return "NodeMap<" + KEY::static_type_name() + "," + VALUE::static_type_name() + ">";
81 }
82 static cstring static_type_name() {
83 return "NodeMap<" + KEY::static_type_name() + "," + VALUE::static_type_name() + ">";
84 }
85 void visit_children(Visitor &v, const char *) override;
86 void visit_children(Visitor &v, const char *) const override;
87
88 DECLARE_TYPEINFO(NodeMap, Node);
89};
90
91} // namespace P4::IR
92
93#endif /* IR_NODEMAP_H_ */
Definition nodemap.h:20
Definition cstring.h:76
Definition constantParsing.h:13
T * to() noexcept
Definition rtti.h:226
virtual TypeId typeId() const noexcept=0