1 //
2 // set_value.cpp
3 // ~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2021 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 // Disable autolinking for unit tests.
12 #if !defined(BOOST_ALL_NO_LIB)
13 #define BOOST_ALL_NO_LIB 1
14 #endif // !defined(BOOST_ALL_NO_LIB)
15 
16 // Test that header file is self-contained.
17 #include <boost/asio/execution/set_value.hpp>
18 
19 #include <string>
20 #include "../unit_test.hpp"
21 
22 namespace exec = boost::asio::execution;
23 
24 static int call_count = 0;
25 
26 struct no_set_value
27 {
28 };
29 
30 struct const_member_set_value_0
31 {
set_valueconst_member_set_value_032   void set_value() const
33   {
34     ++call_count;
35   }
36 };
37 
38 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
39 
40 namespace boost {
41 namespace asio {
42 namespace traits {
43 
44 template <>
45 struct set_value_member<const const_member_set_value_0, void()>
46 {
47   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
48   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
49   typedef void result_type;
50 };
51 
52 } // namespace traits
53 } // namespace asio
54 } // namespace boost
55 
56 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
57 
58 struct const_member_set_value_1
59 {
60   template <typename V1>
set_valueconst_member_set_value_161   void set_value(BOOST_ASIO_MOVE_ARG(V1) v1) const
62   {
63     typename boost::asio::decay<V1>::type tmp(BOOST_ASIO_MOVE_CAST(V1)(v1));
64     (void)tmp;
65     ++call_count;
66   }
67 };
68 
69 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
70 
71 namespace boost {
72 namespace asio {
73 namespace traits {
74 
75 template <typename V1>
76 struct set_value_member<const const_member_set_value_1, void(V1)>
77 {
78   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
79   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
80   typedef void result_type;
81 };
82 
83 } // namespace traits
84 } // namespace asio
85 } // namespace boost
86 
87 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
88 
89 struct const_member_set_value_2
90 {
91   template <typename V1, typename V2>
set_valueconst_member_set_value_292   void set_value(BOOST_ASIO_MOVE_ARG(V1) v1, BOOST_ASIO_MOVE_ARG(V2) v2) const
93   {
94     typename boost::asio::decay<V1>::type tmp1(BOOST_ASIO_MOVE_CAST(V1)(v1));
95     (void)tmp1;
96     typename boost::asio::decay<V2>::type tmp2(BOOST_ASIO_MOVE_CAST(V2)(v2));
97     (void)tmp2;
98     ++call_count;
99   }
100 };
101 
102 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
103 
104 namespace boost {
105 namespace asio {
106 namespace traits {
107 
108 template <typename V1, typename V2>
109 struct set_value_member<const const_member_set_value_2, void(V1, V2)>
110 {
111   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
112   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
113   typedef void result_type;
114 };
115 
116 } // namespace traits
117 } // namespace asio
118 } // namespace boost
119 
120 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
121 
122 struct free_set_value_const_receiver_0
123 {
set_value(const free_set_value_const_receiver_0 &)124   friend void set_value(const free_set_value_const_receiver_0&)
125   {
126     ++call_count;
127   }
128 };
129 
130 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
131 
132 namespace boost {
133 namespace asio {
134 namespace traits {
135 
136 template <>
137 struct set_value_free<const free_set_value_const_receiver_0, void()>
138 {
139   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
140   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
141   typedef void result_type;
142 };
143 
144 } // namespace traits
145 } // namespace asio
146 } // namespace boost
147 
148 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
149 
150 struct free_set_value_const_receiver_1
151 {
152   template <typename V1>
set_value(const free_set_value_const_receiver_1 &,BOOST_ASIO_MOVE_ARG (V1)v1)153   friend void set_value(const free_set_value_const_receiver_1&,
154       BOOST_ASIO_MOVE_ARG(V1) v1)
155   {
156     typename boost::asio::decay<V1>::type tmp(BOOST_ASIO_MOVE_CAST(V1)(v1));
157     (void)tmp;
158     ++call_count;
159   }
160 };
161 
162 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
163 
164 namespace boost {
165 namespace asio {
166 namespace traits {
167 
168 template <typename V1>
169 struct set_value_free<const free_set_value_const_receiver_1, void(V1)>
170 {
171   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
172   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
173   typedef void result_type;
174 };
175 
176 } // namespace traits
177 } // namespace asio
178 } // namespace boost
179 
180 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
181 
182 struct free_set_value_const_receiver_2
183 {
184   template <typename V1, typename V2>
set_value(const free_set_value_const_receiver_2 &,BOOST_ASIO_MOVE_ARG (V1)v1,BOOST_ASIO_MOVE_ARG (V2)v2)185   friend void set_value(const free_set_value_const_receiver_2&,
186       BOOST_ASIO_MOVE_ARG(V1) v1, BOOST_ASIO_MOVE_ARG(V2) v2)
187   {
188     typename boost::asio::decay<V1>::type tmp1(BOOST_ASIO_MOVE_CAST(V1)(v1));
189     (void)tmp1;
190     typename boost::asio::decay<V2>::type tmp2(BOOST_ASIO_MOVE_CAST(V2)(v2));
191     (void)tmp2;
192     ++call_count;
193   }
194 };
195 
196 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
197 
198 namespace boost {
199 namespace asio {
200 namespace traits {
201 
202 template <typename V1, typename V2>
203 struct set_value_free<const free_set_value_const_receiver_2, void(V1, V2)>
204 {
205   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
206   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
207   typedef void result_type;
208 };
209 
210 } // namespace traits
211 } // namespace asio
212 } // namespace boost
213 
214 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
215 
216 struct non_const_member_set_value_0
217 {
set_valuenon_const_member_set_value_0218   void set_value()
219   {
220     ++call_count;
221   }
222 };
223 
224 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
225 
226 namespace boost {
227 namespace asio {
228 namespace traits {
229 
230 template <>
231 struct set_value_member<non_const_member_set_value_0, void()>
232 {
233   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
234   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
235   typedef void result_type;
236 };
237 
238 } // namespace traits
239 } // namespace asio
240 } // namespace boost
241 
242 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
243 
244 struct non_const_member_set_value_1
245 {
246   template <typename V1>
set_valuenon_const_member_set_value_1247   void set_value(BOOST_ASIO_MOVE_ARG(V1) v1)
248   {
249     typename boost::asio::decay<V1>::type tmp(BOOST_ASIO_MOVE_CAST(V1)(v1));
250     (void)tmp;
251     ++call_count;
252   }
253 };
254 
255 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
256 
257 namespace boost {
258 namespace asio {
259 namespace traits {
260 
261 template <typename V1>
262 struct set_value_member<non_const_member_set_value_1, void(V1)>
263 {
264   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
265   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
266   typedef void result_type;
267 };
268 
269 } // namespace traits
270 } // namespace asio
271 } // namespace boost
272 
273 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
274 
275 struct non_const_member_set_value_2
276 {
277   template <typename V1, typename V2>
set_valuenon_const_member_set_value_2278   void set_value(BOOST_ASIO_MOVE_ARG(V1) v1, BOOST_ASIO_MOVE_ARG(V2) v2)
279   {
280     typename boost::asio::decay<V1>::type tmp1(BOOST_ASIO_MOVE_CAST(V1)(v1));
281     (void)tmp1;
282     typename boost::asio::decay<V2>::type tmp2(BOOST_ASIO_MOVE_CAST(V2)(v2));
283     (void)tmp2;
284     ++call_count;
285   }
286 };
287 
288 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
289 
290 namespace boost {
291 namespace asio {
292 namespace traits {
293 
294 template <typename V1, typename V2>
295 struct set_value_member<non_const_member_set_value_2, void(V1, V2)>
296 {
297   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
298   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
299   typedef void result_type;
300 };
301 
302 } // namespace traits
303 } // namespace asio
304 } // namespace boost
305 
306 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
307 
308 struct free_set_value_non_const_receiver_0
309 {
set_value(free_set_value_non_const_receiver_0 &)310   friend void set_value(free_set_value_non_const_receiver_0&)
311   {
312     ++call_count;
313   }
314 };
315 
316 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
317 
318 namespace boost {
319 namespace asio {
320 namespace traits {
321 
322 template <>
323 struct set_value_free<free_set_value_non_const_receiver_0, void()>
324 {
325   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
326   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
327   typedef void result_type;
328 };
329 
330 } // namespace traits
331 } // namespace asio
332 } // namespace boost
333 
334 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
335 
336 struct free_set_value_non_const_receiver_1
337 {
338   template <typename V1>
set_value(free_set_value_non_const_receiver_1 &,BOOST_ASIO_MOVE_ARG (V1)v1)339   friend void set_value(free_set_value_non_const_receiver_1&,
340       BOOST_ASIO_MOVE_ARG(V1) v1)
341   {
342     typename boost::asio::decay<V1>::type tmp(BOOST_ASIO_MOVE_CAST(V1)(v1));
343     (void)tmp;
344     ++call_count;
345   }
346 };
347 
348 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
349 
350 namespace boost {
351 namespace asio {
352 namespace traits {
353 
354 template <typename V1>
355 struct set_value_free<free_set_value_non_const_receiver_1, void(V1)>
356 {
357   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
358   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
359   typedef void result_type;
360 };
361 
362 } // namespace traits
363 } // namespace asio
364 } // namespace boost
365 
366 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
367 
368 struct free_set_value_non_const_receiver_2
369 {
370   template <typename V1, typename V2>
set_value(free_set_value_non_const_receiver_2 &,BOOST_ASIO_MOVE_ARG (V1)v1,BOOST_ASIO_MOVE_ARG (V2)v2)371   friend void set_value(free_set_value_non_const_receiver_2&,
372       BOOST_ASIO_MOVE_ARG(V1) v1, BOOST_ASIO_MOVE_ARG(V2) v2)
373   {
374     typename boost::asio::decay<V1>::type tmp1(BOOST_ASIO_MOVE_CAST(V1)(v1));
375     (void)tmp1;
376     typename boost::asio::decay<V2>::type tmp2(BOOST_ASIO_MOVE_CAST(V2)(v2));
377     (void)tmp2;
378     ++call_count;
379   }
380 };
381 
382 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
383 
384 namespace boost {
385 namespace asio {
386 namespace traits {
387 
388 template <typename V1, typename V2>
389 struct set_value_free<free_set_value_non_const_receiver_2, void(V1, V2)>
390 {
391   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
392   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
393   typedef void result_type;
394 };
395 
396 } // namespace traits
397 } // namespace asio
398 } // namespace boost
399 
400 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
401 
test_can_set_value()402 void test_can_set_value()
403 {
404   BOOST_ASIO_CONSTEXPR bool b1 = exec::can_set_value<
405       no_set_value&>::value;
406   BOOST_ASIO_CHECK(b1 == false);
407 
408   BOOST_ASIO_CONSTEXPR bool b2 = exec::can_set_value<
409       const no_set_value&>::value;
410   BOOST_ASIO_CHECK(b2 == false);
411 
412   BOOST_ASIO_CONSTEXPR bool b3 = exec::can_set_value<
413       no_set_value&, int>::value;
414   BOOST_ASIO_CHECK(b3 == false);
415 
416   BOOST_ASIO_CONSTEXPR bool b4 = exec::can_set_value<
417       const no_set_value&, int>::value;
418   BOOST_ASIO_CHECK(b4 == false);
419 
420   BOOST_ASIO_CONSTEXPR bool b5 = exec::can_set_value<
421       no_set_value&, int, std::string>::value;
422   BOOST_ASIO_CHECK(b5 == false);
423 
424   BOOST_ASIO_CONSTEXPR bool b6 = exec::can_set_value<
425       const no_set_value&, int, std::string>::value;
426   BOOST_ASIO_CHECK(b6 == false);
427 
428   BOOST_ASIO_CONSTEXPR bool b7 = exec::can_set_value<
429       const_member_set_value_0&>::value;
430   BOOST_ASIO_CHECK(b7 == true);
431 
432   BOOST_ASIO_CONSTEXPR bool b8 = exec::can_set_value<
433       const const_member_set_value_0&>::value;
434   BOOST_ASIO_CHECK(b8 == true);
435 
436   BOOST_ASIO_CONSTEXPR bool b9 = exec::can_set_value<
437       const_member_set_value_0&, int>::value;
438   BOOST_ASIO_CHECK(b9 == false);
439 
440   BOOST_ASIO_CONSTEXPR bool b10 = exec::can_set_value<
441       const const_member_set_value_0&, int>::value;
442   BOOST_ASIO_CHECK(b10 == false);
443 
444   BOOST_ASIO_CONSTEXPR bool b11 = exec::can_set_value<
445       const_member_set_value_0&, int, std::string>::value;
446   BOOST_ASIO_CHECK(b11 == false);
447 
448   BOOST_ASIO_CONSTEXPR bool b12 = exec::can_set_value<
449       const const_member_set_value_0&, int, std::string>::value;
450   BOOST_ASIO_CHECK(b12 == false);
451 
452   BOOST_ASIO_CONSTEXPR bool b13 = exec::can_set_value<
453       const_member_set_value_1&>::value;
454   BOOST_ASIO_CHECK(b13 == false);
455 
456   BOOST_ASIO_CONSTEXPR bool b14 = exec::can_set_value<
457       const const_member_set_value_1&>::value;
458   BOOST_ASIO_CHECK(b14 == false);
459 
460   BOOST_ASIO_CONSTEXPR bool b15 = exec::can_set_value<
461       const_member_set_value_1&, int>::value;
462   BOOST_ASIO_CHECK(b15 == true);
463 
464   BOOST_ASIO_CONSTEXPR bool b16 = exec::can_set_value<
465       const const_member_set_value_1&, int>::value;
466   BOOST_ASIO_CHECK(b16 == true);
467 
468   BOOST_ASIO_CONSTEXPR bool b17 = exec::can_set_value<
469       const_member_set_value_1&, int, std::string>::value;
470   BOOST_ASIO_CHECK(b17 == false);
471 
472   BOOST_ASIO_CONSTEXPR bool b18 = exec::can_set_value<
473       const const_member_set_value_1&, int, std::string>::value;
474   BOOST_ASIO_CHECK(b18 == false);
475 
476   BOOST_ASIO_CONSTEXPR bool b19 = exec::can_set_value<
477       const_member_set_value_2&>::value;
478   BOOST_ASIO_CHECK(b19 == false);
479 
480   BOOST_ASIO_CONSTEXPR bool b20 = exec::can_set_value<
481       const const_member_set_value_2&>::value;
482   BOOST_ASIO_CHECK(b20 == false);
483 
484   BOOST_ASIO_CONSTEXPR bool b21 = exec::can_set_value<
485       const_member_set_value_2&, int>::value;
486   BOOST_ASIO_CHECK(b21 == false);
487 
488   BOOST_ASIO_CONSTEXPR bool b22 = exec::can_set_value<
489       const const_member_set_value_2&, int>::value;
490   BOOST_ASIO_CHECK(b22 == false);
491 
492   BOOST_ASIO_CONSTEXPR bool b23 = exec::can_set_value<
493       const_member_set_value_2&, int, std::string>::value;
494   BOOST_ASIO_CHECK(b23 == true);
495 
496   BOOST_ASIO_CONSTEXPR bool b24 = exec::can_set_value<
497       const const_member_set_value_2&, int, std::string>::value;
498   BOOST_ASIO_CHECK(b24 == true);
499 
500   BOOST_ASIO_CONSTEXPR bool b25 = exec::can_set_value<
501       free_set_value_const_receiver_0&>::value;
502   BOOST_ASIO_CHECK(b25 == true);
503 
504   BOOST_ASIO_CONSTEXPR bool b26 = exec::can_set_value<
505       const free_set_value_const_receiver_0&>::value;
506   BOOST_ASIO_CHECK(b26 == true);
507 
508   BOOST_ASIO_CONSTEXPR bool b27 = exec::can_set_value<
509       free_set_value_const_receiver_0&, int>::value;
510   BOOST_ASIO_CHECK(b27 == false);
511 
512   BOOST_ASIO_CONSTEXPR bool b28 = exec::can_set_value<
513       const free_set_value_const_receiver_0&, int>::value;
514   BOOST_ASIO_CHECK(b28 == false);
515 
516   BOOST_ASIO_CONSTEXPR bool b29 = exec::can_set_value<
517       free_set_value_const_receiver_0&, int, std::string>::value;
518   BOOST_ASIO_CHECK(b29 == false);
519 
520   BOOST_ASIO_CONSTEXPR bool b30 = exec::can_set_value<
521       const free_set_value_const_receiver_0&, int, std::string>::value;
522   BOOST_ASIO_CHECK(b30 == false);
523 
524   BOOST_ASIO_CONSTEXPR bool b31 = exec::can_set_value<
525       free_set_value_const_receiver_1&>::value;
526   BOOST_ASIO_CHECK(b31 == false);
527 
528   BOOST_ASIO_CONSTEXPR bool b32 = exec::can_set_value<
529       const free_set_value_const_receiver_1&>::value;
530   BOOST_ASIO_CHECK(b32 == false);
531 
532   BOOST_ASIO_CONSTEXPR bool b33 = exec::can_set_value<
533       free_set_value_const_receiver_1&, int>::value;
534   BOOST_ASIO_CHECK(b33 == true);
535 
536   BOOST_ASIO_CONSTEXPR bool b34 = exec::can_set_value<
537       const free_set_value_const_receiver_1&, int>::value;
538   BOOST_ASIO_CHECK(b34 == true);
539 
540   BOOST_ASIO_CONSTEXPR bool b35 = exec::can_set_value<
541       free_set_value_const_receiver_1&, int, std::string>::value;
542   BOOST_ASIO_CHECK(b35 == false);
543 
544   BOOST_ASIO_CONSTEXPR bool b36 = exec::can_set_value<
545       const free_set_value_const_receiver_1&, int, std::string>::value;
546   BOOST_ASIO_CHECK(b36 == false);
547 
548   BOOST_ASIO_CONSTEXPR bool b37 = exec::can_set_value<
549       free_set_value_const_receiver_2&>::value;
550   BOOST_ASIO_CHECK(b37 == false);
551 
552   BOOST_ASIO_CONSTEXPR bool b38 = exec::can_set_value<
553       const free_set_value_const_receiver_2&>::value;
554   BOOST_ASIO_CHECK(b38 == false);
555 
556   BOOST_ASIO_CONSTEXPR bool b39 = exec::can_set_value<
557       free_set_value_const_receiver_2&, int>::value;
558   BOOST_ASIO_CHECK(b39 == false);
559 
560   BOOST_ASIO_CONSTEXPR bool b40 = exec::can_set_value<
561       const free_set_value_const_receiver_2&, int>::value;
562   BOOST_ASIO_CHECK(b40 == false);
563 
564   BOOST_ASIO_CONSTEXPR bool b41 = exec::can_set_value<
565       free_set_value_const_receiver_2&, int, std::string>::value;
566   BOOST_ASIO_CHECK(b41 == true);
567 
568   BOOST_ASIO_CONSTEXPR bool b42 = exec::can_set_value<
569       const free_set_value_const_receiver_2&, int, std::string>::value;
570   BOOST_ASIO_CHECK(b42 == true);
571 
572   BOOST_ASIO_CONSTEXPR bool b43 = exec::can_set_value<
573       non_const_member_set_value_0&>::value;
574   BOOST_ASIO_CHECK(b43 == true);
575 
576   BOOST_ASIO_CONSTEXPR bool b44 = exec::can_set_value<
577       const non_const_member_set_value_0&>::value;
578   BOOST_ASIO_CHECK(b44 == false);
579 
580   BOOST_ASIO_CONSTEXPR bool b45 = exec::can_set_value<
581       non_const_member_set_value_0&, int>::value;
582   BOOST_ASIO_CHECK(b45 == false);
583 
584   BOOST_ASIO_CONSTEXPR bool b46 = exec::can_set_value<
585       const non_const_member_set_value_0&, int>::value;
586   BOOST_ASIO_CHECK(b46 == false);
587 
588   BOOST_ASIO_CONSTEXPR bool b47 = exec::can_set_value<
589       non_const_member_set_value_0&, int, std::string>::value;
590   BOOST_ASIO_CHECK(b47 == false);
591 
592   BOOST_ASIO_CONSTEXPR bool b48 = exec::can_set_value<
593       const non_const_member_set_value_0&, int, std::string>::value;
594   BOOST_ASIO_CHECK(b48 == false);
595 
596   BOOST_ASIO_CONSTEXPR bool b49 = exec::can_set_value<
597       non_const_member_set_value_1&>::value;
598   BOOST_ASIO_CHECK(b49 == false);
599 
600   BOOST_ASIO_CONSTEXPR bool b50 = exec::can_set_value<
601       const non_const_member_set_value_1&>::value;
602   BOOST_ASIO_CHECK(b50 == false);
603 
604   BOOST_ASIO_CONSTEXPR bool b51 = exec::can_set_value<
605       non_const_member_set_value_1&, int>::value;
606   BOOST_ASIO_CHECK(b51 == true);
607 
608   BOOST_ASIO_CONSTEXPR bool b52 = exec::can_set_value<
609       const non_const_member_set_value_1&, int>::value;
610   BOOST_ASIO_CHECK(b52 == false);
611 
612   BOOST_ASIO_CONSTEXPR bool b53 = exec::can_set_value<
613       non_const_member_set_value_1&, int, std::string>::value;
614   BOOST_ASIO_CHECK(b53 == false);
615 
616   BOOST_ASIO_CONSTEXPR bool b54 = exec::can_set_value<
617       const non_const_member_set_value_1&, int, std::string>::value;
618   BOOST_ASIO_CHECK(b54 == false);
619 
620   BOOST_ASIO_CONSTEXPR bool b55 = exec::can_set_value<
621       non_const_member_set_value_2&>::value;
622   BOOST_ASIO_CHECK(b55 == false);
623 
624   BOOST_ASIO_CONSTEXPR bool b56 = exec::can_set_value<
625       const non_const_member_set_value_2&>::value;
626   BOOST_ASIO_CHECK(b56 == false);
627 
628   BOOST_ASIO_CONSTEXPR bool b57 = exec::can_set_value<
629       non_const_member_set_value_2&, int>::value;
630   BOOST_ASIO_CHECK(b57 == false);
631 
632   BOOST_ASIO_CONSTEXPR bool b58 = exec::can_set_value<
633       const non_const_member_set_value_2&, int>::value;
634   BOOST_ASIO_CHECK(b58 == false);
635 
636   BOOST_ASIO_CONSTEXPR bool b59 = exec::can_set_value<
637       non_const_member_set_value_2&, int, std::string>::value;
638   BOOST_ASIO_CHECK(b59 == true);
639 
640   BOOST_ASIO_CONSTEXPR bool b60 = exec::can_set_value<
641       const non_const_member_set_value_2&, int, std::string>::value;
642   BOOST_ASIO_CHECK(b60 == false);
643 
644   BOOST_ASIO_CONSTEXPR bool b61 = exec::can_set_value<
645       free_set_value_non_const_receiver_0&>::value;
646   BOOST_ASIO_CHECK(b61 == true);
647 
648   BOOST_ASIO_CONSTEXPR bool b62 = exec::can_set_value<
649       const free_set_value_non_const_receiver_0&>::value;
650   BOOST_ASIO_CHECK(b62 == false);
651 
652   BOOST_ASIO_CONSTEXPR bool b63 = exec::can_set_value<
653       free_set_value_non_const_receiver_0&, int>::value;
654   BOOST_ASIO_CHECK(b63 == false);
655 
656   BOOST_ASIO_CONSTEXPR bool b64 = exec::can_set_value<
657       const free_set_value_non_const_receiver_0&, int>::value;
658   BOOST_ASIO_CHECK(b64 == false);
659 
660   BOOST_ASIO_CONSTEXPR bool b65 = exec::can_set_value<
661       free_set_value_non_const_receiver_0&, int, std::string>::value;
662   BOOST_ASIO_CHECK(b65 == false);
663 
664   BOOST_ASIO_CONSTEXPR bool b66 = exec::can_set_value<
665       const free_set_value_non_const_receiver_0&, int, std::string>::value;
666   BOOST_ASIO_CHECK(b66 == false);
667 
668   BOOST_ASIO_CONSTEXPR bool b67 = exec::can_set_value<
669       free_set_value_non_const_receiver_1&>::value;
670   BOOST_ASIO_CHECK(b67 == false);
671 
672   BOOST_ASIO_CONSTEXPR bool b68 = exec::can_set_value<
673       const free_set_value_non_const_receiver_1&>::value;
674   BOOST_ASIO_CHECK(b68 == false);
675 
676   BOOST_ASIO_CONSTEXPR bool b69 = exec::can_set_value<
677       free_set_value_non_const_receiver_1&, int>::value;
678   BOOST_ASIO_CHECK(b69 == true);
679 
680   BOOST_ASIO_CONSTEXPR bool b70 = exec::can_set_value<
681       const free_set_value_non_const_receiver_1&, int>::value;
682   BOOST_ASIO_CHECK(b70 == false);
683 
684   BOOST_ASIO_CONSTEXPR bool b71 = exec::can_set_value<
685       free_set_value_non_const_receiver_1&, int, std::string>::value;
686   BOOST_ASIO_CHECK(b71 == false);
687 
688   BOOST_ASIO_CONSTEXPR bool b72 = exec::can_set_value<
689       const free_set_value_non_const_receiver_1&, int, std::string>::value;
690   BOOST_ASIO_CHECK(b72 == false);
691 
692   BOOST_ASIO_CONSTEXPR bool b73 = exec::can_set_value<
693       free_set_value_non_const_receiver_2&>::value;
694   BOOST_ASIO_CHECK(b73 == false);
695 
696   BOOST_ASIO_CONSTEXPR bool b74 = exec::can_set_value<
697       const free_set_value_non_const_receiver_2&>::value;
698   BOOST_ASIO_CHECK(b74 == false);
699 
700   BOOST_ASIO_CONSTEXPR bool b75 = exec::can_set_value<
701       free_set_value_non_const_receiver_2&, int>::value;
702   BOOST_ASIO_CHECK(b75 == false);
703 
704   BOOST_ASIO_CONSTEXPR bool b76 = exec::can_set_value<
705       const free_set_value_non_const_receiver_2&, int>::value;
706   BOOST_ASIO_CHECK(b76 == false);
707 
708   BOOST_ASIO_CONSTEXPR bool b77 = exec::can_set_value<
709       free_set_value_non_const_receiver_2&, int, std::string>::value;
710   BOOST_ASIO_CHECK(b77 == true);
711 
712   BOOST_ASIO_CONSTEXPR bool b78 = exec::can_set_value<
713       const free_set_value_non_const_receiver_2&, int, std::string>::value;
714   BOOST_ASIO_CHECK(b78 == false);
715 }
716 
increment(int * count)717 void increment(int* count)
718 {
719   ++(*count);
720 }
721 
test_set_value()722 void test_set_value()
723 {
724   call_count = 0;
725   const_member_set_value_0 ex1 = {};
726   exec::set_value(ex1);
727   BOOST_ASIO_CHECK(call_count == 1);
728 
729   call_count = 0;
730   const const_member_set_value_0 ex2 = {};
731   exec::set_value(ex2);
732   BOOST_ASIO_CHECK(call_count == 1);
733 
734   call_count = 0;
735   exec::set_value(const_member_set_value_0());
736   BOOST_ASIO_CHECK(call_count == 1);
737 
738   call_count = 0;
739   const_member_set_value_1 ex3 = {};
740   exec::set_value(ex3, 123);
741   BOOST_ASIO_CHECK(call_count == 1);
742 
743   call_count = 0;
744   const const_member_set_value_1 ex4 = {};
745   exec::set_value(ex4, 123);
746   BOOST_ASIO_CHECK(call_count == 1);
747 
748   call_count = 0;
749   exec::set_value(const_member_set_value_1(), 123);
750   BOOST_ASIO_CHECK(call_count == 1);
751 
752   call_count = 0;
753   const_member_set_value_2 ex5 = {};
754   exec::set_value(ex5, 123, std::string());
755   BOOST_ASIO_CHECK(call_count == 1);
756 
757   call_count = 0;
758   const const_member_set_value_2 ex6 = {};
759   exec::set_value(ex6, 123, std::string());
760   BOOST_ASIO_CHECK(call_count == 1);
761 
762   call_count = 0;
763   exec::set_value(const_member_set_value_2(), 123, std::string());
764   BOOST_ASIO_CHECK(call_count == 1);
765 
766   call_count = 0;
767   free_set_value_const_receiver_0 ex7 = {};
768   exec::set_value(ex7);
769   BOOST_ASIO_CHECK(call_count == 1);
770 
771   call_count = 0;
772   const free_set_value_const_receiver_0 ex8 = {};
773   exec::set_value(ex8);
774   BOOST_ASIO_CHECK(call_count == 1);
775 
776   call_count = 0;
777   exec::set_value(free_set_value_const_receiver_0());
778   BOOST_ASIO_CHECK(call_count == 1);
779 
780   call_count = 0;
781   free_set_value_const_receiver_1 ex9 = {};
782   exec::set_value(ex9, 123);
783   BOOST_ASIO_CHECK(call_count == 1);
784 
785   call_count = 0;
786   const free_set_value_const_receiver_1 ex10 = {};
787   exec::set_value(ex10, 123);
788   BOOST_ASIO_CHECK(call_count == 1);
789 
790   call_count = 0;
791   exec::set_value(free_set_value_const_receiver_1(), 123);
792   BOOST_ASIO_CHECK(call_count == 1);
793 
794   call_count = 0;
795   free_set_value_const_receiver_2 ex11 = {};
796   exec::set_value(ex11, 123, std::string());
797   BOOST_ASIO_CHECK(call_count == 1);
798 
799   call_count = 0;
800   const free_set_value_const_receiver_2 ex12 = {};
801   exec::set_value(ex12, 123, std::string());
802   BOOST_ASIO_CHECK(call_count == 1);
803 
804   call_count = 0;
805   exec::set_value(free_set_value_const_receiver_2(), 123, std::string());
806   BOOST_ASIO_CHECK(call_count == 1);
807 
808   call_count = 0;
809   non_const_member_set_value_0 ex13 = {};
810   exec::set_value(ex13);
811   BOOST_ASIO_CHECK(call_count == 1);
812 
813   call_count = 0;
814   non_const_member_set_value_1 ex14 = {};
815   exec::set_value(ex14, 123);
816   BOOST_ASIO_CHECK(call_count == 1);
817 
818   call_count = 0;
819   non_const_member_set_value_2 ex15 = {};
820   exec::set_value(ex15, 123, std::string());
821   BOOST_ASIO_CHECK(call_count == 1);
822 
823   call_count = 0;
824   free_set_value_non_const_receiver_0 ex16 = {};
825   exec::set_value(ex16);
826   BOOST_ASIO_CHECK(call_count == 1);
827 
828   call_count = 0;
829   free_set_value_non_const_receiver_1 ex17 = {};
830   exec::set_value(ex17, 123);
831   BOOST_ASIO_CHECK(call_count == 1);
832 
833   call_count = 0;
834   free_set_value_non_const_receiver_2 ex18 = {};
835   exec::set_value(ex18, 123, std::string());
836   BOOST_ASIO_CHECK(call_count == 1);
837 }
838 
839 BOOST_ASIO_TEST_SUITE
840 (
841   "set_value",
842   BOOST_ASIO_TEST_CASE(test_can_set_value)
843   BOOST_ASIO_TEST_CASE(test_set_value)
844 )
845