2 // traits/set_value_member.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~~
5 // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
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)
11 #ifndef BOOST_ASIO_TRAITS_SET_VALUE_MEMBER_HPP
12 #define BOOST_ASIO_TRAITS_SET_VALUE_MEMBER_HPP
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18 #include <boost/asio/detail/config.hpp>
19 #include <boost/asio/detail/type_traits.hpp>
20 #include <boost/asio/detail/variadic_templates.hpp>
22 #if defined(BOOST_ASIO_HAS_DECLTYPE) \
23 && defined(BOOST_ASIO_HAS_NOEXCEPT) \
24 && defined(BOOST_ASIO_HAS_WORKING_EXPRESSION_SFINAE)
25 # define BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT 1
26 #endif // defined(BOOST_ASIO_HAS_DECLTYPE)
27 // && defined(BOOST_ASIO_HAS_NOEXCEPT)
28 // && defined(BOOST_ASIO_HAS_WORKING_EXPRESSION_SFINAE)
30 #include <boost/asio/detail/push_options.hpp>
36 template <typename T, typename Vs, typename = void>
37 struct set_value_member_default;
39 template <typename T, typename Vs, typename = void>
40 struct set_value_member;
45 struct no_set_value_member
47 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = false);
48 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
51 #if defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
53 template <typename T, typename Vs, typename = void>
54 struct set_value_member_trait : no_set_value_member
58 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
60 template <typename T, typename... Vs>
61 struct set_value_member_trait<T, void(Vs...),
63 decltype(declval<T>().set_value(declval<Vs>()...))
66 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
68 using result_type = decltype(
69 declval<T>().set_value(declval<Vs>()...));
71 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = noexcept(
72 declval<T>().set_value(declval<Vs>()...)));
75 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
78 struct set_value_member_trait<T, void(),
80 decltype(declval<T>().set_value())
83 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
85 using result_type = decltype(declval<T>().set_value());
87 BOOST_ASIO_STATIC_CONSTEXPR(bool,
88 is_noexcept = noexcept(declval<T>().set_value()));
91 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF(n) \
92 template <typename T, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
93 struct set_value_member_trait<T, void(BOOST_ASIO_VARIADIC_TARGS(n)), \
95 decltype(declval<T>().set_value(BOOST_ASIO_VARIADIC_DECLVAL(n))) \
98 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true); \
100 using result_type = decltype( \
101 declval<T>().set_value(BOOST_ASIO_VARIADIC_DECLVAL(n))); \
103 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = noexcept( \
104 declval<T>().set_value(BOOST_ASIO_VARIADIC_DECLVAL(n)))); \
107 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF)
108 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF
110 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
112 #else // defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
114 template <typename T, typename Vs, typename = void>
115 struct set_value_member_trait;
117 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
119 template <typename T, typename... Vs>
120 struct set_value_member_trait<T, void(Vs...)> :
122 is_same<T, typename remove_reference<T>::type>::value
123 && conjunction<is_same<Vs, typename decay<Vs>::type>...>::value,
124 typename conditional<
125 is_same<T, typename add_const<T>::type>::value,
127 traits::set_value_member<typename add_const<T>::type, void(Vs...)>
129 traits::set_value_member<
130 typename remove_reference<T>::type,
131 void(typename decay<Vs>::type...)>
136 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
138 template <typename T>
139 struct set_value_member_trait<T, void()> :
141 is_same<T, typename remove_reference<T>::type>::value,
142 typename conditional<
143 is_same<T, typename add_const<T>::type>::value,
145 traits::set_value_member<typename add_const<T>::type, void()>
147 traits::set_value_member<typename remove_reference<T>::type, void()>
152 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME(n) \
153 BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_##n
155 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_1 \
156 && is_same<T1, typename decay<T1>::type>::value
157 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_2 \
158 BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_1 \
159 && is_same<T2, typename decay<T2>::type>::value
160 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_3 \
161 BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_2 \
162 && is_same<T3, typename decay<T3>::type>::value
163 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_4 \
164 BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_3 \
165 && is_same<T4, typename decay<T4>::type>::value
166 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_5 \
167 BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_4 \
168 && is_same<T5, typename decay<T5>::type>::value
169 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_6 \
170 BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_5 \
171 && is_same<T6, typename decay<T6>::type>::value
172 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_7 \
173 BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_6 \
174 && is_same<T7, typename decay<T7>::type>::value
175 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_8 \
176 BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_7 \
177 && is_same<T8, typename decay<T8>::type>::value
179 #define BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF(n) \
180 template <typename T, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
181 struct set_value_member_trait<T, void(BOOST_ASIO_VARIADIC_TARGS(n))> : \
183 is_same<T, typename remove_reference<T>::type>::value \
184 BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME(n), \
185 typename conditional< \
186 is_same<T, typename add_const<T>::type>::value, \
187 no_set_value_member, \
188 traits::set_value_member< \
189 typename add_const<T>::type, \
190 void(BOOST_ASIO_VARIADIC_TARGS(n))> \
192 traits::set_value_member< \
193 typename remove_reference<T>::type, \
194 void(BOOST_ASIO_VARIADIC_DECAY(n))> \
199 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF)
200 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF
201 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME
202 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_1
203 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_2
204 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_3
205 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_4
206 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_5
207 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_6
208 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_7
209 #undef BOOST_ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_8
211 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
213 #endif // defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
215 } // namespace detail
218 template <typename T, typename Vs, typename>
219 struct set_value_member_default :
220 detail::set_value_member_trait<T, Vs>
224 template <typename T, typename Vs, typename>
225 struct set_value_member :
226 set_value_member_default<T, Vs>
230 } // namespace traits
234 #include <boost/asio/detail/pop_options.hpp>
236 #endif // BOOST_ASIO_TRAITS_SET_VALUE_MEMBER_HPP