302 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			302 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //
 | ||
|  | // experimental/channel_traits.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_EXPERIMENTAL_CHANNEL_TRAITS_HPP
 | ||
|  | #define ASIO_EXPERIMENTAL_CHANNEL_TRAITS_HPP
 | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 | ||
|  | # pragma once
 | ||
|  | #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 | ||
|  | 
 | ||
|  | #include "asio/detail/config.hpp"
 | ||
|  | #include <deque>
 | ||
|  | #include "asio/detail/type_traits.hpp"
 | ||
|  | #include "asio/error.hpp"
 | ||
|  | #include "asio/experimental/channel_error.hpp"
 | ||
|  | 
 | ||
|  | #include "asio/detail/push_options.hpp"
 | ||
|  | 
 | ||
|  | namespace asio { | ||
|  | namespace experimental { | ||
|  | 
 | ||
|  | #if defined(GENERATING_DOCUMENTATION)
 | ||
|  | 
 | ||
|  | template <typename... Signatures> | ||
|  | struct channel_traits | ||
|  | { | ||
|  |   /// Rebind the traits to a new set of signatures.
 | ||
|  |   /**
 | ||
|  |    * This nested structure must have a single nested type @c other that | ||
|  |    * aliases a traits type with the specified set of signatures. | ||
|  |    */ | ||
|  |   template <typename... NewSignatures> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     typedef user_defined other; | ||
|  |   }; | ||
|  | 
 | ||
|  |   /// Determine the container for the specified elements.
 | ||
|  |   /**
 | ||
|  |    * This nested structure must have a single nested type @c other that | ||
|  |    * aliases a container type for the specified element type. | ||
|  |    */ | ||
|  |   template <typename Element> | ||
|  |   struct container | ||
|  |   { | ||
|  |     typedef user_defined type; | ||
|  |   }; | ||
|  | 
 | ||
|  |   /// The signature of a channel cancellation notification.
 | ||
|  |   typedef void receive_cancelled_signature(...); | ||
|  | 
 | ||
|  |   /// Invoke the specified handler with a cancellation notification.
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_cancelled(F f); | ||
|  | 
 | ||
|  |   /// The signature of a channel closed notification.
 | ||
|  |   typedef void receive_closed_signature(...); | ||
|  | 
 | ||
|  |   /// Invoke the specified handler with a closed notification.
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_closed(F f); | ||
|  | }; | ||
|  | 
 | ||
|  | #else // defined(GENERATING_DOCUMENTATION)
 | ||
|  | 
 | ||
|  | /// Traits used for customising channel behaviour.
 | ||
|  | template <typename... Signatures> | ||
|  | struct channel_traits | ||
|  | { | ||
|  |   template <typename... NewSignatures> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     typedef channel_traits<NewSignatures...> other; | ||
|  |   }; | ||
|  | }; | ||
|  | 
 | ||
|  | template <typename R> | ||
|  | struct channel_traits<R(asio::error_code)> | ||
|  | { | ||
|  |   template <typename... NewSignatures> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     typedef channel_traits<NewSignatures...> other; | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <typename Element> | ||
|  |   struct container | ||
|  |   { | ||
|  |     typedef std::deque<Element> type; | ||
|  |   }; | ||
|  | 
 | ||
|  |   typedef R receive_cancelled_signature(asio::error_code); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_cancelled(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_cancelled; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)(e); | ||
|  |   } | ||
|  | 
 | ||
|  |   typedef R receive_closed_signature(asio::error_code); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_closed(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_closed; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)(e); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template <typename R, typename... Args, typename... Signatures> | ||
|  | struct channel_traits<R(asio::error_code, Args...), Signatures...> | ||
|  | { | ||
|  |   template <typename... NewSignatures> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     typedef channel_traits<NewSignatures...> other; | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <typename Element> | ||
|  |   struct container | ||
|  |   { | ||
|  |     typedef std::deque<Element> type; | ||
|  |   }; | ||
|  | 
 | ||
|  |   typedef R receive_cancelled_signature(asio::error_code, Args...); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_cancelled(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_cancelled; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)(e, typename decay<Args>::type()...); | ||
|  |   } | ||
|  | 
 | ||
|  |   typedef R receive_closed_signature(asio::error_code, Args...); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_closed(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_closed; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)(e, typename decay<Args>::type()...); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template <typename R> | ||
|  | struct channel_traits<R(std::exception_ptr)> | ||
|  | { | ||
|  |   template <typename... NewSignatures> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     typedef channel_traits<NewSignatures...> other; | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <typename Element> | ||
|  |   struct container | ||
|  |   { | ||
|  |     typedef std::deque<Element> type; | ||
|  |   }; | ||
|  | 
 | ||
|  |   typedef R receive_cancelled_signature(std::exception_ptr); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_cancelled(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_cancelled; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)( | ||
|  |         std::make_exception_ptr(asio::system_error(e))); | ||
|  |   } | ||
|  | 
 | ||
|  |   typedef R receive_closed_signature(std::exception_ptr); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_closed(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_closed; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)( | ||
|  |         std::make_exception_ptr(asio::system_error(e))); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template <typename R, typename... Args, typename... Signatures> | ||
|  | struct channel_traits<R(std::exception_ptr, Args...), Signatures...> | ||
|  | { | ||
|  |   template <typename... NewSignatures> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     typedef channel_traits<NewSignatures...> other; | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <typename Element> | ||
|  |   struct container | ||
|  |   { | ||
|  |     typedef std::deque<Element> type; | ||
|  |   }; | ||
|  | 
 | ||
|  |   typedef R receive_cancelled_signature(std::exception_ptr, Args...); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_cancelled(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_cancelled; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)( | ||
|  |         std::make_exception_ptr(asio::system_error(e)), | ||
|  |         typename decay<Args>::type()...); | ||
|  |   } | ||
|  | 
 | ||
|  |   typedef R receive_closed_signature(std::exception_ptr, Args...); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_closed(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_closed; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)( | ||
|  |         std::make_exception_ptr(asio::system_error(e)), | ||
|  |         typename decay<Args>::type()...); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template <typename R> | ||
|  | struct channel_traits<R()> | ||
|  | { | ||
|  |   template <typename... NewSignatures> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     typedef channel_traits<NewSignatures...> other; | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <typename Element> | ||
|  |   struct container | ||
|  |   { | ||
|  |     typedef std::deque<Element> type; | ||
|  |   }; | ||
|  | 
 | ||
|  |   typedef R receive_cancelled_signature(asio::error_code); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_cancelled(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_cancelled; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)(e); | ||
|  |   } | ||
|  | 
 | ||
|  |   typedef R receive_closed_signature(asio::error_code); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_closed(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_closed; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)(e); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | template <typename R, typename T> | ||
|  | struct channel_traits<R(T)> | ||
|  | { | ||
|  |   template <typename... NewSignatures> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     typedef channel_traits<NewSignatures...> other; | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <typename Element> | ||
|  |   struct container | ||
|  |   { | ||
|  |     typedef std::deque<Element> type; | ||
|  |   }; | ||
|  | 
 | ||
|  |   typedef R receive_cancelled_signature(asio::error_code); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_cancelled(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_cancelled; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)(e); | ||
|  |   } | ||
|  | 
 | ||
|  |   typedef R receive_closed_signature(asio::error_code); | ||
|  | 
 | ||
|  |   template <typename F> | ||
|  |   static void invoke_receive_closed(F f) | ||
|  |   { | ||
|  |     const asio::error_code e = error::channel_closed; | ||
|  |     ASIO_MOVE_OR_LVALUE(F)(f)(e); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | #endif // defined(GENERATING_DOCUMENTATION)
 | ||
|  | 
 | ||
|  | } // namespace experimental
 | ||
|  | } // namespace asio
 | ||
|  | 
 | ||
|  | #include "asio/detail/pop_options.hpp"
 | ||
|  | 
 | ||
|  | #endif // ASIO_EXPERIMENTAL_CHANNEL_TRAITS_HPP
 |