]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/asio/associated_executor.hpp
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / boost / boost / asio / associated_executor.hpp
CommitLineData
b32b8144
FG
1//
2// associated_executor.hpp
3// ~~~~~~~~~~~~~~~~~~~~~~~
4//
11fdf7f2 5// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
b32b8144
FG
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_ASSOCIATED_EXECUTOR_HPP
12#define BOOST_ASIO_ASSOCIATED_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#include <boost/asio/is_executor.hpp>
21#include <boost/asio/system_executor.hpp>
22
23#include <boost/asio/detail/push_options.hpp>
24
25namespace boost {
26namespace asio {
27namespace detail {
28
29template <typename>
30struct associated_executor_check
31{
32 typedef void type;
33};
34
35template <typename T, typename E, typename = void>
36struct associated_executor_impl
37{
38 typedef E type;
39
40 static type get(const T&, const E& e) BOOST_ASIO_NOEXCEPT
41 {
42 return e;
43 }
44};
45
46template <typename T, typename E>
47struct associated_executor_impl<T, E,
48 typename associated_executor_check<typename T::executor_type>::type>
49{
50 typedef typename T::executor_type type;
51
52 static type get(const T& t, const E&) BOOST_ASIO_NOEXCEPT
53 {
54 return t.get_executor();
55 }
56};
57
58} // namespace detail
59
60/// Traits type used to obtain the executor associated with an object.
61/**
62 * A program may specialise this traits type if the @c T template parameter in
63 * the specialisation is a user-defined type. The template parameter @c
64 * Executor shall be a type meeting the Executor requirements.
65 *
66 * Specialisations shall meet the following requirements, where @c t is a const
67 * reference to an object of type @c T, and @c e is an object of type @c
68 * Executor.
69 *
70 * @li Provide a nested typedef @c type that identifies a type meeting the
71 * Executor requirements.
72 *
73 * @li Provide a noexcept static member function named @c get, callable as @c
74 * get(t) and with return type @c type.
75 *
76 * @li Provide a noexcept static member function named @c get, callable as @c
77 * get(t,e) and with return type @c type.
78 */
79template <typename T, typename Executor = system_executor>
80struct associated_executor
81{
82 /// If @c T has a nested type @c executor_type, <tt>T::executor_type</tt>.
83 /// Otherwise @c Executor.
84#if defined(GENERATING_DOCUMENTATION)
85 typedef see_below type;
86#else // defined(GENERATING_DOCUMENTATION)
87 typedef typename detail::associated_executor_impl<T, Executor>::type type;
88#endif // defined(GENERATING_DOCUMENTATION)
89
90 /// If @c T has a nested type @c executor_type, returns
91 /// <tt>t.get_executor()</tt>. Otherwise returns @c ex.
92 static type get(const T& t,
93 const Executor& ex = Executor()) BOOST_ASIO_NOEXCEPT
94 {
95 return detail::associated_executor_impl<T, Executor>::get(t, ex);
96 }
97};
98
99/// Helper function to obtain an object's associated executor.
100/**
101 * @returns <tt>associated_executor<T>::get(t)</tt>
102 */
103template <typename T>
104inline typename associated_executor<T>::type
105get_associated_executor(const T& t) BOOST_ASIO_NOEXCEPT
106{
107 return associated_executor<T>::get(t);
108}
109
110/// Helper function to obtain an object's associated executor.
111/**
112 * @returns <tt>associated_executor<T, Executor>::get(t, ex)</tt>
113 */
114template <typename T, typename Executor>
115inline typename associated_executor<T, Executor>::type
116get_associated_executor(const T& t, const Executor& ex,
117 typename enable_if<is_executor<
118 Executor>::value>::type* = 0) BOOST_ASIO_NOEXCEPT
119{
120 return associated_executor<T, Executor>::get(t, ex);
121}
122
123/// Helper function to obtain an object's associated executor.
124/**
125 * @returns <tt>associated_executor<T, typename
126 * ExecutionContext::executor_type>::get(t, ctx.get_executor())</tt>
127 */
128template <typename T, typename ExecutionContext>
129inline typename associated_executor<T,
130 typename ExecutionContext::executor_type>::type
131get_associated_executor(const T& t, ExecutionContext& ctx,
132 typename enable_if<is_convertible<ExecutionContext&,
133 execution_context&>::value>::type* = 0) BOOST_ASIO_NOEXCEPT
134{
135 return associated_executor<T,
136 typename ExecutionContext::executor_type>::get(t, ctx.get_executor());
137}
138
139#if defined(BOOST_ASIO_HAS_ALIAS_TEMPLATES)
140
141template <typename T, typename Executor = system_executor>
142using associated_executor_t = typename associated_executor<T, Executor>::type;
143
144#endif // defined(BOOST_ASIO_HAS_ALIAS_TEMPLATES)
145
146} // namespace asio
147} // namespace boost
148
149#include <boost/asio/detail/pop_options.hpp>
150
151#endif // BOOST_ASIO_ASSOCIATED_EXECUTOR_HPP