2 // detail/is_executor.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~
5 // Copyright (c) 2003-2017 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_DETAIL_IS_EXECUTOR_HPP
12 #define BOOST_ASIO_DETAIL_IS_EXECUTOR_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>
21 #include <boost/asio/detail/push_options.hpp>
27 struct executor_memfns_base
30 void on_work_started();
31 void on_work_finished();
38 struct executor_memfns_derived
39 : T, executor_memfns_base
43 template <typename T, T>
44 struct executor_memfns_check
49 char (&context_memfn_helper(...))[2];
52 char context_memfn_helper(
53 executor_memfns_check<
54 void (executor_memfns_base::*)(),
55 &executor_memfns_derived<T>::context>*);
58 char (&on_work_started_memfn_helper(...))[2];
61 char on_work_started_memfn_helper(
62 executor_memfns_check<
63 void (executor_memfns_base::*)(),
64 &executor_memfns_derived<T>::on_work_started>*);
67 char (&on_work_finished_memfn_helper(...))[2];
70 char on_work_finished_memfn_helper(
71 executor_memfns_check<
72 void (executor_memfns_base::*)(),
73 &executor_memfns_derived<T>::on_work_finished>*);
76 char (&dispatch_memfn_helper(...))[2];
79 char dispatch_memfn_helper(
80 executor_memfns_check<
81 void (executor_memfns_base::*)(),
82 &executor_memfns_derived<T>::dispatch>*);
85 char (&post_memfn_helper(...))[2];
88 char post_memfn_helper(
89 executor_memfns_check<
90 void (executor_memfns_base::*)(),
91 &executor_memfns_derived<T>::post>*);
94 char (&defer_memfn_helper(...))[2];
97 char defer_memfn_helper(
98 executor_memfns_check<
99 void (executor_memfns_base::*)(),
100 &executor_memfns_derived<T>::defer>*);
102 template <typename T>
103 struct is_executor_class
104 : integral_constant<bool,
105 sizeof(context_memfn_helper<T>(0)) != 1 &&
106 sizeof(on_work_started_memfn_helper<T>(0)) != 1 &&
107 sizeof(on_work_finished_memfn_helper<T>(0)) != 1 &&
108 sizeof(dispatch_memfn_helper<T>(0)) != 1 &&
109 sizeof(post_memfn_helper<T>(0)) != 1 &&
110 sizeof(defer_memfn_helper<T>(0)) != 1>
114 template <typename T>
116 : conditional<is_class<T>::value,
117 is_executor_class<T>,
122 } // namespace detail
126 #include <boost/asio/detail/pop_options.hpp>
128 #endif // BOOST_ASIO_DETAIL_IS_EXECUTOR_HPP