10#ifndef SEMF_UTILS_CORE_LISTS_STDARRAY_H_
11#define SEMF_UTILS_CORE_LISTS_STDARRAY_H_
25template <
typename T,
size_t N>
26class StdArray :
private virtual std::array<T, N>,
public Array<T>
32 using size_type = std::size_t;
34 using difference_type = std::ptrdiff_t;
36 using reference = value_type&;
38 using const_reference =
const value_type&;
42 using const_iterator =
const T*;
44 using reverse_iterator = std::reverse_iterator<iterator>;
46 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
53 StdArray(U&&... values);
54 virtual ~StdArray() =
default;
56 reference at(size_type pos)
override;
57 const_reference at(size_type pos)
const override;
58 reference operator[](size_type pos)
override;
59 const_reference operator[](size_type pos)
const override;
60 reference front()
override;
61 const_reference front()
const override;
62 reference back()
override;
63 const_reference back()
const override;
64 T* data() noexcept override;
65 const T* data() const noexcept override;
66 iterator begin() noexcept override;
67 const_iterator begin() const noexcept override;
68 const_iterator cbegin() const noexcept override;
69 iterator end() noexcept override;
70 const_iterator end() const noexcept override;
71 const_iterator cend() const noexcept override;
72 reverse_iterator rbegin() noexcept override;
73 const_reverse_iterator rbegin() const noexcept override;
74 const_reverse_iterator crbegin() const noexcept override;
75 reverse_iterator rend() noexcept override;
76 const_reverse_iterator rend() const noexcept override;
77 const_reverse_iterator crend() const noexcept override;
78 bool empty() const noexcept override;
79 size_type size() const noexcept override;
80 size_type max_size() const noexcept override;
81 void fill(const T& value) override;
82 bool swap(Array<T>& other) override;
85#ifndef DOXYGEN_SHOULD_SKIP_THIS
86template <
typename T,
size_t N>
88StdArray<T, N>::StdArray(U&&... values)
89: std::array<T, N>{{std::forward<U>(values)...}}
93template <
typename T,
size_t N>
94typename StdArray<T, N>::reference StdArray<T, N>::at(StdArray<T, N>::size_type pos)
96 return std::array<T, N>::at(pos);
99template <
typename T,
size_t N>
100typename StdArray<T, N>::const_reference StdArray<T, N>::at(StdArray<T, N>::size_type pos)
const
102 return std::array<T, N>::at(pos);
105template <
typename T,
size_t N>
106typename StdArray<T, N>::reference StdArray<T, N>::operator[](StdArray<T, N>::size_type pos)
108 return std::array<T, N>::operator[](pos);
111template <
typename T,
size_t N>
112typename StdArray<T, N>::const_reference StdArray<T, N>::operator[](StdArray<T, N>::size_type pos)
const
114 return std::array<T, N>::at(pos);
117template <
typename T,
size_t N>
118typename StdArray<T, N>::reference StdArray<T, N>::front()
120 return std::array<T, N>::front();
123template <
typename T,
size_t N>
124typename StdArray<T, N>::const_reference StdArray<T, N>::front()
const
126 return std::array<T, N>::front();
129template <
typename T,
size_t N>
130typename StdArray<T, N>::reference StdArray<T, N>::back()
132 return std::array<T, N>::back();
135template <
typename T,
size_t N>
136typename StdArray<T, N>::const_reference StdArray<T, N>::back()
const
138 return std::array<T, N>::back();
141template <
typename T,
size_t N>
142T* StdArray<T, N>::data() noexcept
144 return std::array<T, N>::data();
147template <
typename T,
size_t N>
148const T* StdArray<T, N>::data() const noexcept
150 return std::array<T, N>::data();
153template <
typename T,
size_t N>
154typename StdArray<T, N>::iterator StdArray<T, N>::begin() noexcept
156 return std::array<T, N>::begin();
159template <
typename T,
size_t N>
160typename StdArray<T, N>::const_iterator StdArray<T, N>::begin() const noexcept
162 return std::array<T, N>::begin();
165template <
typename T,
size_t N>
166typename StdArray<T, N>::const_iterator StdArray<T, N>::cbegin() const noexcept
168 return std::array<T, N>::cbegin();
171template <
typename T,
size_t N>
172typename StdArray<T, N>::iterator StdArray<T, N>::end() noexcept
174 return std::array<T, N>::end();
177template <
typename T,
size_t N>
178typename StdArray<T, N>::const_iterator StdArray<T, N>::end() const noexcept
180 return std::array<T, N>::end();
183template <
typename T,
size_t N>
184typename StdArray<T, N>::const_iterator StdArray<T, N>::cend() const noexcept
186 return std::array<T, N>::cend();
189template <
typename T,
size_t N>
190typename StdArray<T, N>::reverse_iterator StdArray<T, N>::rbegin() noexcept
192 return std::array<T, N>::rbegin();
195template <
typename T,
size_t N>
196typename StdArray<T, N>::const_reverse_iterator StdArray<T, N>::rbegin() const noexcept
198 return std::array<T, N>::rbegin();
201template <
typename T,
size_t N>
202typename StdArray<T, N>::const_reverse_iterator StdArray<T, N>::crbegin() const noexcept
204 return std::array<T, N>::crbegin();
207template <
typename T,
size_t N>
208typename StdArray<T, N>::reverse_iterator StdArray<T, N>::rend() noexcept
210 return std::array<T, N>::rend();
213template <
typename T,
size_t N>
214typename StdArray<T, N>::const_reverse_iterator StdArray<T, N>::rend() const noexcept
216 return std::array<T, N>::rend();
219template <
typename T,
size_t N>
220typename StdArray<T, N>::const_reverse_iterator StdArray<T, N>::crend() const noexcept
222 return std::array<T, N>::crend();
225template <
typename T,
size_t N>
226bool StdArray<T, N>::empty() const noexcept
228 return std::array<T, N>::empty();
231template <
typename T,
size_t N>
232typename StdArray<T, N>::size_type StdArray<T, N>::size() const noexcept
234 return std::array<T, N>::size();
237template <
typename T,
size_t N>
238typename StdArray<T, N>::size_type StdArray<T, N>::max_size() const noexcept
240 return std::array<T, N>::max_size();
243template <
typename T,
size_t N>
244void StdArray<T, N>::fill(
const T& value)
246 return std::array<T, N>::fill(value);
249template <
typename T,
size_t N>
250bool StdArray<T, N>::swap(Array<T>& other)
252 if (size() == other.size())
254 std::array<T, N>::swap(*
reinterpret_cast<StdArray<T, N>*
>(&other));