21 #include <initializer_list> 32 template <
typename... Ts>
using vector = std::vector<Ts...>;
36 #else // #EMP_NDEBUG *not* set 41 template <
typename T,
typename... Ts>
42 class vector :
public std::vector<T,Ts...> {
45 using stdv_t = std::vector<T,Ts...>;
48 constexpr
static const size_t MAX_SIZE = 2000000001;
55 template<
typename ITERATOR_T>
69 : ITERATOR_T(_in), v_ptr(_v), revision(_v->revision) { ; }
75 bool OK(
bool begin_ok=
true,
bool end_ok=
true)
const {
76 if (v_ptr ==
nullptr)
return false;
77 if (v_ptr->
revision == 0)
return false;
78 if (revision != v_ptr->
revision)
return false;
79 size_t pos = (size_t) (*
this - v_ptr->
begin());
80 if (pos > v_ptr->
size())
return false;
81 if (!begin_ok && pos == 0)
return false;
82 if (!end_ok && pos == v_ptr->
size())
return false;
89 operator ITERATOR_T() {
return *
this; }
90 operator const ITERATOR_T()
const {
return *
this; }
94 return wrapped_t::operator*();
98 return wrapped_t::operator*();
103 return wrapped_t::operator->();
107 return wrapped_t::operator->();
132 using iterator = iterator_wrapper< typename stdv_t::iterator >;
145 vector(std::initializer_list<T> in_list) : stdv_t(in_list), revision(1) { ; }
146 vector(
const stdv_t & in) : stdv_t(in), revision(1) { ; }
147 template <
typename InputIt>
148 vector(InputIt first, InputIt last) : stdv_t(first, last), revision(1) { ; }
151 size_t size()
const {
return stdv_t::size(); }
163 stdv_t::resize(new_size);
166 void resize(
size_t new_size,
const T & val) {
168 stdv_t::resize(new_size, val);
174 emp_assert(pos < stdv_t::size(), pos, stdv_t::size());
175 return stdv_t::operator[](pos);
179 emp_assert(pos < stdv_t::size(), pos, stdv_t::size());
180 return stdv_t::operator[](pos);
184 const T &
back()
const {
emp_assert(stdv_t::size() > 0);
return stdv_t::back(); }
188 template <
typename... PB_Ts>
190 stdv_t::push_back(std::forward<PB_Ts>(args)...);
195 emp_assert(stdv_t::size() > 0, stdv_t::size());
200 template <
typename... ARGS>
206 template <
typename... ARGS>
209 return iterator( stdv_t::erase(std::forward<ARGS>(args)...),
this );
212 template <
typename... ARGS>
215 return iterator( stdv_t::emplace(std::forward<ARGS>(args)...),
this );
218 template <
typename... ARGS>
220 stdv_t::emplace_back(std::forward<ARGS>(args)...);
226 template <
typename... Ts>
227 class vector<bool, Ts...> :
public std::vector<bool,Ts...> {
230 using stdv_t = std::vector<bool,Ts...>;
233 constexpr
static const size_t MAX_SIZE = 2000000001;
247 vector(std::initializer_list<bool> in_list) : stdv_t(in_list) { ; }
248 vector(
const stdv_t & in) : stdv_t(in) { ; }
249 template <
typename InputIt>
250 vector(InputIt first, InputIt last) : stdv_t(first, last){;}
256 void resize(
size_t new_size) {
emp_assert(new_size < MAX_SIZE, new_size); stdv_t::resize(new_size); }
259 stdv_t::resize(new_size, val);
263 auto operator[](
size_t pos) -> decltype(stdv_t::operator[](pos)) {
264 emp_assert(pos < stdv_t::size(), pos, stdv_t::size());
265 return stdv_t::operator[](pos);
269 emp_assert(pos < stdv_t::size(), pos, stdv_t::size());
270 return stdv_t::operator[](pos);
279 emp_assert(stdv_t::size() > 0, stdv_t::size());
287 template <
typename T,
typename... Ts>
289 for (
const T & x : v) out << x <<
" ";
293 template <
typename T,
typename... Ts>
295 for (T & x : v) is >> x;
Build a specialized debug wrapper for emp::vector<bool>
Definition: vector.h:227
vector()
Definition: vector.h:243
iterator insert(ARGS &&...args)
Definition: vector.h:201
ITERATOR_T wrapped_t
Definition: vector.h:58
vector(std::initializer_list< bool > in_list)
Definition: vector.h:247
int revision
Definition: vector.h:63
auto operator-(const this_t &in)
Definition: vector.h:117
State value_type
Definition: vector.h:136
void resize(size_t new_size, bool val)
Definition: vector.h:257
const_iterator end() const noexcept
Definition: vector.h:156
iterator end() noexcept
Definition: vector.h:155
typename stdv_t::reference reference
Definition: vector.h:138
vector(InputIt first, InputIt last)
Definition: vector.h:250
bool front() const
Definition: vector.h:276
void resize(size_t new_size)
Definition: vector.h:256
iterator_wrapper(const ITERATOR_T &_in, const vec_t *_v)
Definition: vector.h:68
vector(size_t size, bool val)
Definition: vector.h:246
vector()
Definition: vector.h:141
auto & operator*()
Definition: vector.h:92
auto & back()
Definition: vector.h:273
~vector()
Definition: vector.h:149
~iterator_wrapper()
Definition: vector.h:72
std::istream & operator>>(std::istream &is, emp::Ptr< T > &ptr)
Definition: Ptr.h:808
bool operator[](size_t pos) const
Definition: vector.h:268
typename stdv_t::iterator iterator
Definition: vector.h:236
iterator emplace(ARGS &&...args)
Definition: vector.h:213
vector(size_t size)
Definition: vector.h:245
void push_back(PB_Ts &&...args)
Definition: vector.h:189
const T & back() const
Definition: vector.h:184
vector(const stdv_t &in)
Definition: vector.h:146
iterator_wrapper< ITERATOR_T > this_t
Definition: vector.h:57
const auto & operator*() const
Definition: vector.h:96
void resize(size_t new_size, const T &val)
Definition: vector.h:166
size_t size() const
Definition: vector.h:151
void emplace_back(ARGS &&...args)
Definition: vector.h:219
A more dynamic replacement for standard library asserts.
const vec_t * v_ptr
What vector and revision was this iterator created from?
Definition: vector.h:62
const T & operator[](size_t pos) const
Definition: vector.h:178
const_iterator begin() const noexcept
Definition: vector.h:154
bool OK(bool begin_ok=true, bool end_ok=true) const
Definition: vector.h:75
this_t & operator++()
Definition: vector.h:110
std::ostream & operator<<(std::ostream &out, const emp::Ptr< T > &ptr)
Definition: Ptr.h:800
auto operator+(int in)
Definition: vector.h:115
void pop_back()
Definition: vector.h:278
const T & front() const
Definition: vector.h:186
auto operator->()
Definition: vector.h:101
auto & front()
Definition: vector.h:275
void pop_back()
Definition: vector.h:194
auto operator[](size_t pos) -> decltype(stdv_t::operator[](pos))
Definition: vector.h:263
typename stdv_t::const_reference const_reference
Definition: vector.h:139
this_t & operator-=(int in)
Definition: vector.h:120
iterator_wrapper< typename stdv_t::iterator > iterator
Definition: vector.h:132
typename stdv_t::size_type size_type
Definition: vector.h:239
iterator_wrapper< typename stdv_t::const_reverse_iterator > const_reverse_iterator
Definition: vector.h:135
typename stdv_t::size_type size_type
Definition: vector.h:137
void insert(std::set< T > &s1, const std::set< T > &s2)
Insert the full contents of s2 into s1.
Definition: set_utils.h:24
Setup an iterator wrapper to make sure that they're not used again after a vector changes...
Definition: vector.h:56
void resize(size_t new_size)
Definition: vector.h:161
vector(size_t size, const T &val)
Definition: vector.h:144
iterator begin() noexcept
Definition: vector.h:153
vector(const this_t &_in)
Definition: vector.h:142
vector(std::initializer_list< T > in_list)
Definition: vector.h:145
this_t & operator--()
Definition: vector.h:112
If we are in emscripten, make sure to include the header.
Definition: array.h:37
typename stdv_t::reference reference
Definition: vector.h:240
bool value_type
Definition: vector.h:238
Build a debug wrapper emp::vector around std::vector.
Definition: vector.h:42
vector(InputIt first, InputIt last)
Definition: vector.h:148
int revision
Setup a revision number - iterators must match the revision of their vector.
Definition: vector.h:52
#define emp_assert(...)
Definition: assert.h:199
this_t & operator+=(int in)
Definition: vector.h:119
T & back()
Definition: vector.h:183
iterator_wrapper< typename stdv_t::const_iterator > const_iterator
Definition: vector.h:133
T & front()
Definition: vector.h:185
auto operator-(int in)
Definition: vector.h:116
typename stdv_t::const_reference const_reference
Definition: vector.h:241
T & operator[](size_t pos)
Definition: vector.h:173
iterator erase(ARGS &&...args)
Definition: vector.h:207
this_t operator--(int x)
Definition: vector.h:113
bool back() const
Definition: vector.h:274
vector(const this_t &_in)
Definition: vector.h:244
const auto operator->() const
Definition: vector.h:105
iterator_wrapper< typename stdv_t::reverse_iterator > reverse_iterator
Definition: vector.h:134
typename stdv_t::const_iterator const_iterator
Definition: vector.h:237
vector(size_t size)
Definition: vector.h:143
this_t operator++(int x)
Definition: vector.h:111
this_t & operator=(const this_t &)=default
vector(const stdv_t &in)
Definition: vector.h:248
auto & operator[](int offset)
Definition: vector.h:121