36 std::array<T, N> m_array;
42 StackSet(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);
55 using iterator =
typename std::array<T, N>::iterator;
56 using const_iterator =
typename std::array<T, N>::const_iterator;
57 iterator begin() {
return m_array.begin(); }
58 iterator end() {
return m_array.begin() + m_size; }
59 const_iterator begin()
const {
return m_array.begin(); }
60 const_iterator end()
const {
return m_array.begin() + m_size; }
63 size_t size()
const {
return m_size; }
65 void clear() { m_size = 0; }
67 void resize(
const size_t i)
73 std::pair<iterator, bool> insert(
const T& v)
76 for (
size_t i = 0; i < m_size; ++i) {
77 if (m_array[i] == v) {
78 return {begin() + i,
false};
81 m_array[m_size++] = v;
82 return {begin() + m_size - 1,
true};
85 size_t erase(
const T& v)
90 std::swap(*it, *(end() - 1));
97 bool contains(
const T& v)
const {
return find(v) != end(); }
99 const_iterator find(
const T& v)
const {
return std::find(begin(), end(), v); }
101 const T* data()
const {
return m_array.data(); }
103 const T& front()
const
106 return m_array.front();
109 const T& back()
const
112 return m_array.at(m_size - 1);
115 const T& at(
const size_t i)
const
118 return m_array.at(i);
121 const T& operator[](
const size_t i)
const
127 template <
typename U,
class UnaryOperation>
128 auto transformed(UnaryOperation op)
130 StackSet<U, N> result;
131 result.resize(size());
132 for (
size_t i = 0; i < size(); ++i) {
133 result[i] = op(at(i));
135 result.ensure_unique();
143 static_assert(D <= N,
"Invalid size");
144 return to_tuple_helper(std::make_index_sequence<D>());
148 template <
size_t... Indices>
149 auto to_tuple_helper(std::index_sequence<Indices...>)
151 return std::make_tuple(m_array[Indices]...);
156 std::sort(m_array.begin(), m_array.end());
157 auto it = std::unique(m_array.begin(), m_array.end());
158 m_size =
static_cast<size_t>(std::distance(m_array.begin(), it));
161 iterator find(
const T& v) {
return std::find(begin(), end(), v); }
163 T* data() {
return m_array.data(); }
168 return m_array.front();
174 return m_array.at(m_size - 1);