38 std::array<T, N> m_array;
42 StackVector() =
default;
44 StackVector(std::initializer_list<T> init)
48 auto it = init.begin();
49 for (
size_t i = 0; i < m_size; ++i) {
50 m_array[i] = std::move(*it);
55 bool empty()
const {
return m_size == 0; }
57 size_t size()
const {
return m_size; }
59 void clear() { m_size = 0; }
61 void resize(
const size_t i)
67 void push_back(
const T& v)
70 m_array[m_size++] = v;
73 template <
class...
Args>
74 void emplace_back(
Args&&... args)
77 m_array[m_size++] = T(std::forward<Args>(args)...);
86 T* data() {
return m_array.data(); }
88 const T* data()
const {
return m_array.data(); }
93 return m_array.front();
96 const T& front()
const
99 return m_array.front();
105 return m_array.at(m_size - 1);
108 const T& back()
const
111 return m_array.at(m_size - 1);
114 T& at(
const size_t i)
117 return m_array.at(i);
120 const T& at(
const size_t i)
const
123 return m_array.at(i);
126 T& operator[](
const size_t i)
132 const T& operator[](
const size_t i)
const
138 template <
typename U,
class UnaryOperation>
139 auto transformed(UnaryOperation op)
141 StackVector<U, N> result;
142 result.resize(size());
143 for (
size_t i = 0; i < size(); ++i) {
144 result[i] = op(at(i));
153 static_assert(D <= N,
"Invalid size");
154 return to_tuple_helper(std::make_index_sequence<D>());
158 template <
size_t... Indices>
159 auto to_tuple_helper(std::index_sequence<Indices...>)
161 return std::make_tuple(m_array[Indices]...);
165 using iterator =
typename std::array<T, N>::iterator;
166 using const_iterator =
typename std::array<T, N>::const_iterator;
167 iterator begin() {
return m_array.begin(); }
168 iterator end() {
return m_array.begin() + m_size; }
169 const_iterator begin()
const {
return m_array.begin(); }
170 const_iterator end()
const {
return m_array.begin() + m_size; }