Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-03 08:14:05

0001 //===----------------------------------------------------------------------===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 
0009 #ifndef _LIBCPP___TUPLE_SFINAE_HELPERS_H
0010 #define _LIBCPP___TUPLE_SFINAE_HELPERS_H
0011 
0012 #include <__config>
0013 #include <__cstddef/size_t.h>
0014 #include <__fwd/tuple.h>
0015 #include <__tuple/make_tuple_types.h>
0016 #include <__tuple/tuple_element.h>
0017 #include <__tuple/tuple_like_ext.h>
0018 #include <__tuple/tuple_size.h>
0019 #include <__tuple/tuple_types.h>
0020 #include <__type_traits/conjunction.h>
0021 #include <__type_traits/enable_if.h>
0022 #include <__type_traits/integral_constant.h>
0023 #include <__type_traits/is_constructible.h>
0024 #include <__type_traits/is_same.h>
0025 #include <__type_traits/remove_cvref.h>
0026 #include <__type_traits/remove_reference.h>
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 _LIBCPP_NODEBUG = decltype(__do_test<is_constructible>(_ToArgs{}, _FromArgs{}));
0045 };
0046 
0047 // __tuple_constructible
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   using type _LIBCPP_NODEBUG = typename tuple_element<_Ip, __tuple_types<_Tp...> >::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 // !defined(_LIBCPP_CXX03_LANG)
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 // _LIBCPP_STD_VER >= 17
0139 
0140 _LIBCPP_END_NAMESPACE_STD
0141 
0142 #endif // _LIBCPP___TUPLE_SFINAE_HELPERS_H