set_value_member.hpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. //
  2. // traits/set_value_member.hpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. #ifndef ASIO_TRAITS_SET_VALUE_MEMBER_HPP
  11. #define ASIO_TRAITS_SET_VALUE_MEMBER_HPP
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include "asio/detail/config.hpp"
  16. #include "asio/detail/type_traits.hpp"
  17. #include "asio/detail/variadic_templates.hpp"
  18. #if defined(ASIO_HAS_DECLTYPE) \
  19. && defined(ASIO_HAS_NOEXCEPT) \
  20. && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
  21. # define ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT 1
  22. #endif // defined(ASIO_HAS_DECLTYPE)
  23. // && defined(ASIO_HAS_NOEXCEPT)
  24. // && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
  25. #include "asio/detail/push_options.hpp"
  26. namespace asio {
  27. namespace traits {
  28. template <typename T, typename Vs, typename = void>
  29. struct set_value_member_default;
  30. template <typename T, typename Vs, typename = void>
  31. struct set_value_member;
  32. } // namespace traits
  33. namespace detail {
  34. struct no_set_value_member
  35. {
  36. ASIO_STATIC_CONSTEXPR(bool, is_valid = false);
  37. ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
  38. };
  39. #if defined(ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
  40. template <typename T, typename Vs, typename = void>
  41. struct set_value_member_trait : no_set_value_member
  42. {
  43. };
  44. #if defined(ASIO_HAS_VARIADIC_TEMPLATES)
  45. template <typename T, typename... Vs>
  46. struct set_value_member_trait<T, void(Vs...),
  47. typename void_type<
  48. decltype(declval<T>().set_value(declval<Vs>()...))
  49. >::type>
  50. {
  51. ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
  52. using result_type = decltype(
  53. declval<T>().set_value(declval<Vs>()...));
  54. ASIO_STATIC_CONSTEXPR(bool, is_noexcept = noexcept(
  55. declval<T>().set_value(declval<Vs>()...)));
  56. };
  57. #else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
  58. template <typename T>
  59. struct set_value_member_trait<T, void(),
  60. typename void_type<
  61. decltype(declval<T>().set_value())
  62. >::type>
  63. {
  64. ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
  65. using result_type = decltype(declval<T>().set_value());
  66. ASIO_STATIC_CONSTEXPR(bool,
  67. is_noexcept = noexcept(declval<T>().set_value()));
  68. };
  69. #define ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF(n) \
  70. template <typename T, ASIO_VARIADIC_TPARAMS(n)> \
  71. struct set_value_member_trait<T, void(ASIO_VARIADIC_TARGS(n)), \
  72. typename void_type< \
  73. decltype(declval<T>().set_value(ASIO_VARIADIC_DECLVAL(n))) \
  74. >::type> \
  75. { \
  76. ASIO_STATIC_CONSTEXPR(bool, is_valid = true); \
  77. \
  78. using result_type = decltype( \
  79. declval<T>().set_value(ASIO_VARIADIC_DECLVAL(n))); \
  80. \
  81. ASIO_STATIC_CONSTEXPR(bool, is_noexcept = noexcept( \
  82. declval<T>().set_value(ASIO_VARIADIC_DECLVAL(n)))); \
  83. }; \
  84. /**/
  85. ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF)
  86. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF
  87. #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
  88. #else // defined(ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
  89. template <typename T, typename Vs, typename = void>
  90. struct set_value_member_trait;
  91. #if defined(ASIO_HAS_VARIADIC_TEMPLATES)
  92. template <typename T, typename... Vs>
  93. struct set_value_member_trait<T, void(Vs...)> :
  94. conditional<
  95. is_same<T, typename remove_reference<T>::type>::value
  96. && conjunction<is_same<Vs, typename decay<Vs>::type>...>::value,
  97. typename conditional<
  98. is_same<T, typename add_const<T>::type>::value,
  99. no_set_value_member,
  100. traits::set_value_member<typename add_const<T>::type, void(Vs...)>
  101. >::type,
  102. traits::set_value_member<
  103. typename remove_reference<T>::type,
  104. void(typename decay<Vs>::type...)>
  105. >::type
  106. {
  107. };
  108. #else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
  109. template <typename T>
  110. struct set_value_member_trait<T, void()> :
  111. conditional<
  112. is_same<T, typename remove_reference<T>::type>::value,
  113. typename conditional<
  114. is_same<T, typename add_const<T>::type>::value,
  115. no_set_value_member,
  116. traits::set_value_member<typename add_const<T>::type, void()>
  117. >::type,
  118. traits::set_value_member<typename remove_reference<T>::type, void()>
  119. >::type
  120. {
  121. };
  122. #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME(n) \
  123. ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_##n
  124. #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_1 \
  125. && is_same<T1, typename decay<T1>::type>::value
  126. #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_2 \
  127. ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_1 \
  128. && is_same<T2, typename decay<T2>::type>::value
  129. #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_3 \
  130. ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_2 \
  131. && is_same<T3, typename decay<T3>::type>::value
  132. #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_4 \
  133. ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_3 \
  134. && is_same<T4, typename decay<T4>::type>::value
  135. #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_5 \
  136. ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_4 \
  137. && is_same<T5, typename decay<T5>::type>::value
  138. #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_6 \
  139. ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_5 \
  140. && is_same<T6, typename decay<T6>::type>::value
  141. #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_7 \
  142. ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_6 \
  143. && is_same<T7, typename decay<T7>::type>::value
  144. #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_8 \
  145. ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_7 \
  146. && is_same<T8, typename decay<T8>::type>::value
  147. #define ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF(n) \
  148. template <typename T, ASIO_VARIADIC_TPARAMS(n)> \
  149. struct set_value_member_trait<T, void(ASIO_VARIADIC_TARGS(n))> : \
  150. conditional< \
  151. is_same<T, typename remove_reference<T>::type>::value \
  152. ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME(n), \
  153. typename conditional< \
  154. is_same<T, typename add_const<T>::type>::value, \
  155. no_set_value_member, \
  156. traits::set_value_member< \
  157. typename add_const<T>::type, \
  158. void(ASIO_VARIADIC_TARGS(n))> \
  159. >::type, \
  160. traits::set_value_member< \
  161. typename remove_reference<T>::type, \
  162. void(ASIO_VARIADIC_DECAY(n))> \
  163. >::type \
  164. { \
  165. }; \
  166. /**/
  167. ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF)
  168. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF
  169. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME
  170. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_1
  171. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_2
  172. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_3
  173. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_4
  174. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_5
  175. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_6
  176. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_7
  177. #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_8
  178. #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
  179. #endif // defined(ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
  180. } // namespace detail
  181. namespace traits {
  182. template <typename T, typename Vs, typename>
  183. struct set_value_member_default :
  184. detail::set_value_member_trait<T, Vs>
  185. {
  186. };
  187. template <typename T, typename Vs, typename>
  188. struct set_value_member :
  189. set_value_member_default<T, Vs>
  190. {
  191. };
  192. } // namespace traits
  193. } // namespace asio
  194. #include "asio/detail/pop_options.hpp"
  195. #endif // ASIO_TRAITS_SET_VALUE_MEMBER_HPP