semf
stdarray.h
Go to the documentation of this file.
1
10#ifndef SEMF_UTILS_CORE_LISTS_STDARRAY_H_
11#define SEMF_UTILS_CORE_LISTS_STDARRAY_H_
12
14#include <array>
15#include <utility>
16
17namespace semf
18{
25template <typename T, size_t N>
26class StdArray : private virtual std::array<T, N>, public Array<T>
27{
28public:
30 using value_type = 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&;
40 using iterator = T*;
42 using const_iterator = const T*;
44 using reverse_iterator = std::reverse_iterator<iterator>;
46 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
52 template <class... U>
53 StdArray(U&&... values); // NOLINT
54 virtual ~StdArray() = default;
55
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;
83};
84
85#ifndef DOXYGEN_SHOULD_SKIP_THIS
86template <typename T, size_t N>
87template <class... U>
88StdArray<T, N>::StdArray(U&&... values)
89: std::array<T, N>{{std::forward<U>(values)...}}
90{
91}
92
93template <typename T, size_t N>
94typename StdArray<T, N>::reference StdArray<T, N>::at(StdArray<T, N>::size_type pos)
95{
96 return std::array<T, N>::at(pos);
97}
98
99template <typename T, size_t N>
100typename StdArray<T, N>::const_reference StdArray<T, N>::at(StdArray<T, N>::size_type pos) const
101{
102 return std::array<T, N>::at(pos);
103}
104
105template <typename T, size_t N>
106typename StdArray<T, N>::reference StdArray<T, N>::operator[](StdArray<T, N>::size_type pos)
107{
108 return std::array<T, N>::operator[](pos);
109}
110
111template <typename T, size_t N>
112typename StdArray<T, N>::const_reference StdArray<T, N>::operator[](StdArray<T, N>::size_type pos) const
113{
114 return std::array<T, N>::at(pos);
115}
116
117template <typename T, size_t N>
118typename StdArray<T, N>::reference StdArray<T, N>::front()
119{
120 return std::array<T, N>::front();
121}
122
123template <typename T, size_t N>
124typename StdArray<T, N>::const_reference StdArray<T, N>::front() const
125{
126 return std::array<T, N>::front();
127}
128
129template <typename T, size_t N>
130typename StdArray<T, N>::reference StdArray<T, N>::back()
131{
132 return std::array<T, N>::back();
133}
134
135template <typename T, size_t N>
136typename StdArray<T, N>::const_reference StdArray<T, N>::back() const
137{
138 return std::array<T, N>::back();
139}
140
141template <typename T, size_t N>
142T* StdArray<T, N>::data() noexcept
143{
144 return std::array<T, N>::data();
145}
146
147template <typename T, size_t N>
148const T* StdArray<T, N>::data() const noexcept
149{
150 return std::array<T, N>::data();
151}
152
153template <typename T, size_t N>
154typename StdArray<T, N>::iterator StdArray<T, N>::begin() noexcept
155{
156 return std::array<T, N>::begin();
157}
158
159template <typename T, size_t N>
160typename StdArray<T, N>::const_iterator StdArray<T, N>::begin() const noexcept
161{
162 return std::array<T, N>::begin();
163}
164
165template <typename T, size_t N>
166typename StdArray<T, N>::const_iterator StdArray<T, N>::cbegin() const noexcept
167{
168 return std::array<T, N>::cbegin();
169}
170
171template <typename T, size_t N>
172typename StdArray<T, N>::iterator StdArray<T, N>::end() noexcept
173{
174 return std::array<T, N>::end();
175}
176
177template <typename T, size_t N>
178typename StdArray<T, N>::const_iterator StdArray<T, N>::end() const noexcept
179{
180 return std::array<T, N>::end();
181}
182
183template <typename T, size_t N>
184typename StdArray<T, N>::const_iterator StdArray<T, N>::cend() const noexcept
185{
186 return std::array<T, N>::cend();
187}
188
189template <typename T, size_t N>
190typename StdArray<T, N>::reverse_iterator StdArray<T, N>::rbegin() noexcept
191{
192 return std::array<T, N>::rbegin();
193}
194
195template <typename T, size_t N>
196typename StdArray<T, N>::const_reverse_iterator StdArray<T, N>::rbegin() const noexcept
197{
198 return std::array<T, N>::rbegin();
199}
200
201template <typename T, size_t N>
202typename StdArray<T, N>::const_reverse_iterator StdArray<T, N>::crbegin() const noexcept
203{
204 return std::array<T, N>::crbegin();
205}
206
207template <typename T, size_t N>
208typename StdArray<T, N>::reverse_iterator StdArray<T, N>::rend() noexcept
209{
210 return std::array<T, N>::rend();
211}
212
213template <typename T, size_t N>
214typename StdArray<T, N>::const_reverse_iterator StdArray<T, N>::rend() const noexcept
215{
216 return std::array<T, N>::rend();
217}
218
219template <typename T, size_t N>
220typename StdArray<T, N>::const_reverse_iterator StdArray<T, N>::crend() const noexcept
221{
222 return std::array<T, N>::crend();
223}
224
225template <typename T, size_t N>
226bool StdArray<T, N>::empty() const noexcept
227{
228 return std::array<T, N>::empty();
229}
230
231template <typename T, size_t N>
232typename StdArray<T, N>::size_type StdArray<T, N>::size() const noexcept
233{
234 return std::array<T, N>::size();
235}
236
237template <typename T, size_t N>
238typename StdArray<T, N>::size_type StdArray<T, N>::max_size() const noexcept
239{
240 return std::array<T, N>::max_size();
241}
242
243template <typename T, size_t N>
244void StdArray<T, N>::fill(const T& value)
245{
246 return std::array<T, N>::fill(value);
247}
248
249template <typename T, size_t N>
250bool StdArray<T, N>::swap(Array<T>& other)
251{
252 if (size() == other.size())
253 {
254 std::array<T, N>::swap(*reinterpret_cast<StdArray<T, N>*>(&other));
255 return true;
256 }
257 return false;
258}
259} // namespace semf
260#endif // DOXYGEN_SHOULD_SKIP_THIS
261#endif // SEMF_UTILS_CORE_LISTS_STDARRAY_H_