Skip to content

Commit 940ed6c

Browse files
committed
ARMC5 <array>: Add tuple interface
1 parent 0449e6f commit 940ed6c

File tree

1 file changed

+43
-0
lines changed
  • platform/cxxsupport/TOOLCHAIN_ARMC5

1 file changed

+43
-0
lines changed

platform/cxxsupport/TOOLCHAIN_ARMC5/array

Lines changed: 43 additions & 0 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>
@@ -203,6 +205,47 @@ void swap(array<_TypeT, _Size> &__x, array<_TypeT, _Size> &__y)
203205
__x.swap(__y);
204206
}
205207

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+
206249
} // namespace std
207250

208251
#endif /* __array */

0 commit comments

Comments
 (0)