xref: /llvm-project/libcxx/include/__tuple/tuple_element.h (revision 3b8faee6c6f44343c3f9de76c40ff305f72dfcd6)
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