File indexing completed on 2026-05-03 08:13:43
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _LIBCPP___CXX03___TUPLE_SFINAE_HELPERS_H
0010 #define _LIBCPP___CXX03___TUPLE_SFINAE_HELPERS_H
0011
0012 #include <__cxx03/__config>
0013 #include <__cxx03/__fwd/tuple.h>
0014 #include <__cxx03/__tuple/make_tuple_types.h>
0015 #include <__cxx03/__tuple/tuple_element.h>
0016 #include <__cxx03/__tuple/tuple_like_ext.h>
0017 #include <__cxx03/__tuple/tuple_size.h>
0018 #include <__cxx03/__tuple/tuple_types.h>
0019 #include <__cxx03/__type_traits/conjunction.h>
0020 #include <__cxx03/__type_traits/enable_if.h>
0021 #include <__cxx03/__type_traits/integral_constant.h>
0022 #include <__cxx03/__type_traits/is_constructible.h>
0023 #include <__cxx03/__type_traits/is_same.h>
0024 #include <__cxx03/__type_traits/remove_cvref.h>
0025 #include <__cxx03/__type_traits/remove_reference.h>
0026 #include <__cxx03/cstddef>
0027
0028 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0029 # pragma GCC system_header
0030 #endif
0031
0032 _LIBCPP_BEGIN_NAMESPACE_STD
0033
0034 #ifndef _LIBCPP_CXX03_LANG
0035
0036 struct __tuple_sfinae_base {
0037 template <template <class, class...> class _Trait, class... _LArgs, class... _RArgs>
0038 static auto __do_test(__tuple_types<_LArgs...>,
0039 __tuple_types<_RArgs...>) -> __all<__enable_if_t<_Trait<_LArgs, _RArgs>::value, bool>{true}...>;
0040 template <template <class...> class>
0041 static auto __do_test(...) -> false_type;
0042
0043 template <class _FromArgs, class _ToArgs>
0044 using __constructible = decltype(__do_test<is_constructible>(_ToArgs{}, _FromArgs{}));
0045 };
0046
0047
0048
0049 template <class _Tp,
0050 class _Up,
0051 bool = __tuple_like_ext<__libcpp_remove_reference_t<_Tp> >::value,
0052 bool = __tuple_like_ext<_Up>::value>
0053 struct __tuple_constructible : public false_type {};
0054
0055 template <class _Tp, class _Up>
0056 struct __tuple_constructible<_Tp, _Up, true, true>
0057 : public __tuple_sfinae_base::__constructible< typename __make_tuple_types<_Tp>::type,
0058 typename __make_tuple_types<_Up>::type > {};
0059
0060 template <size_t _Ip, class... _Tp>
0061 struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, tuple<_Tp...> > {
0062 typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, __tuple_types<_Tp...> >::type type;
0063 };
0064
0065 struct _LIBCPP_EXPORTED_FROM_ABI __check_tuple_constructor_fail {
0066 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_explicit_default() { return false; }
0067 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_implicit_default() { return false; }
0068 template <class...>
0069 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_explicit() {
0070 return false;
0071 }
0072 template <class...>
0073 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_implicit() {
0074 return false;
0075 }
0076 template <class...>
0077 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_assign() {
0078 return false;
0079 }
0080 };
0081 #endif
0082
0083 #if _LIBCPP_STD_VER >= 17
0084
0085 template <bool _CanCopy, bool _CanMove>
0086 struct __sfinae_ctor_base {};
0087 template <>
0088 struct __sfinae_ctor_base<false, false> {
0089 __sfinae_ctor_base() = default;
0090 __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
0091 __sfinae_ctor_base(__sfinae_ctor_base&&) = delete;
0092 __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
0093 __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
0094 };
0095 template <>
0096 struct __sfinae_ctor_base<true, false> {
0097 __sfinae_ctor_base() = default;
0098 __sfinae_ctor_base(__sfinae_ctor_base const&) = default;
0099 __sfinae_ctor_base(__sfinae_ctor_base&&) = delete;
0100 __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
0101 __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
0102 };
0103 template <>
0104 struct __sfinae_ctor_base<false, true> {
0105 __sfinae_ctor_base() = default;
0106 __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
0107 __sfinae_ctor_base(__sfinae_ctor_base&&) = default;
0108 __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
0109 __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
0110 };
0111
0112 template <bool _CanCopy, bool _CanMove>
0113 struct __sfinae_assign_base {};
0114 template <>
0115 struct __sfinae_assign_base<false, false> {
0116 __sfinae_assign_base() = default;
0117 __sfinae_assign_base(__sfinae_assign_base const&) = default;
0118 __sfinae_assign_base(__sfinae_assign_base&&) = default;
0119 __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
0120 __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
0121 };
0122 template <>
0123 struct __sfinae_assign_base<true, false> {
0124 __sfinae_assign_base() = default;
0125 __sfinae_assign_base(__sfinae_assign_base const&) = default;
0126 __sfinae_assign_base(__sfinae_assign_base&&) = default;
0127 __sfinae_assign_base& operator=(__sfinae_assign_base const&) = default;
0128 __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
0129 };
0130 template <>
0131 struct __sfinae_assign_base<false, true> {
0132 __sfinae_assign_base() = default;
0133 __sfinae_assign_base(__sfinae_assign_base const&) = default;
0134 __sfinae_assign_base(__sfinae_assign_base&&) = default;
0135 __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
0136 __sfinae_assign_base& operator=(__sfinae_assign_base&&) = default;
0137 };
0138 #endif
0139
0140 _LIBCPP_END_NAMESPACE_STD
0141
0142 #endif