1 //
2 // execution/scheduler.hpp
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 #ifndef BOOST_ASIO_EXECUTION_SCHEDULER_HPP
12 #define BOOST_ASIO_EXECUTION_SCHEDULER_HPP
13 
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 # pragma once
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17 
18 #include <boost/asio/detail/config.hpp>
19 #include <boost/asio/detail/type_traits.hpp>
20 #include <boost/asio/execution/schedule.hpp>
21 #include <boost/asio/traits/equality_comparable.hpp>
22 
23 #include <boost/asio/detail/push_options.hpp>
24 
25 namespace boost {
26 namespace asio {
27 namespace execution {
28 namespace detail {
29 
30 template <typename T>
31 struct is_scheduler_base :
32   integral_constant<bool,
33     is_copy_constructible<typename remove_cvref<T>::type>::value
34       && traits::equality_comparable<typename remove_cvref<T>::type>::is_valid
35   >
36 {
37 };
38 
39 } // namespace detail
40 
41 /// The is_scheduler trait detects whether a type T satisfies the
42 /// execution::scheduler concept.
43 /**
44  * Class template @c is_scheduler is a type trait that is derived from @c
45  * true_type if the type @c T meets the concept definition for a scheduler for
46  * error type @c E, otherwise @c false_type.
47  */
48 template <typename T>
49 struct is_scheduler :
50 #if defined(GENERATING_DOCUMENTATION)
51   integral_constant<bool, automatically_determined>
52 #else // defined(GENERATING_DOCUMENTATION)
53   conditional<
54     can_schedule<T>::value,
55     detail::is_scheduler_base<T>,
56     false_type
57   >::type
58 #endif // defined(GENERATING_DOCUMENTATION)
59 {
60 };
61 
62 #if defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
63 
64 template <typename T>
65 BOOST_ASIO_CONSTEXPR const bool is_scheduler_v = is_scheduler<T>::value;
66 
67 #endif // defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
68 
69 #if defined(BOOST_ASIO_HAS_CONCEPTS)
70 
71 template <typename T>
72 BOOST_ASIO_CONCEPT scheduler = is_scheduler<T>::value;
73 
74 #define BOOST_ASIO_EXECUTION_SCHEDULER ::boost::asio::execution::scheduler
75 
76 #else // defined(BOOST_ASIO_HAS_CONCEPTS)
77 
78 #define BOOST_ASIO_EXECUTION_SCHEDULER typename
79 
80 #endif // defined(BOOST_ASIO_HAS_CONCEPTS)
81 
82 } // namespace execution
83 } // namespace asio
84 } // namespace boost
85 
86 #include <boost/asio/detail/pop_options.hpp>
87 
88 #endif // BOOST_ASIO_EXECUTION_SCHEDULER_HPP
89