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