Clementine
set_value_member.hpp
1 //
2 // traits/set_value_member.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2020 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 
11 #ifndef ASIO_TRAITS_SET_VALUE_MEMBER_HPP
12 #define ASIO_TRAITS_SET_VALUE_MEMBER_HPP
13 
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 # pragma once
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17 
18 #include "asio/detail/config.hpp"
19 #include "asio/detail/type_traits.hpp"
20 #include "asio/detail/variadic_templates.hpp"
21 
22 #if defined(ASIO_HAS_DECLTYPE) \
23  && defined(ASIO_HAS_NOEXCEPT) \
24  && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
25 # define ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT 1
26 #endif // defined(ASIO_HAS_DECLTYPE)
27  // && defined(ASIO_HAS_NOEXCEPT)
28  // && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
29 
30 #include "asio/detail/push_options.hpp"
31 
32 namespace asio {
33 namespace traits {
34 
35 template <typename T, typename Vs, typename = void>
37 
38 template <typename T, typename Vs, typename = void>
40 
41 } // namespace traits
42 namespace detail {
43 
45 {
46  ASIO_STATIC_CONSTEXPR(bool, is_valid = false);
47  ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
48 };
49 
50 #if defined(ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
51 
52 template <typename T, typename Vs, typename = void>
54 {
55 };
56 
57 #if defined(ASIO_HAS_VARIADIC_TEMPLATES)
58 
59 template <typename T, typename... Vs>
60 struct set_value_member_trait<T, void(Vs...),
61  typename void_type<
62  decltype(declval<T>().set_value(declval<Vs>()...))
63  >::type>
64 {
65  ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
66 
67  using result_type = decltype(
68  declval<T>().set_value(declval<Vs>()...));
69 
70  ASIO_STATIC_CONSTEXPR(bool, is_noexcept = noexcept(
71  declval<T>().set_value(declval<Vs>()...)));
72 };
73 
74 #else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
75 
76 template <typename T>
77 struct set_value_member_trait<T, void(),
78  typename void_type<
79  decltype(declval<T>().set_value())
80  >::type>
81 {
82  ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
83 
84  using result_type = decltype(declval<T>().set_value());
85 
86  ASIO_STATIC_CONSTEXPR(bool,
87  is_noexcept = noexcept(declval<T>().set_value()));
88 };
89 
90 #define ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF(n) \
91  template <typename T, ASIO_VARIADIC_TPARAMS(n)> \
92  struct set_value_member_trait<T, void(ASIO_VARIADIC_TARGS(n)), \
93  typename void_type< \
94  decltype(declval<T>().set_value(ASIO_VARIADIC_DECLVAL(n))) \
95  >::type> \
96  { \
97  ASIO_STATIC_CONSTEXPR(bool, is_valid = true); \
98  \
99  using result_type = decltype( \
100  declval<T>().set_value(ASIO_VARIADIC_DECLVAL(n))); \
101  \
102  ASIO_STATIC_CONSTEXPR(bool, is_noexcept = noexcept( \
103  declval<T>().set_value(ASIO_VARIADIC_DECLVAL(n)))); \
104  }; \
105 
106 ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF)
107 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF
108 
109 #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
110 
111 #else // defined(ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
112 
113 template <typename T, typename Vs, typename = void>
115 
116 #if defined(ASIO_HAS_VARIADIC_TEMPLATES)
117 
118 template <typename T, typename... Vs>
119 struct set_value_member_trait<T, void(Vs...)> :
120  conditional<
121  is_same<T, typename remove_reference<T>::type>::value
122  && conjunction<is_same<Vs, typename decay<Vs>::type>...>::value,
123  typename conditional<
124  is_same<T, typename add_const<T>::type>::value,
125  no_set_value_member,
126  traits::set_value_member<typename add_const<T>::type, void(Vs...)>
127  >::type,
128  traits::set_value_member<
129  typename remove_reference<T>::type,
130  void(typename decay<Vs>::type...)>
131  >::type
132 {
133 };
134 
135 #else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
136 
137 template <typename T>
138 struct set_value_member_trait<T, void()> :
139  conditional<
140  is_same<T, typename remove_reference<T>::type>::value,
141  typename conditional<
142  is_same<T, typename add_const<T>::type>::value,
143  no_set_value_member,
144  traits::set_value_member<typename add_const<T>::type, void()>
145  >::type,
146  traits::set_value_member<typename remove_reference<T>::type, void()>
147  >::type
148 {
149 };
150 
151 #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME(n) \
152  ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_##n
153 
154 #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_1 \
155  && is_same<T1, typename decay<T1>::type>::value
156 #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_2 \
157  ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_1 \
158  && is_same<T2, typename decay<T2>::type>::value
159 #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_3 \
160  ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_2 \
161  && is_same<T3, typename decay<T3>::type>::value
162 #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_4 \
163  ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_3 \
164  && is_same<T4, typename decay<T4>::type>::value
165 #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_5 \
166  ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_4 \
167  && is_same<T5, typename decay<T5>::type>::value
168 #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_6 \
169  ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_5 \
170  && is_same<T6, typename decay<T6>::type>::value
171 #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_7 \
172  ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_6 \
173  && is_same<T7, typename decay<T7>::type>::value
174 #define ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_8 \
175  ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_7 \
176  && is_same<T8, typename decay<T8>::type>::value
177 
178 #define ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF(n) \
179  template <typename T, ASIO_VARIADIC_TPARAMS(n)> \
180  struct set_value_member_trait<T, void(ASIO_VARIADIC_TARGS(n))> : \
181  conditional< \
182  is_same<T, typename remove_reference<T>::type>::value \
183  ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME(n), \
184  typename conditional< \
185  is_same<T, typename add_const<T>::type>::value, \
186  no_set_value_member, \
187  traits::set_value_member< \
188  typename add_const<T>::type, \
189  void(ASIO_VARIADIC_TARGS(n))> \
190  >::type, \
191  traits::set_value_member< \
192  typename remove_reference<T>::type, \
193  void(ASIO_VARIADIC_DECAY(n))> \
194  >::type \
195  { \
196  }; \
197 
198 ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF)
199 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_TRAIT_DEF
200 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME
201 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_1
202 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_2
203 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_3
204 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_4
205 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_5
206 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_6
207 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_7
208 #undef ASIO_PRIVATE_SET_VALUE_MEMBER_IS_SAME_8
209 
210 #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
211 
212 #endif // defined(ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
213 
214 } // namespace detail
215 namespace traits {
216 
217 template <typename T, typename Vs, typename>
218 struct set_value_member_default :
220 {
221 };
222 
223 template <typename T, typename Vs, typename>
224 struct set_value_member :
225  set_value_member_default<T, Vs>
226 {
227 };
228 
229 } // namespace traits
230 } // namespace asio
231 
232 #include "asio/detail/pop_options.hpp"
233 
234 #endif // ASIO_TRAITS_SET_VALUE_MEMBER_HPP
Definition: set_value_member.hpp:36
Definition: set_value_member.hpp:44
Definition: chrono.h:284
Definition: set_value_member.hpp:114
Definition: set_value_member.hpp:39
Definition: any_io_executor.hpp:28