40class IndexedVector :
public Vector<T> {
45 void insertInMap(
const T *a) {
48 auto name = decl->getName().name;
49 auto [it, inserted] = declarations.emplace(name, decl);
52 ::P4::error(ErrorType::ERR_DUPLICATE,
"%1%: Duplicates declaration %2%", a, it->second);
55 void removeFromMap(
const T *a) {
56 if (a ==
nullptr)
return;
58 if (decl ==
nullptr)
return;
59 cstring name = decl->getName().name;
60 auto it = declarations.find(name);
61 if (it == declarations.end()) BUG(
"%1% does not exist", a);
62 declarations.erase(it);
66 using Vector<T>::begin;
69 IndexedVector() =
default;
70 IndexedVector(
const IndexedVector &) =
default;
71 IndexedVector(IndexedVector &&) =
default;
72 IndexedVector(std::initializer_list<const T *> a) : Vector<T>(a) {
73 for (
auto el : *
this) insertInMap(el);
75 IndexedVector &operator=(
const IndexedVector &) =
default;
76 IndexedVector &operator=(IndexedVector &&) =
default;
77 explicit IndexedVector(
const T *a) { push_back(std::move(a)); }
79 insert(Vector<T>::end(), a.begin(), a.end());
81 explicit IndexedVector(
const Vector<T> &a) { insert(Vector<T>::end(), a.begin(), a.end()); }
82 template <
typename It>
83 explicit IndexedVector(It start, It end) {
84 insert(Vector<T>::end(), start, end);
89 IR::Vector<T>::clear();
95 typedef typename Vector<T>::iterator iterator;
98 auto it = declarations.find(name);
99 if (it == declarations.end())
return nullptr;
102 const IDeclaration *getDeclaration(std::string_view name)
const {
103 auto it = declarations.find(name);
104 if (it == declarations.end())
return nullptr;
108 const U *getDeclaration(
cstring name)
const {
109 auto it = declarations.find(name);
110 if (it == declarations.end())
return nullptr;
111 return it->second->template
to<U>();
114 const U *getDeclaration(std::string_view name)
const {
115 auto it = declarations.find(name);
116 if (it == declarations.end())
return nullptr;
117 return it->second->template
to<U>();
120 return Util::enumerate(Values(declarations));
122 iterator erase(iterator from, iterator
to) {
123 for (
auto it = from; it !=
to; ++it) {
126 return Vector<T>::erase(from,
to);
128 iterator erase(iterator i) {
130 return Vector<T>::erase(i);
132 template <
typename ForwardIter>
133 iterator insert(iterator i, ForwardIter b, ForwardIter e) {
134 for (
auto it = b; it != e; ++it) insertInMap(*it);
135 return Vector<T>::insert(i, b, e);
137 iterator replace(iterator i,
const T *v) {
143 template <
typename Container>
144 iterator append(
const Container &toAppend) {
145 return insert(Vector<T>::end(), toAppend.begin(), toAppend.end());
147 template <
typename Container>
148 iterator prepend(
const Container &toAppend) {
149 return insert(Vector<T>::begin(), toAppend.begin(), toAppend.end());
151 iterator insert(iterator i,
const T *v) {
153 return Vector<T>::insert(i, v);
155 template <
class... Args>
156 void emplace_back(Args &&...args) {
157 auto el =
new T(std::forward<Args>(args)...);
160 bool removeByName(
cstring name) {
161 for (
auto it = begin(); it != end(); ++it) {
163 if (decl !=
nullptr && decl->getName() == name) {
170 void push_back(T *a) {
172 Vector<T>::push_back(a);
175 void push_back(
const T *a) {
177 Vector<T>::push_back(a);
181 if (Vector<T>::empty()) BUG(
"pop_back from empty IndexedVector");
182 auto last = Vector<T>::back();
184 Vector<T>::pop_back();
187 void push_back(U &a) {
188 Vector<T>::push_back(a);
192 IRNODE_SUBCLASS(IndexedVector)
193 IRNODE_DECLARE_APPLY_OVERLOAD(IndexedVector)
194 bool operator==(
const Node &a)
const override {
return a == *
this; }
195 bool operator==(
const Vector<T> &a)
const override {
return a == *
this; }
196 bool operator==(
const IndexedVector &a)
const override {
197 return Vector<T>::operator==(
static_cast<const Vector<T> &
>(a));
214 cstring node_type_name()
const override {
215 return "IndexedVector<" + T::static_type_name() +
">";
217 static cstring static_type_name() {
return "IndexedVector<" + T::static_type_name() +
">"; }
218 void visit_children(Visitor &v)
override;
219 void visit_children(Visitor &v)
const override;
222 static IndexedVector<T> *fromJSON(
JSONLoader &json);
223 void validate()
const override {
225 for (
auto el : *
this) {
228 auto it = declarations.find(decl->getName());
229 BUG_CHECK(it != declarations.end() && it->second->getNode() == el->getNode(),
230 "invalid element %1%", el);
234 DECLARE_TYPEINFO_WITH_DISCRIMINATOR(IndexedVector<T>, NodeDiscriminator::IndexedVectorT, T,