329 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			329 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| //
 | |
| // detail/composed_work.hpp
 | |
| // ~~~~~~~~~~~~~~~~~~~~~~~~
 | |
| //
 | |
| // Copyright (c) 2003-2023 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_COMPOSED_WORK_HPP
 | |
| #define ASIO_DETAIL_COMPOSED_WORK_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/variadic_templates.hpp"
 | |
| #include "asio/execution/executor.hpp"
 | |
| #include "asio/execution/outstanding_work.hpp"
 | |
| #include "asio/executor_work_guard.hpp"
 | |
| #include "asio/is_executor.hpp"
 | |
| #include "asio/system_executor.hpp"
 | |
| 
 | |
| #include "asio/detail/push_options.hpp"
 | |
| 
 | |
| namespace asio {
 | |
| namespace detail {
 | |
| 
 | |
| template <typename Executor, typename = void>
 | |
| class composed_work_guard
 | |
| {
 | |
| public:
 | |
|   typedef typename decay<
 | |
|       typename prefer_result<Executor,
 | |
|         execution::outstanding_work_t::tracked_t
 | |
|       >::type
 | |
|     >::type executor_type;
 | |
| 
 | |
|   composed_work_guard(const Executor& ex)
 | |
|     : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   void reset()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   executor_type get_executor() const ASIO_NOEXCEPT
 | |
|   {
 | |
|     return executor_;
 | |
|   }
 | |
| 
 | |
| private:
 | |
|   executor_type executor_;
 | |
| };
 | |
| 
 | |
| template <>
 | |
| struct composed_work_guard<system_executor>
 | |
| {
 | |
| public:
 | |
|   typedef system_executor executor_type;
 | |
| 
 | |
|   composed_work_guard(const system_executor&)
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   void reset()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   executor_type get_executor() const ASIO_NOEXCEPT
 | |
|   {
 | |
|     return system_executor();
 | |
|   }
 | |
| };
 | |
| 
 | |
| #if !defined(ASIO_NO_TS_EXECUTORS)
 | |
| 
 | |
| template <typename Executor>
 | |
| struct composed_work_guard<Executor,
 | |
|     typename enable_if<
 | |
|       !execution::is_executor<Executor>::value
 | |
|     >::type> : executor_work_guard<Executor>
 | |
| {
 | |
|   composed_work_guard(const Executor& ex)
 | |
|     : executor_work_guard<Executor>(ex)
 | |
|   {
 | |
|   }
 | |
| };
 | |
| 
 | |
| #endif // !defined(ASIO_NO_TS_EXECUTORS)
 | |
| 
 | |
| template <typename>
 | |
| struct composed_io_executors;
 | |
| 
 | |
| template <>
 | |
| struct composed_io_executors<void()>
 | |
| {
 | |
|   composed_io_executors() ASIO_NOEXCEPT
 | |
|     : head_(system_executor())
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   typedef system_executor head_type;
 | |
|   system_executor head_;
 | |
| };
 | |
| 
 | |
| inline composed_io_executors<void()> make_composed_io_executors()
 | |
| {
 | |
|   return composed_io_executors<void()>();
 | |
| }
 | |
| 
 | |
| template <typename Head>
 | |
| struct composed_io_executors<void(Head)>
 | |
| {
 | |
|   explicit composed_io_executors(const Head& ex) ASIO_NOEXCEPT
 | |
|     : head_(ex)
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   typedef Head head_type;
 | |
|   Head head_;
 | |
| };
 | |
| 
 | |
| template <typename Head>
 | |
| inline composed_io_executors<void(Head)>
 | |
| make_composed_io_executors(const Head& head)
 | |
| {
 | |
|   return composed_io_executors<void(Head)>(head);
 | |
| }
 | |
| 
 | |
| #if defined(ASIO_HAS_VARIADIC_TEMPLATES)
 | |
| 
 | |
| template <typename Head, typename... Tail>
 | |
| struct composed_io_executors<void(Head, Tail...)>
 | |
| {
 | |
|   explicit composed_io_executors(const Head& head,
 | |
|       const Tail&... tail) ASIO_NOEXCEPT
 | |
|     : head_(head),
 | |
|       tail_(tail...)
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   void reset()
 | |
|   {
 | |
|     head_.reset();
 | |
|     tail_.reset();
 | |
|   }
 | |
| 
 | |
|   typedef Head head_type;
 | |
|   Head head_;
 | |
|   composed_io_executors<void(Tail...)> tail_;
 | |
| };
 | |
| 
 | |
| template <typename Head, typename... Tail>
 | |
| inline composed_io_executors<void(Head, Tail...)>
 | |
| make_composed_io_executors(const Head& head, const Tail&... tail)
 | |
| {
 | |
|   return composed_io_executors<void(Head, Tail...)>(head, tail...);
 | |
| }
 | |
| 
 | |
| #else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
 | |
| 
 | |
| #define ASIO_PRIVATE_COMPOSED_IO_EXECUTORS_DEF(n) \
 | |
| template <typename Head, ASIO_VARIADIC_TPARAMS(n)> \
 | |
| struct composed_io_executors<void(Head, ASIO_VARIADIC_TARGS(n))> \
 | |
| { \
 | |
|   explicit composed_io_executors(const Head& head, \
 | |
|       ASIO_VARIADIC_CONSTREF_PARAMS(n)) ASIO_NOEXCEPT \
 | |
|     : head_(head), \
 | |
|       tail_(ASIO_VARIADIC_BYVAL_ARGS(n)) \
 | |
|   { \
 | |
|   } \
 | |
| \
 | |
|   void reset() \
 | |
|   { \
 | |
|     head_.reset(); \
 | |
|     tail_.reset(); \
 | |
|   } \
 | |
| \
 | |
|   typedef Head head_type; \
 | |
|   Head head_; \
 | |
|   composed_io_executors<void(ASIO_VARIADIC_TARGS(n))> tail_; \
 | |
| }; \
 | |
| \
 | |
| template <typename Head, ASIO_VARIADIC_TPARAMS(n)> \
 | |
| inline composed_io_executors<void(Head, ASIO_VARIADIC_TARGS(n))> \
 | |
| make_composed_io_executors(const Head& head, \
 | |
|     ASIO_VARIADIC_CONSTREF_PARAMS(n)) \
 | |
| { \
 | |
|   return composed_io_executors< \
 | |
|     void(Head, ASIO_VARIADIC_TARGS(n))>( \
 | |
|       head, ASIO_VARIADIC_BYVAL_ARGS(n)); \
 | |
| } \
 | |
| /**/
 | |
| ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_COMPOSED_IO_EXECUTORS_DEF)
 | |
| #undef ASIO_PRIVATE_COMPOSED_IO_EXECUTORS_DEF
 | |
| 
 | |
| #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
 | |
| 
 | |
| template <typename>
 | |
| struct composed_work;
 | |
| 
 | |
| template <>
 | |
| struct composed_work<void()>
 | |
| {
 | |
|   typedef composed_io_executors<void()> executors_type;
 | |
| 
 | |
|   composed_work(const executors_type&) ASIO_NOEXCEPT
 | |
|     : head_(system_executor())
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   void reset()
 | |
|   {
 | |
|     head_.reset();
 | |
|   }
 | |
| 
 | |
|   typedef system_executor head_type;
 | |
|   composed_work_guard<system_executor> head_;
 | |
| };
 | |
| 
 | |
| template <typename Head>
 | |
| struct composed_work<void(Head)>
 | |
| {
 | |
|   typedef composed_io_executors<void(Head)> executors_type;
 | |
| 
 | |
|   explicit composed_work(const executors_type& ex) ASIO_NOEXCEPT
 | |
|     : head_(ex.head_)
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   void reset()
 | |
|   {
 | |
|     head_.reset();
 | |
|   }
 | |
| 
 | |
|   typedef Head head_type;
 | |
|   composed_work_guard<Head> head_;
 | |
| };
 | |
| 
 | |
| #if defined(ASIO_HAS_VARIADIC_TEMPLATES)
 | |
| 
 | |
| template <typename Head, typename... Tail>
 | |
| struct composed_work<void(Head, Tail...)>
 | |
| {
 | |
|   typedef composed_io_executors<void(Head, Tail...)> executors_type;
 | |
| 
 | |
|   explicit composed_work(const executors_type& ex) ASIO_NOEXCEPT
 | |
|     : head_(ex.head_),
 | |
|       tail_(ex.tail_)
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   void reset()
 | |
|   {
 | |
|     head_.reset();
 | |
|     tail_.reset();
 | |
|   }
 | |
| 
 | |
|   typedef Head head_type;
 | |
|   composed_work_guard<Head> head_;
 | |
|   composed_work<void(Tail...)> tail_;
 | |
| };
 | |
| 
 | |
| #else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
 | |
| 
 | |
| #define ASIO_PRIVATE_COMPOSED_WORK_DEF(n) \
 | |
| template <typename Head, ASIO_VARIADIC_TPARAMS(n)> \
 | |
| struct composed_work<void(Head, ASIO_VARIADIC_TARGS(n))> \
 | |
| { \
 | |
|   typedef composed_io_executors<void(Head, \
 | |
|     ASIO_VARIADIC_TARGS(n))> executors_type; \
 | |
| \
 | |
|   explicit composed_work(const executors_type& ex) ASIO_NOEXCEPT \
 | |
|     : head_(ex.head_), \
 | |
|       tail_(ex.tail_) \
 | |
|   { \
 | |
|   } \
 | |
| \
 | |
|   void reset() \
 | |
|   { \
 | |
|     head_.reset(); \
 | |
|     tail_.reset(); \
 | |
|   } \
 | |
| \
 | |
|   typedef Head head_type; \
 | |
|   composed_work_guard<Head> head_; \
 | |
|   composed_work<void(ASIO_VARIADIC_TARGS(n))> tail_; \
 | |
| }; \
 | |
| /**/
 | |
| ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_COMPOSED_WORK_DEF)
 | |
| #undef ASIO_PRIVATE_COMPOSED_WORK_DEF
 | |
| 
 | |
| #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
 | |
| 
 | |
| template <typename IoObject>
 | |
| inline typename IoObject::executor_type
 | |
| get_composed_io_executor(IoObject& io_object,
 | |
|     typename enable_if<
 | |
|       !is_executor<IoObject>::value
 | |
|     >::type* = 0,
 | |
|     typename enable_if<
 | |
|       !execution::is_executor<IoObject>::value
 | |
|     >::type* = 0)
 | |
| {
 | |
|   return io_object.get_executor();
 | |
| }
 | |
| 
 | |
| template <typename Executor>
 | |
| inline const Executor& get_composed_io_executor(const Executor& ex,
 | |
|     typename enable_if<
 | |
|       is_executor<Executor>::value
 | |
|         || execution::is_executor<Executor>::value
 | |
|     >::type* = 0)
 | |
| {
 | |
|   return ex;
 | |
| }
 | |
| 
 | |
| } // namespace detail
 | |
| } // namespace asio
 | |
| 
 | |
| #include "asio/detail/pop_options.hpp"
 | |
| 
 | |
| #endif // ASIO_DETAIL_COMPOSED_WORK_HPP
 |