xref: /llvm-project/libcxx/include/__tuple/tuple_size.h (revision f69585235ec85d54e0f3fc41b2d5700430907f99)
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_SIZE_H
10e2b15ec2SNikolas Klauser #define _LIBCPP___TUPLE_TUPLE_SIZE_H
11e2b15ec2SNikolas Klauser 
12e2b15ec2SNikolas Klauser #include <__config>
13eb0f1218SLouis Dionne #include <__cstddef/size_t.h>
14e2b15ec2SNikolas Klauser #include <__fwd/tuple.h>
15e2b15ec2SNikolas Klauser #include <__tuple/tuple_types.h>
16d6832a61SLouis Dionne #include <__type_traits/enable_if.h>
17d6832a61SLouis Dionne #include <__type_traits/integral_constant.h>
18e2b15ec2SNikolas Klauser #include <__type_traits/is_const.h>
19e2b15ec2SNikolas Klauser #include <__type_traits/is_volatile.h>
20e2b15ec2SNikolas Klauser 
21e2b15ec2SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
22e2b15ec2SNikolas Klauser #  pragma GCC system_header
23e2b15ec2SNikolas Klauser #endif
24e2b15ec2SNikolas Klauser 
25e2b15ec2SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
26e2b15ec2SNikolas Klauser 
279783f28cSLouis Dionne template <class _Tp>
289783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_size;
29e2b15ec2SNikolas Klauser 
30e2b15ec2SNikolas Klauser #if !defined(_LIBCPP_CXX03_LANG)
31e2b15ec2SNikolas Klauser template <class _Tp, class...>
32*f6958523SNikolas Klauser using __enable_if_tuple_size_imp _LIBCPP_NODEBUG = _Tp;
33e2b15ec2SNikolas Klauser 
34e2b15ec2SNikolas Klauser template <class _Tp>
359783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< const _Tp,
36e2b15ec2SNikolas Klauser                                                                    __enable_if_t<!is_volatile<_Tp>::value>,
37e2b15ec2SNikolas Klauser                                                                    integral_constant<size_t, sizeof(tuple_size<_Tp>)>>>
38e2b15ec2SNikolas Klauser     : public integral_constant<size_t, tuple_size<_Tp>::value> {};
39e2b15ec2SNikolas Klauser 
40e2b15ec2SNikolas Klauser template <class _Tp>
419783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< volatile _Tp,
42e2b15ec2SNikolas Klauser                                                                    __enable_if_t<!is_const<_Tp>::value>,
43e2b15ec2SNikolas Klauser                                                                    integral_constant<size_t, sizeof(tuple_size<_Tp>)>>>
44e2b15ec2SNikolas Klauser     : public integral_constant<size_t, tuple_size<_Tp>::value> {};
45e2b15ec2SNikolas Klauser 
46e2b15ec2SNikolas Klauser template <class _Tp>
479783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS
489783f28cSLouis Dionne tuple_size<__enable_if_tuple_size_imp<const volatile _Tp, integral_constant<size_t, sizeof(tuple_size<_Tp>)>>>
49e2b15ec2SNikolas Klauser     : public integral_constant<size_t, tuple_size<_Tp>::value> {};
50e2b15ec2SNikolas Klauser 
51e2b15ec2SNikolas Klauser #else
529783f28cSLouis Dionne template <class _Tp>
539783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_size<const _Tp> : public tuple_size<_Tp> {};
549783f28cSLouis Dionne template <class _Tp>
559783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_size<volatile _Tp> : public tuple_size<_Tp> {};
569783f28cSLouis Dionne template <class _Tp>
579783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_size<const volatile _Tp> : public tuple_size<_Tp> {};
58e2b15ec2SNikolas Klauser #endif
59e2b15ec2SNikolas Klauser 
60e2b15ec2SNikolas Klauser #ifndef _LIBCPP_CXX03_LANG
61e2b15ec2SNikolas Klauser 
62e2b15ec2SNikolas Klauser template <class... _Tp>
639783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_size<tuple<_Tp...> > : public integral_constant<size_t, sizeof...(_Tp)> {};
64e2b15ec2SNikolas Klauser 
65e2b15ec2SNikolas Klauser template <class... _Tp>
669783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS tuple_size<__tuple_types<_Tp...> > : public integral_constant<size_t, sizeof...(_Tp)> {};
674528c44dSNikolas Klauser 
684528c44dSNikolas Klauser #  if _LIBCPP_STD_VER >= 17
694528c44dSNikolas Klauser template <class _Tp>
704528c44dSNikolas Klauser inline constexpr size_t tuple_size_v = tuple_size<_Tp>::value;
714528c44dSNikolas Klauser #  endif
72e2b15ec2SNikolas Klauser 
73e2b15ec2SNikolas Klauser #endif // _LIBCPP_CXX03_LANG
74e2b15ec2SNikolas Klauser 
75e2b15ec2SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
76e2b15ec2SNikolas Klauser 
77e2b15ec2SNikolas Klauser #endif // _LIBCPP___TUPLE_TUPLE_SIZE_H
78