Skip to content

Commit 7dacafa

Browse files
author
Seppo Takalo
authored
Merge pull request #11076 from kjbracey-arm/mstd
ARMC5 <array> extensions
2 parents c505d25 + 940ed6c commit 7dacafa

File tree

1 file changed

+85
-5
lines changed
  • platform/cxxsupport/TOOLCHAIN_ARMC5

1 file changed

+85
-5
lines changed

platform/cxxsupport/TOOLCHAIN_ARMC5/array

Lines changed: 85 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919

2020
#include <initializer_list> // required by standard
2121

22+
#include <_move.h>
2223
#include <cstddef> // size_t, ptrdiff_t
2324
#include <algorithm> // fill and swap_ranges
25+
#include <type_traits> // integral_constant
2426

2527
namespace std {
2628
template <typename>
@@ -30,7 +32,7 @@ struct reverse_iterator;
3032
template <typename _TypeT, size_t _Size>
3133
struct array {
3234
// [array.overview]
33-
_TypeT _C_elem[_Size];
35+
_TypeT _C_elem[_Size != 0 ? _Size : 1];
3436

3537
using value_type = _TypeT;
3638
using size_type = size_t;
@@ -44,7 +46,8 @@ struct array {
4446
using reverse_iterator = std::reverse_iterator<iterator>;
4547
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
4648
// [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
4851
{
4952
return _Size;
5053
}
@@ -101,11 +104,11 @@ struct array {
101104
{
102105
return _C_elem[_Size - 1];
103106
}
104-
constexpr bool empty() const noexcept
107+
/*constexpr*/ bool empty() const noexcept
105108
{
106109
return false;
107110
}
108-
constexpr size_type max_size() const noexcept
111+
/*constexpr*/ size_type max_size() const noexcept
109112
{
110113
return _Size;
111114
}
@@ -159,13 +162,90 @@ struct array {
159162
}
160163
};
161164

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+
162201
// [array.special]
163-
template <class _TypeT, size_t _Size>
202+
template <typename _TypeT, size_t _Size>
164203
void swap(array<_TypeT, _Size> &__x, array<_TypeT, _Size> &__y)
165204
{
166205
__x.swap(__y);
167206
}
168207

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+
169249
} // namespace std
170250

171251
#endif /* __array */

0 commit comments

Comments
 (0)