19
19
20
20
#include <initializer_list> // required by standard
21
21
22
+ #include <_move.h>
22
23
#include <cstddef> // size_t, ptrdiff_t
23
24
#include <algorithm> // fill and swap_ranges
25
+ #include <type_traits> // integral_constant
24
26
25
27
namespace std {
26
28
template <typename>
@@ -30,7 +32,7 @@ struct reverse_iterator;
30
32
template <typename _TypeT, size_t _Size>
31
33
struct array {
32
34
// [array.overview]
33
- _TypeT _C_elem[_Size];
35
+ _TypeT _C_elem[_Size != 0 ? _Size : 1 ];
34
36
35
37
using value_type = _TypeT;
36
38
using size_type = size_t;
@@ -44,7 +46,8 @@ struct array {
44
46
using reverse_iterator = std::reverse_iterator<iterator>;
45
47
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
46
48
// [array.size]
47
- constexpr size_type size() const noexcept
49
+ // ARMC5 complains "a constexpr member function is only permitted in a literal class type"
50
+ /*constexpr*/ size_type size() const noexcept
48
51
{
49
52
return _Size;
50
53
}
@@ -101,11 +104,11 @@ struct array {
101
104
{
102
105
return _C_elem[_Size - 1];
103
106
}
104
- constexpr bool empty() const noexcept
107
+ /* constexpr*/ bool empty() const noexcept
105
108
{
106
109
return false;
107
110
}
108
- constexpr size_type max_size() const noexcept
111
+ /* constexpr*/ size_type max_size() const noexcept
109
112
{
110
113
return _Size;
111
114
}
@@ -159,13 +162,90 @@ struct array {
159
162
}
160
163
};
161
164
165
+ template <typename _TypeT, size_t _Size>
166
+ bool operator==(const array<_TypeT, _Size> &__x, const array<_TypeT, _Size> &__y)
167
+ {
168
+ return equal(__x.begin(), __x.end(), __y.begin());
169
+ }
170
+
171
+ template <typename _TypeT, size_t _Size>
172
+ bool operator!=(const array<_TypeT, _Size> &__x, const array<_TypeT, _Size> &__y)
173
+ {
174
+ return !(__x == __y);
175
+ }
176
+
177
+ template <typename _TypeT, size_t _Size>
178
+ bool operator<(const array<_TypeT, _Size> &__x, const array<_TypeT, _Size> &__y)
179
+ {
180
+ return lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
181
+ }
182
+
183
+ template <typename _TypeT, size_t _Size>
184
+ bool operator>(const array<_TypeT, _Size> &__x, const array<_TypeT, _Size> &__y)
185
+ {
186
+ return __y < __x;
187
+ }
188
+
189
+ template <typename _TypeT, size_t _Size>
190
+ bool operator<=(const array<_TypeT, _Size> &__x, const array<_TypeT, _Size> &__y)
191
+ {
192
+ return !(__x > __y);
193
+ }
194
+
195
+ template <typename _TypeT, size_t _Size>
196
+ bool operator>=(const array<_TypeT, _Size> &__x, const array<_TypeT, _Size> &__y)
197
+ {
198
+ return !(__x < __y);
199
+ }
200
+
162
201
// [array.special]
163
- template <class _TypeT, size_t _Size>
202
+ template <typename _TypeT, size_t _Size>
164
203
void swap(array<_TypeT, _Size> &__x, array<_TypeT, _Size> &__y)
165
204
{
166
205
__x.swap(__y);
167
206
}
168
207
208
+ // [array.tuple]
209
+ template <typename>
210
+ struct tuple_size;
211
+
212
+ template <typename _TypeT, size_t _Size>
213
+ struct tuple_size<array<_TypeT, _Size>> : integral_constant<size_t, _Size> { };
214
+
215
+ template <size_t, typename>
216
+ struct tuple_element;
217
+
218
+ template <size_t _Idx, typename _TypeT, size_t _Size>
219
+ struct tuple_element<_Idx, array<_TypeT, _Size>> : type_identity<_TypeT> {
220
+ static_assert(_Idx < _Size, "array index out of bounds");
221
+ };
222
+
223
+ template <size_t _Idx, typename _TypeT, size_t _Size>
224
+ constexpr _TypeT &get(array<_TypeT, _Size> &__a) noexcept
225
+ {
226
+ static_assert(_Idx < _Size, "array index out of bounds");
227
+ return __a._C_elem[_Idx];
228
+ }
229
+
230
+ template <size_t _Idx, typename _TypeT, size_t _Size>
231
+ _TypeT &&get(array<_TypeT, _Size> &&__a) noexcept
232
+ {
233
+ return std::move(get<_Idx>(__a));
234
+ }
235
+
236
+ template <size_t _Idx, typename _TypeT, size_t _Size>
237
+ constexpr const _TypeT &get(const array<_TypeT, _Size> &__a) noexcept
238
+ {
239
+ static_assert(_Idx < _Size, "array index out of bounds");
240
+ return __a._C_elem[_Idx];
241
+ }
242
+
243
+ template <size_t _Idx, typename _TypeT, size_t _Size>
244
+ const _TypeT &&get(const array<_TypeT, _Size> &&__a) noexcept
245
+ {
246
+ return std::move(get<_Idx>(__a));
247
+ }
248
+
169
249
} // namespace std
170
250
171
251
#endif /* __array */
0 commit comments