diff options
Diffstat (limited to 'lib/asio/detail/is_executor.hpp')
-rw-r--r-- | lib/asio/detail/is_executor.hpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/lib/asio/detail/is_executor.hpp b/lib/asio/detail/is_executor.hpp new file mode 100644 index 0000000..4584dd0 --- /dev/null +++ b/lib/asio/detail/is_executor.hpp @@ -0,0 +1,126 @@ +// +// detail/is_executor.hpp +// ~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef ASIO_DETAIL_IS_EXECUTOR_HPP +#define ASIO_DETAIL_IS_EXECUTOR_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "asio/detail/config.hpp" +#include "asio/detail/type_traits.hpp" + +#include "asio/detail/push_options.hpp" + +namespace asio { +namespace detail { + +struct executor_memfns_base +{ + void context(); + void on_work_started(); + void on_work_finished(); + void dispatch(); + void post(); + void defer(); +}; + +template <typename T> +struct executor_memfns_derived + : T, executor_memfns_base +{ +}; + +template <typename T, T> +struct executor_memfns_check +{ +}; + +template <typename> +char (&context_memfn_helper(...))[2]; + +template <typename T> +char context_memfn_helper( + executor_memfns_check< + void (executor_memfns_base::*)(), + &executor_memfns_derived<T>::context>*); + +template <typename> +char (&on_work_started_memfn_helper(...))[2]; + +template <typename T> +char on_work_started_memfn_helper( + executor_memfns_check< + void (executor_memfns_base::*)(), + &executor_memfns_derived<T>::on_work_started>*); + +template <typename> +char (&on_work_finished_memfn_helper(...))[2]; + +template <typename T> +char on_work_finished_memfn_helper( + executor_memfns_check< + void (executor_memfns_base::*)(), + &executor_memfns_derived<T>::on_work_finished>*); + +template <typename> +char (&dispatch_memfn_helper(...))[2]; + +template <typename T> +char dispatch_memfn_helper( + executor_memfns_check< + void (executor_memfns_base::*)(), + &executor_memfns_derived<T>::dispatch>*); + +template <typename> +char (&post_memfn_helper(...))[2]; + +template <typename T> +char post_memfn_helper( + executor_memfns_check< + void (executor_memfns_base::*)(), + &executor_memfns_derived<T>::post>*); + +template <typename> +char (&defer_memfn_helper(...))[2]; + +template <typename T> +char defer_memfn_helper( + executor_memfns_check< + void (executor_memfns_base::*)(), + &executor_memfns_derived<T>::defer>*); + +template <typename T> +struct is_executor_class + : integral_constant<bool, + sizeof(context_memfn_helper<T>(0)) != 1 && + sizeof(on_work_started_memfn_helper<T>(0)) != 1 && + sizeof(on_work_finished_memfn_helper<T>(0)) != 1 && + sizeof(dispatch_memfn_helper<T>(0)) != 1 && + sizeof(post_memfn_helper<T>(0)) != 1 && + sizeof(defer_memfn_helper<T>(0)) != 1> +{ +}; + +template <typename T> +struct is_executor + : conditional<is_class<T>::value, + is_executor_class<T>, + false_type>::type +{ +}; + +} // namespace detail +} // namespace asio + +#include "asio/detail/pop_options.hpp" + +#endif // ASIO_DETAIL_IS_EXECUTOR_HPP |