22 #include <initializer_list> 26 #include "../meta/TypeID.h" 32 template <
typename T,
size_t N>
using array = std::array<T,N>;
41 template <
typename T,
size_t N>
42 class array :
public std::vector<T> {
45 using base_t = std::vector<T>;
51 template<
typename ITERATOR_T>
66 bool OK(
bool begin_ok=
true,
bool end_ok=
true)
const {
67 if (v_ptr ==
nullptr)
return false;
68 if (!v_ptr->
valid)
return false;
69 size_t pos = (size_t) (*
this - v_ptr->
begin());
70 if (pos > v_ptr->
size())
return false;
71 if (!begin_ok && pos == 0)
return false;
72 if (!end_ok && pos == v_ptr->
size())
return false;
79 operator ITERATOR_T() {
return *
this; }
80 operator const ITERATOR_T()
const {
return *
this; }
84 return wrapped_t::operator*();
88 return wrapped_t::operator*();
93 return wrapped_t::operator->();
97 return wrapped_t::operator->();
114 using iterator = iterator_wrapper< typename base_t::iterator >;
123 array() : base_t(N), valid(true) {};
127 template <
typename InputIt>
131 operator std::array<T,N>() {
133 for (
size_t i = 0; i < N; i++) ar[i] = base_t::operator[](i);
137 constexpr
size_t size()
const {
return N; }
148 return base_t::operator[](pos);
153 return base_t::operator[](pos);
161 void fill(
const T & val) { this->assign(N, val); }
166 void resize(
size_t new_size,
const T & val) {
emp_assert(
false,
"invalid operation for array!"); }
168 template <
typename... PB_Ts>
172 template <
typename... ARGS>
174 emp_assert(
false,
"invalid operation for array!");
178 template <
typename... ARGS>
180 emp_assert(
false,
"invalid operation for array!");
181 return iterator( base_t::erase(std::forward<ARGS>(args)...),
this );
184 template <
typename... ARGS>
186 emp_assert(
false,
"invalid operation for array!");
187 return iterator( base_t::emplace(std::forward<ARGS>(args)...),
this );
190 template <
typename... ARGS>
192 emp_assert(
false,
"invalid operation for array!");
200 template <
typename T,
size_t N>
201 std::ostream & operator<<(std::ostream & out, const emp::array<T,N> & v) {
202 for (
const T & x : v) out << x <<
" ";
206 template <
typename T,
size_t N>
208 for (T & x : v) is >> x;
218 std::stringstream ss;
this_t operator--(int x)
Definition: array.h:103
auto operator-(const this_t &in)
Definition: array.h:107
const T & front() const
Definition: array.h:159
iterator_wrapper< typename base_t::reverse_iterator > reverse_iterator
Definition: array.h:116
const auto & operator*() const
Definition: array.h:86
auto operator-(int in)
Definition: array.h:106
auto & operator[](int offset)
Definition: array.h:111
array(const this_t &_in)
Definition: array.h:124
const T & back() const
Definition: array.h:157
void fill(const T &val)
Definition: array.h:161
iterator begin() noexcept
Definition: array.h:139
this_t & operator++()
Definition: array.h:100
bool valid
Definition: array.h:48
const T & operator[](size_t pos) const
Definition: array.h:151
ITERATOR_T wrapped_t
Definition: array.h:54
bool OK(bool begin_ok=true, bool end_ok=true) const
Definition: array.h:66
std::istream & operator>>(std::istream &is, emp::Ptr< T > &ptr)
Definition: Ptr.h:808
iterator end() noexcept
Definition: array.h:141
iterator insert(ARGS &&...args)
Definition: array.h:173
iterator erase(ARGS &&...args)
Definition: array.h:179
iterator_wrapper< typename base_t::const_reverse_iterator > const_reverse_iterator
Definition: array.h:117
this_t operator++(int x)
Definition: array.h:101
iterator_wrapper< typename base_t::const_iterator > const_iterator
Definition: array.h:115
A more dynamic replacement for standard library asserts.
array(const base_t &in)
Definition: array.h:126
void push_back(PB_Ts &&...args)
Definition: array.h:169
iterator_wrapper< ITERATOR_T > this_t
Definition: array.h:53
this_t & operator-=(int in)
Definition: array.h:110
auto operator->()
Definition: array.h:91
~iterator_wrapper()
Definition: array.h:63
const auto operator->() const
Definition: array.h:95
Setup an iterator wrapper to make sure that they're valid.
Definition: array.h:52
T & back()
Definition: array.h:156
void resize(size_t new_size)
Definition: array.h:165
iterator_wrapper< typename base_t::iterator > iterator
Definition: array.h:114
this_t & operator+=(int in)
Definition: array.h:109
typename base_t::reference reference
Definition: array.h:120
iterator_wrapper(const ITERATOR_T &_in, const vec_t *_v)
Definition: array.h:60
typename base_t::size_type size_type
Definition: array.h:119
const_iterator end() const noexcept
Definition: array.h:142
static std::string GetName()
Definition: TypeID.h:28
auto operator+(int in)
Definition: array.h:105
T & operator[](size_t pos)
Definition: array.h:146
constexpr size_t size() const
Definition: array.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
void resize(size_t new_size, const T &val)
Definition: array.h:166
typename base_t::const_reference const_reference
Definition: array.h:121
If we are in emscripten, make sure to include the header.
Definition: array.h:37
this_t & operator=(const this_t &)=default
Build a debug wrapper emp::vector around std::vector.
Definition: vector.h:42
#define emp_assert(...)
Definition: assert.h:199
iterator emplace(ARGS &&...args)
Definition: array.h:185
array()
Definition: array.h:123
array(std::initializer_list< T > in_list)
Definition: array.h:125
~array()
Definition: array.h:129
T & front()
Definition: array.h:158
void pop_back()
Definition: array.h:170
const_iterator begin() const noexcept
Definition: array.h:140
this_t & operator--()
Definition: array.h:102
auto & operator*()
Definition: array.h:82
array(InputIt first, InputIt last)
Definition: array.h:128
const vec_t * v_ptr
What vector was this iterator created from?
Definition: array.h:58
void emplace_back(ARGS &&...args)
Definition: array.h:191
static std::string GetName()
Definition: array.h:217