sfinae_helpers.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. #ifndef _LIBCPP___TUPLE_SFINAE_HELPERS_H
  9. #define _LIBCPP___TUPLE_SFINAE_HELPERS_H
  10. #include <__config>
  11. #include <__fwd/tuple.h>
  12. #include <__tuple/make_tuple_types.h>
  13. #include <__tuple/tuple_element.h>
  14. #include <__tuple/tuple_like_ext.h>
  15. #include <__tuple/tuple_size.h>
  16. #include <__tuple/tuple_types.h>
  17. #include <__type_traits/enable_if.h>
  18. #include <__type_traits/integral_constant.h>
  19. #include <__type_traits/is_constructible.h>
  20. #include <__type_traits/is_same.h>
  21. #include <__type_traits/remove_cvref.h>
  22. #include <__type_traits/remove_reference.h>
  23. #include <cstddef>
  24. #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
  25. # pragma GCC system_header
  26. #endif
  27. _LIBCPP_BEGIN_NAMESPACE_STD
  28. #ifndef _LIBCPP_CXX03_LANG
  29. template <bool... _Preds>
  30. struct __all_dummy;
  31. template <bool... _Pred>
  32. struct __all : _IsSame<__all_dummy<_Pred...>, __all_dummy<((void)_Pred, true)...>> {};
  33. struct __tuple_sfinae_base {
  34. template <template <class, class...> class _Trait, class... _LArgs, class... _RArgs>
  35. static auto __do_test(__tuple_types<_LArgs...>, __tuple_types<_RArgs...>)
  36. -> __all<__enable_if_t<_Trait<_LArgs, _RArgs>::value, bool>{true}...>;
  37. template <template <class...> class>
  38. static auto __do_test(...) -> false_type;
  39. template <class _FromArgs, class _ToArgs>
  40. using __constructible = decltype(__do_test<is_constructible>(declval<_ToArgs>(), declval<_FromArgs>()));
  41. };
  42. // __tuple_constructible
  43. template <class _Tp,
  44. class _Up,
  45. bool = __tuple_like_ext<__libcpp_remove_reference_t<_Tp> >::value,
  46. bool = __tuple_like_ext<_Up>::value,
  47. class = void>
  48. struct __tuple_constructible : public false_type {};
  49. template <class _Tp, class _Up>
  50. struct __tuple_constructible<
  51. _Tp,
  52. _Up,
  53. true,
  54. true,
  55. typename enable_if<(tuple_size<typename remove_reference<_Tp>::type>::value == tuple_size<_Up>::value)>::type>
  56. : public __tuple_sfinae_base::__constructible< typename __make_tuple_types<_Tp>::type,
  57. typename __make_tuple_types<_Up>::type > {};
  58. template <size_t _Ip, class... _Tp>
  59. struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, tuple<_Tp...> > {
  60. typedef _LIBCPP_NODEBUG typename tuple_element<_Ip, __tuple_types<_Tp...> >::type type;
  61. };
  62. struct _LIBCPP_EXPORTED_FROM_ABI __check_tuple_constructor_fail {
  63. static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_explicit_default() { return false; }
  64. static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_implicit_default() { return false; }
  65. template <class...>
  66. static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_explicit() {
  67. return false;
  68. }
  69. template <class...>
  70. static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_implicit() {
  71. return false;
  72. }
  73. template <class...>
  74. static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_assign() {
  75. return false;
  76. }
  77. };
  78. #endif // !defined(_LIBCPP_CXX03_LANG)
  79. #if _LIBCPP_STD_VER >= 17
  80. template <bool _CanCopy, bool _CanMove>
  81. struct __sfinae_ctor_base {};
  82. template <>
  83. struct __sfinae_ctor_base<false, false> {
  84. __sfinae_ctor_base() = default;
  85. __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
  86. __sfinae_ctor_base(__sfinae_ctor_base&&) = delete;
  87. __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
  88. __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
  89. };
  90. template <>
  91. struct __sfinae_ctor_base<true, false> {
  92. __sfinae_ctor_base() = default;
  93. __sfinae_ctor_base(__sfinae_ctor_base const&) = default;
  94. __sfinae_ctor_base(__sfinae_ctor_base&&) = delete;
  95. __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
  96. __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
  97. };
  98. template <>
  99. struct __sfinae_ctor_base<false, true> {
  100. __sfinae_ctor_base() = default;
  101. __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
  102. __sfinae_ctor_base(__sfinae_ctor_base&&) = default;
  103. __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
  104. __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
  105. };
  106. template <bool _CanCopy, bool _CanMove>
  107. struct __sfinae_assign_base {};
  108. template <>
  109. struct __sfinae_assign_base<false, false> {
  110. __sfinae_assign_base() = default;
  111. __sfinae_assign_base(__sfinae_assign_base const&) = default;
  112. __sfinae_assign_base(__sfinae_assign_base&&) = default;
  113. __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
  114. __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
  115. };
  116. template <>
  117. struct __sfinae_assign_base<true, false> {
  118. __sfinae_assign_base() = default;
  119. __sfinae_assign_base(__sfinae_assign_base const&) = default;
  120. __sfinae_assign_base(__sfinae_assign_base&&) = default;
  121. __sfinae_assign_base& operator=(__sfinae_assign_base const&) = default;
  122. __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
  123. };
  124. template <>
  125. struct __sfinae_assign_base<false, true> {
  126. __sfinae_assign_base() = default;
  127. __sfinae_assign_base(__sfinae_assign_base const&) = default;
  128. __sfinae_assign_base(__sfinae_assign_base&&) = default;
  129. __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
  130. __sfinae_assign_base& operator=(__sfinae_assign_base&&) = default;
  131. };
  132. #endif // _LIBCPP_STD_VER >= 17
  133. _LIBCPP_END_NAMESPACE_STD
  134. #endif // _LIBCPP___TUPLE_SFINAE_HELPERS_H