59class Vector :
public VectorBase {
63 typedef const T *value_type;
65 Vector(
const Vector &) =
default;
66 Vector(Vector &&) =
default;
68 Vector &operator=(
const Vector &) =
default;
69 Vector &operator=(Vector &&) =
default;
70 explicit Vector(
const T *a) { vec.emplace_back(a); }
72 Vector(std::initializer_list<const T *> a) : vec(a) {}
73 template <
class InputIt>
74 Vector(InputIt first, InputIt last) : vec(first, last) {}
76 : vec(e->begin(), e->end()) {}
79 using iterator =
typename safe_vector<const T *>::iterator;
80 using const_iterator =
typename safe_vector<const T *>::const_iterator;
82 iterator begin() {
return vec.begin(); }
83 const_iterator begin()
const {
return vec.begin(); }
84 VectorBase::iterator VectorBase_begin()
const override {
86 return reinterpret_cast<VectorBase::iterator
>(&vec[0]);
88 iterator end() {
return vec.end(); }
89 const_iterator end()
const {
return vec.end(); }
90 VectorBase::iterator VectorBase_end()
const override {
92 return reinterpret_cast<VectorBase::iterator
>(&vec[0] + vec.size());
94 std::reverse_iterator<iterator> rbegin() {
return vec.rbegin(); }
95 std::reverse_iterator<const_iterator> rbegin()
const {
return vec.rbegin(); }
96 std::reverse_iterator<iterator> rend() {
return vec.rend(); }
97 std::reverse_iterator<const_iterator> rend()
const {
return vec.rend(); }
98 size_t size()
const override {
return vec.size(); }
99 void resize(
size_t sz) { vec.resize(sz); }
100 bool empty()
const override {
return vec.empty(); }
101 const T *
const &front()
const {
return vec.front(); }
102 const T *&front() {
return vec.front(); }
103 void clear() { vec.clear(); }
104 iterator erase(iterator i) {
return vec.erase(i); }
105 iterator erase(iterator s, iterator e) {
return vec.erase(s, e); }
106 template <
typename ForwardIter>
107 iterator insert(iterator i, ForwardIter b, ForwardIter e) {
108 return vec.insert(i, b, e);
111 template <
typename Container>
112 iterator append(
const Container &toAppend) {
113 return insert(end(), toAppend.begin(), toAppend.end());
115 template <
typename Container>
116 iterator prepend(
const Container &toAppend) {
117 return insert(begin(), toAppend.begin(), toAppend.end());
127 if (item ==
nullptr)
return;
129 append(*itemAsVector);
132 BUG_CHECK(item->
is<T>(),
"Unexpected vector element: %1%", item);
133 push_back(item->
to<T>());
137 iterator insert(
iterator i,
size_t n,
const T *v) {
return vec.insert(i, n, v); }
139 const T *
const &operator[](
size_t idx)
const {
return vec[idx]; }
140 const T *&operator[](
size_t idx) {
return vec[idx]; }
141 const T *
const &at(
size_t idx)
const {
return vec.at(idx); }
142 const T *&at(
size_t idx) {
return vec.at(idx); }
143 template <
class... Args>
144 void emplace_back(Args &&...args) {
145 vec.emplace_back(
new T(std::forward<Args>(args)...));
147 void push_back(T *a) { vec.push_back(a); }
148 void push_back(
const T *a) { vec.push_back(a); }
149 void pop_back() { vec.pop_back(); }
150 const T *
const &back()
const {
return vec.back(); }
151 const T *&back() {
return vec.back(); }
153 void push_back(U &a) {
156 void check_null()
const {
157 for (
auto e : vec) CHECK_NULL(e);
160 IRNODE_SUBCLASS(Vector)
161 IRNODE_DECLARE_APPLY_OVERLOAD(Vector)
162 bool operator==(
const Node &a)
const override {
return a == *
this; }
163 bool operator==(
const Vector &a)
const override {
return vec == a.vec; }
178 bool equiv(
const Node &a_)
const override {
179 if (
static_cast<const Node *
>(
this) == &a_)
return true;
180 if (this->
typeId() != a_.typeId())
return false;
181 auto &a =
static_cast<const Vector<T> &
>(a_);
182 if (size() != a.size())
return false;
184 for (
auto *el : *
this)
185 if (!el->equiv(**it++))
return false;
188 cstring node_type_name()
const override {
return "Vector<" + T::static_type_name() +
">"; }
189 static cstring static_type_name() {
return "Vector<" + T::static_type_name() +
">"; }
190 void visit_children(Visitor &v,
const char *name)
override;
191 void visit_children(Visitor &v,
const char *name)
const override;
192 virtual void parallel_visit_children(Visitor &v,
const char *name =
nullptr);
193 virtual void parallel_visit_children(Visitor &v,
const char *name =
nullptr)
const;
194 void toJSON(JSONGenerator &json)
const override;
195 Util::Enumerator<const T *> *getEnumerator()
const {
return Util::enumerate(vec); }
196 template <
typename S>
197 Util::Enumerator<const S *> *only()
const {
199 [](
const T *d) {
return d !=
nullptr; });
201 template <
class Filter>
202 auto where(Filter f)
const {
203 return getEnumerator()->where(std::move(f));
206 void dbprint(std::ostream &out)
const override {
207 out <<
"{" << IndentCtl::indent;
208 for (
auto p : *
this) {
211 out << IndentCtl::unindent <<
" }";
214 DECLARE_TYPEINFO_WITH_DISCRIMINATOR(Vector<T>, NodeDiscriminator::VectorT, T, VectorBase);