34class VectorBase :
public Node {
36 typedef const Node *
const *iterator;
37 virtual iterator VectorBase_begin()
const = 0;
38 virtual iterator VectorBase_end()
const = 0;
39 virtual size_t size()
const = 0;
40 virtual bool empty()
const = 0;
41 iterator begin()
const {
return VectorBase_begin(); }
42 iterator end()
const {
return VectorBase_end(); }
43 VectorBase() =
default;
44 VectorBase(
const VectorBase &) =
default;
45 VectorBase(VectorBase &&) =
default;
46 VectorBase &operator=(
const VectorBase &) =
default;
47 VectorBase &operator=(VectorBase &&) =
default;
50 explicit VectorBase(
JSONLoader &json) : Node(json) {}
52 DECLARE_TYPEINFO_WITH_TYPEID(VectorBase, NodeKind::VectorBase, Node);
58class Vector :
public VectorBase {
62 typedef const T *value_type;
64 Vector(
const Vector &) =
default;
65 Vector(Vector &&) =
default;
67 Vector &operator=(
const Vector &) =
default;
68 Vector &operator=(Vector &&) =
default;
69 explicit Vector(
const T *a) { vec.emplace_back(std::move(a)); }
71 Vector(
const std::initializer_list<const T *> &a) : vec(a) {}
73 typedef typename safe_vector<const T *>::iterator iterator;
74 typedef typename safe_vector<const T *>::const_iterator const_iterator;
75 iterator begin() {
return vec.begin(); }
76 const_iterator begin()
const {
return vec.begin(); }
77 VectorBase::iterator VectorBase_begin()
const override {
79 return reinterpret_cast<VectorBase::iterator
>(&vec[0]);
81 iterator end() {
return vec.end(); }
82 const_iterator end()
const {
return vec.end(); }
83 VectorBase::iterator VectorBase_end()
const override {
85 return reinterpret_cast<VectorBase::iterator
>(&vec[0] + vec.size());
87 std::reverse_iterator<iterator> rbegin() {
return vec.rbegin(); }
88 std::reverse_iterator<const_iterator> rbegin()
const {
return vec.rbegin(); }
89 std::reverse_iterator<iterator> rend() {
return vec.rend(); }
90 std::reverse_iterator<const_iterator> rend()
const {
return vec.rend(); }
91 size_t size()
const override {
return vec.size(); }
92 void resize(
size_t sz) { vec.resize(sz); }
93 bool empty()
const override {
return vec.empty(); }
94 const T *
const &front()
const {
return vec.front(); }
95 const T *&front() {
return vec.front(); }
96 void clear() { vec.clear(); }
97 iterator erase(iterator i) {
return vec.erase(i); }
98 iterator erase(iterator s, iterator e) {
return vec.erase(s, e); }
99 template <
typename ForwardIter>
100 iterator insert(iterator i, ForwardIter b, ForwardIter e) {
103 int index = i - vec.begin();
105 return vec.begin() + index;
108 template <
typename Container>
109 iterator append(
const Container &toAppend) {
110 return insert(end(), toAppend.begin(), toAppend.end());
112 template <
typename Container>
113 iterator prepend(
const Container &toAppend) {
114 return insert(begin(), toAppend.begin(), toAppend.end());
124 if (item ==
nullptr)
return;
126 append(*itemAsVector);
129 BUG_CHECK(item->
is<T>(),
"Unexpected vector element: %1%", item);
130 push_back(item->
to<T>());
136 int index = i - vec.begin();
138 return vec.begin() + index;
143 int index = i - vec.begin();
145 return vec.begin() + index;
148 const T *
const &operator[](
size_t idx)
const {
return vec[idx]; }
149 const T *&operator[](
size_t idx) {
return vec[idx]; }
150 const T *
const &at(
size_t idx)
const {
return vec.at(idx); }
151 const T *&at(
size_t idx) {
return vec.at(idx); }
152 template <
class... Args>
153 void emplace_back(Args &&...args) {
154 vec.emplace_back(
new T(std::forward<Args>(args)...));
156 void push_back(T *a) { vec.push_back(a); }
157 void push_back(
const T *a) { vec.push_back(a); }
158 void pop_back() { vec.pop_back(); }
159 const T *
const &back()
const {
return vec.back(); }
160 const T *&back() {
return vec.back(); }
162 void push_back(U &a) {
165 void check_null()
const {
166 for (
auto e : vec) CHECK_NULL(e);
169 IRNODE_SUBCLASS(Vector)
170 IRNODE_DECLARE_APPLY_OVERLOAD(Vector)
171 bool operator==(
const Node &a)
const override {
return a == *
this; }
172 bool operator==(
const Vector &a)
const override {
return vec == a.vec; }
187 bool equiv(
const Node &a_)
const override {
188 if (
static_cast<const Node *
>(
this) == &a_)
return true;
189 if (this->
typeId() != a_.typeId())
return false;
190 auto &a =
static_cast<const Vector<T> &
>(a_);
191 if (size() != a.size())
return false;
193 for (
auto *el : *
this)
194 if (!el->equiv(**it++))
return false;
197 cstring node_type_name()
const override {
return "Vector<" + T::static_type_name() +
">"; }
198 static cstring static_type_name() {
return "Vector<" + T::static_type_name() +
">"; }
199 void visit_children(Visitor &v)
override;
200 void visit_children(Visitor &v)
const override;
201 virtual void parallel_visit_children(Visitor &v);
202 virtual void parallel_visit_children(Visitor &v)
const;
203 void toJSON(JSONGenerator &json)
const override;
204 Util::Enumerator<const T *> *getEnumerator()
const {
return Util::enumerate(vec); }
205 template <
typename S>
206 Util::Enumerator<const S *> *only()
const {
208 [](
const T *d) {
return d !=
nullptr; });
211 DECLARE_TYPEINFO_WITH_DISCRIMINATOR(Vector<T>, NodeDiscriminator::VectorT, T, VectorBase);
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24