9 #include <unordered_map>
11 #include <llvm/ADT/ilist.h>
13 #include "core/object.h"
14 #include "core/global.h"
15 #include "core/symbol_table.h"
26 template <>
struct llvm::ilist_traits<
Data> {
28 using instr_iterator = simple_ilist<Data>::iterator;
31 void deleteNode(
Data *inst);
32 void addNodeToList(
Data *inst);
33 void removeNodeFromList(
Data *inst);
34 void transferNodesFromList(
47 class Data final :
public llvm::ilist_node_with_parent<Data, Prog> {
50 using ObjectListType = llvm::ilist<Object>;
53 using iterator = ObjectListType::iterator;
54 using const_iterator = ObjectListType::const_iterator;
56 using reverse_iterator = ObjectListType::reverse_iterator;
57 using const_reverse_iterator = ObjectListType::const_reverse_iterator;
61 Data(
const std::string_view name);
82 std::string_view GetName()
const {
return name_; }
84 llvm::StringRef
getName()
const {
return name_; }
87 bool IsEmpty()
const {
return objects_.empty(); }
90 void remove(iterator it) { objects_.remove(it); }
92 void erase(iterator it) { objects_.erase(it); }
97 bool empty()
const {
return objects_.empty(); }
98 size_t size()
const {
return objects_.size(); }
99 iterator begin() {
return objects_.begin(); }
100 iterator end() {
return objects_.end(); }
101 const_iterator begin()
const {
return objects_.begin(); }
102 const_iterator end()
const {
return objects_.end(); }
103 reverse_iterator rbegin() {
return objects_.rbegin(); }
104 reverse_iterator rend() {
return objects_.rend(); }
105 const_reverse_iterator rbegin()
const {
return objects_.rbegin(); }
106 const_reverse_iterator rend()
const {
return objects_.rend(); }
109 friend struct llvm::ilist_traits<
Data>;
110 friend struct llvm::ilist_traits<
Object>;
111 static ObjectListType
Data::*getSublistAccess(
Object *) {
112 return &Data::objects_;
116 void setParent(
Prog *parent) { parent_ = parent; }
122 const std::string name_;
124 ObjectListType objects_;