36 std::array<T, N> m_array = {};
40 StackVector() =
default;
42 StackVector(std::initializer_list<T> init)
46 auto it = init.begin();
47 for (
size_t i = 0; i < m_size; ++i) {
48 m_array[i] = std::move(*it);
53 bool empty()
const {
return m_size == 0; }
55 size_t size()
const {
return m_size; }
57 void clear() { m_size = 0; }
59 void resize(
const size_t i)
65 void push_back(
const T& v)
68 m_array[m_size++] = v;
71 template <
class...
Args>
72 void emplace_back(
Args&&... args)
75 m_array[m_size++] = T(std::forward<Args>(args)...);
84 T* data() {
return m_array.data(); }
86 const T* data()
const {
return m_array.data(); }
91 return m_array.front();
94 const T& front()
const
97 return m_array.front();
103 return m_array.at(m_size - 1);
106 const T& back()
const
109 return m_array.at(m_size - 1);
112 T& at(
const size_t i)
115 return m_array.at(i);
118 const T& at(
const size_t i)
const
121 return m_array.at(i);
124 T& operator[](
const size_t i)
130 const T& operator[](
const size_t i)
const
136 template <
typename U,
class UnaryOperation>
137 auto transformed(UnaryOperation op)
139 StackVector<U, N> result;
140 result.resize(size());
141 for (
size_t i = 0; i < size(); ++i) {
142 result[i] = op(at(i));
151 static_assert(D <= N,
"Invalid size");
152 return to_tuple_helper(std::make_index_sequence<D>());
156 template <
size_t... Indices>
157 auto to_tuple_helper(std::index_sequence<Indices...>)
159 return std::make_tuple(m_array[Indices]...);
163 using iterator =
typename std::array<T, N>::iterator;
164 using const_iterator =
typename std::array<T, N>::const_iterator;
165 iterator begin() {
return m_array.begin(); }
166 iterator end() {
return m_array.begin() + m_size; }
167 const_iterator begin()
const {
return m_array.begin(); }
168 const_iterator end()
const {
return m_array.begin() + m_size; }