]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/asio/detail/is_executor.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / asio / detail / is_executor.hpp
1 //
2 // detail/is_executor.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2017 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_DETAIL_IS_EXECUTOR_HPP
12 #define BOOST_ASIO_DETAIL_IS_EXECUTOR_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
21 #include <boost/asio/detail/push_options.hpp>
22
23 namespace boost {
24 namespace asio {
25 namespace detail {
26
27 struct executor_memfns_base
28 {
29 void context();
30 void on_work_started();
31 void on_work_finished();
32 void dispatch();
33 void post();
34 void defer();
35 };
36
37 template <typename T>
38 struct executor_memfns_derived
39 : T, executor_memfns_base
40 {
41 };
42
43 template <typename T, T>
44 struct executor_memfns_check
45 {
46 };
47
48 template <typename>
49 char (&context_memfn_helper(...))[2];
50
51 template <typename T>
52 char context_memfn_helper(
53 executor_memfns_check<
54 void (executor_memfns_base::*)(),
55 &executor_memfns_derived<T>::context>*);
56
57 template <typename>
58 char (&on_work_started_memfn_helper(...))[2];
59
60 template <typename T>
61 char on_work_started_memfn_helper(
62 executor_memfns_check<
63 void (executor_memfns_base::*)(),
64 &executor_memfns_derived<T>::on_work_started>*);
65
66 template <typename>
67 char (&on_work_finished_memfn_helper(...))[2];
68
69 template <typename T>
70 char on_work_finished_memfn_helper(
71 executor_memfns_check<
72 void (executor_memfns_base::*)(),
73 &executor_memfns_derived<T>::on_work_finished>*);
74
75 template <typename>
76 char (&dispatch_memfn_helper(...))[2];
77
78 template <typename T>
79 char dispatch_memfn_helper(
80 executor_memfns_check<
81 void (executor_memfns_base::*)(),
82 &executor_memfns_derived<T>::dispatch>*);
83
84 template <typename>
85 char (&post_memfn_helper(...))[2];
86
87 template <typename T>
88 char post_memfn_helper(
89 executor_memfns_check<
90 void (executor_memfns_base::*)(),
91 &executor_memfns_derived<T>::post>*);
92
93 template <typename>
94 char (&defer_memfn_helper(...))[2];
95
96 template <typename T>
97 char defer_memfn_helper(
98 executor_memfns_check<
99 void (executor_memfns_base::*)(),
100 &executor_memfns_derived<T>::defer>*);
101
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>
111 {
112 };
113
114 template <typename T>
115 struct is_executor
116 : conditional<is_class<T>::value,
117 is_executor_class<T>,
118 false_type>::type
119 {
120 };
121
122 } // namespace detail
123 } // namespace asio
124 } // namespace boost
125
126 #include <boost/asio/detail/pop_options.hpp>
127
128 #endif // BOOST_ASIO_DETAIL_IS_EXECUTOR_HPP