1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef _LIBCPP___TUPLE_TUPLE_SIZE_H 10 #define _LIBCPP___TUPLE_TUPLE_SIZE_H 11 12 #include <__config> 13 #include <__cstddef/size_t.h> 14 #include <__fwd/tuple.h> 15 #include <__tuple/tuple_types.h> 16 #include <__type_traits/enable_if.h> 17 #include <__type_traits/integral_constant.h> 18 #include <__type_traits/is_const.h> 19 #include <__type_traits/is_volatile.h> 20 21 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 22 # pragma GCC system_header 23 #endif 24 25 _LIBCPP_BEGIN_NAMESPACE_STD 26 27 template <class _Tp> 28 struct _LIBCPP_TEMPLATE_VIS tuple_size; 29 30 #if !defined(_LIBCPP_CXX03_LANG) 31 template <class _Tp, class...> 32 using __enable_if_tuple_size_imp _LIBCPP_NODEBUG = _Tp; 33 34 template <class _Tp> 35 struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< const _Tp, 36 __enable_if_t<!is_volatile<_Tp>::value>, 37 integral_constant<size_t, sizeof(tuple_size<_Tp>)>>> 38 : public integral_constant<size_t, tuple_size<_Tp>::value> {}; 39 40 template <class _Tp> 41 struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< volatile _Tp, 42 __enable_if_t<!is_const<_Tp>::value>, 43 integral_constant<size_t, sizeof(tuple_size<_Tp>)>>> 44 : public integral_constant<size_t, tuple_size<_Tp>::value> {}; 45 46 template <class _Tp> 47 struct _LIBCPP_TEMPLATE_VIS 48 tuple_size<__enable_if_tuple_size_imp<const volatile _Tp, integral_constant<size_t, sizeof(tuple_size<_Tp>)>>> 49 : public integral_constant<size_t, tuple_size<_Tp>::value> {}; 50 51 #else 52 template <class _Tp> 53 struct _LIBCPP_TEMPLATE_VIS tuple_size<const _Tp> : public tuple_size<_Tp> {}; 54 template <class _Tp> 55 struct _LIBCPP_TEMPLATE_VIS tuple_size<volatile _Tp> : public tuple_size<_Tp> {}; 56 template <class _Tp> 57 struct _LIBCPP_TEMPLATE_VIS tuple_size<const volatile _Tp> : public tuple_size<_Tp> {}; 58 #endif 59 60 #ifndef _LIBCPP_CXX03_LANG 61 62 template <class... _Tp> 63 struct _LIBCPP_TEMPLATE_VIS tuple_size<tuple<_Tp...> > : public integral_constant<size_t, sizeof...(_Tp)> {}; 64 65 template <class... _Tp> 66 struct _LIBCPP_TEMPLATE_VIS tuple_size<__tuple_types<_Tp...> > : public integral_constant<size_t, sizeof...(_Tp)> {}; 67 68 # if _LIBCPP_STD_VER >= 17 69 template <class _Tp> 70 inline constexpr size_t tuple_size_v = tuple_size<_Tp>::value; 71 # endif 72 73 #endif // _LIBCPP_CXX03_LANG 74 75 _LIBCPP_END_NAMESPACE_STD 76 77 #endif // _LIBCPP___TUPLE_TUPLE_SIZE_H 78