21 typedef MAP<const KEY *, const VALUE *, COMP, ALLOC> map_t;
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;
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); }
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); }
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;
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); }
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;
73 if (size() != a.size())
return false;
75 for (
auto &el : *
this)
76 if (el.first != it->first || !el.second->equiv(*(it++)->second))
return false;
79 cstring node_type_name()
const override {
80 return "NodeMap<" + KEY::static_type_name() +
"," + VALUE::static_type_name() +
">";
82 static cstring static_type_name() {
83 return "NodeMap<" + KEY::static_type_name() +
"," + VALUE::static_type_name() +
">";
85 void visit_children(Visitor &v,
const char *)
override;
86 void visit_children(Visitor &v,
const char *)
const override;
88 DECLARE_TYPEINFO(
NodeMap, Node);