43 template<
class T,
size_t Nmax>
45 typedef std::array<T, Nmax> Base;
50 template<
size_t Nmax2,
51 typename =
typename std::enable_if<(Nmax2 <= Nmax)>::type>
54 { std::copy(vec.begin(), vec.
end(), Base::begin()); }
64 auto it = _list.begin();
65 for (
size_t i(0); (i < Nmax) && (it != _list.end()); ++i, ++it)
70 constexpr
typename Base::size_type
size()
const {
return _size; }
73 constexpr
bool empty()
const {
return size() == 0; }
76 typename Base::iterator
end() {
return Base::begin() + _size; }
79 typename Base::const_iterator
end()
const {
return Base::begin() + _size; }
82 typename Base::const_iterator
cend()
const {
return Base::begin()+ _size; }
86 typename Base::reverse_iterator
rbegin() {
return typename Base::reverse_iterator(this->
end()); }
90 typename Base::const_reverse_iterator
rbegin()
const {
return typename Base::const_reverse_iterator(this->
end()); }
94 typename Base::const_reverse_iterator
crbegin()
const {
return typename Base::const_reverse_iterator(this->
end()); }
98 typename Base::reverse_iterator
rend() {
return typename Base::reverse_iterator(this->begin()); }
102 typename Base::const_reverse_iterator
rend()
const {
return typename Base::const_reverse_iterator(this->begin()); }
106 typename Base::const_reverse_iterator
crend()
const {
return typename Base::const_reverse_iterator(this->begin()); }
109 typename Base::reference
back() {
return _size ? *(this->
end() - 1) : *this->
end(); }
112 typename Base::const_reference
back()
const {
return _size ? *(this->
end() - 1) : *this->
end(); }
118 stator_throw() <<
"Cannot push elements to a filled StackVector " << *
this;
120 Base::operator[](_size) = val;
128 stator_throw() <<
"Cannot pop elements from an empty StackVector " << *
this;
130 return Base::operator[](--_size);
134 template<
size_t Nmax2>
136 for (
const T& a: ovec)
146 template<
class T,
size_t Nmax>
147 std::ostream& operator<<(std::ostream& os, const StackVector<T,Nmax>&s) {
148 os <<
"StackVector{ ";
149 for (
const auto& val : s)
156 template<
class T1,
class T2,
size_t Nmax>
157 std::ostream& operator<<(std::ostream& os, const StackVector<std::pair<T1,T2>,Nmax>&s) {
158 os <<
"StackVector{ ";
159 for (
const auto& val : s)
160 os <<
"[" << val.first <<
", " << val.second <<
"] ";
166 template<std::size_t I = 0,
typename... Tp>
167 inline typename std::enable_if<I ==
sizeof...(Tp),
void>::type
171 template<std::size_t I = 0,
typename... Tp>
172 inline typename std::enable_if<I <
sizeof...(Tp),
void>::type
173 tuple_print(
const std::tuple<Tp...>& t, std::ostream& os)
175 os << std::get<I>(t) <<
" ";
181 template<
size_t Nmax,
typename... Tp>
184 os <<
"StackVector{ ";
185 for (
const auto& val : s) {
Base::iterator end()
Returns an iterator pointing to the end of the container.
StackVector(std::initializer_list< T > _list)
Array initialisation constructor.
Base::reverse_iterator rbegin()
Returns a reverse iterator pointing to the start of the container.
Base::const_reverse_iterator rend() const
Returns a reverse iterator pointing to the end of the container.
Stack-allocated equivalent of std::vector.
T pop_back()
Removes and returns the last element of the container.
std::enable_if< I==sizeof...(Tp), void >::type tuple_print(const std::tuple< Tp... > &t, std::ostream &os)
StackVector()
Default constructor.
std::ostream & operator<<(std::ostream &os, const StackVector< T, Nmax > &s)
constexpr bool empty() const
Test if the container is empty.
void push_back(const T &val)
Add an element to the end of the container.
Base::const_reverse_iterator rbegin() const
Returns a reverse iterator pointing to the start of the container.
Base::reverse_iterator rend()
Returns a reverse iterator pointing to the end of the container.
Base::const_iterator cend() const
Returns a const iterator pointing to the end of the container.
Base::const_reverse_iterator crend() const
Returns a const reverse iterator pointing to the end of the container.
constexpr Base::size_type size() const
The number of elements currently stored.
StackVector(const StackVector< T, Nmax2 > &vec)
Copy constructor which allows construction from smaller StackVector types.
The stator library namespace.
Base::reference back()
Returns a reference to the last element stored in the container.
void extend(const StackVector< T, Nmax2 > &ovec)
Merge the contents of another StackVector into this one.
Base::const_iterator end() const
Returns an iterator pointing to the end of the container.
Base::const_reverse_iterator crbegin() const
Returns a const reverse iterator pointing to the start of the container.
Base::const_reference back() const
Returns a reference to the last element stored in the container.