1e2b15ec2SNikolas Klauser //===----------------------------------------------------------------------===// 2e2b15ec2SNikolas Klauser // 3e2b15ec2SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e2b15ec2SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 5e2b15ec2SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e2b15ec2SNikolas Klauser // 7e2b15ec2SNikolas Klauser //===----------------------------------------------------------------------===// 8e2b15ec2SNikolas Klauser 9e2b15ec2SNikolas Klauser #ifndef _LIBCPP___TUPLE_TUPLE_ELEMENT_H 10e2b15ec2SNikolas Klauser #define _LIBCPP___TUPLE_TUPLE_ELEMENT_H 11e2b15ec2SNikolas Klauser 12e2b15ec2SNikolas Klauser #include <__config> 13eb0f1218SLouis Dionne #include <__cstddef/size_t.h> 14e2b15ec2SNikolas Klauser #include <__tuple/tuple_indices.h> 15e2b15ec2SNikolas Klauser #include <__tuple/tuple_types.h> 16e2b15ec2SNikolas Klauser 17e2b15ec2SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 18e2b15ec2SNikolas Klauser # pragma GCC system_header 19e2b15ec2SNikolas Klauser #endif 20e2b15ec2SNikolas Klauser 21e2b15ec2SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 22e2b15ec2SNikolas Klauser 239783f28cSLouis Dionne template <size_t _Ip, class _Tp> 249783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_element; 25e2b15ec2SNikolas Klauser 26e2b15ec2SNikolas Klauser template <size_t _Ip, class _Tp> 279783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, const _Tp> { 28*3b8faee6SNikolas Klauser using type _LIBCPP_NODEBUG = const typename tuple_element<_Ip, _Tp>::type; 29e2b15ec2SNikolas Klauser }; 30e2b15ec2SNikolas Klauser 31e2b15ec2SNikolas Klauser template <size_t _Ip, class _Tp> 329783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, volatile _Tp> { 33*3b8faee6SNikolas Klauser using type _LIBCPP_NODEBUG = volatile typename tuple_element<_Ip, _Tp>::type; 34e2b15ec2SNikolas Klauser }; 35e2b15ec2SNikolas Klauser 36e2b15ec2SNikolas Klauser template <size_t _Ip, class _Tp> 379783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, const volatile _Tp> { 38*3b8faee6SNikolas Klauser using type _LIBCPP_NODEBUG = const volatile typename tuple_element<_Ip, _Tp>::type; 39e2b15ec2SNikolas Klauser }; 40e2b15ec2SNikolas Klauser 41e2b15ec2SNikolas Klauser #ifndef _LIBCPP_CXX03_LANG 42e2b15ec2SNikolas Klauser 43e2b15ec2SNikolas Klauser template <size_t _Ip, class... _Types> 449783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, __tuple_types<_Types...> > { 45e2b15ec2SNikolas Klauser static_assert(_Ip < sizeof...(_Types), "tuple_element index out of range"); 46*3b8faee6SNikolas Klauser using type _LIBCPP_NODEBUG = __type_pack_element<_Ip, _Types...>; 47e2b15ec2SNikolas Klauser }; 48e2b15ec2SNikolas Klauser 49e2b15ec2SNikolas Klauser # if _LIBCPP_STD_VER >= 14 50e2b15ec2SNikolas Klauser template <size_t _Ip, class... _Tp> 51e2b15ec2SNikolas Klauser using tuple_element_t _LIBCPP_NODEBUG = typename tuple_element<_Ip, _Tp...>::type; 52e2b15ec2SNikolas Klauser # endif 53e2b15ec2SNikolas Klauser 54e2b15ec2SNikolas Klauser #endif // _LIBCPP_CXX03_LANG 55e2b15ec2SNikolas Klauser 56e2b15ec2SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 57e2b15ec2SNikolas Klauser 58e2b15ec2SNikolas Klauser #endif // _LIBCPP___TUPLE_TUPLE_ELEMENT_H 59