| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 | //// basic_io_object.hpp// ~~~~~~~~~~~~~~~~~~~//// Copyright (c) 2003-2020 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 BOOST_ASIO_BASIC_IO_OBJECT_HPP#define BOOST_ASIO_BASIC_IO_OBJECT_HPP#if defined(_MSC_VER) && (_MSC_VER >= 1200)# pragma once#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)#include <boost/asio/detail/config.hpp>#include <boost/asio/io_context.hpp>#include <boost/asio/detail/push_options.hpp>namespace boost {namespace asio {#if defined(BOOST_ASIO_HAS_MOVE)namespace detail{  // Type trait used to determine whether a service supports move.  template <typename IoObjectService>  class service_has_move  {  private:    typedef IoObjectService service_type;    typedef typename service_type::implementation_type implementation_type;    template <typename T, typename U>    static auto asio_service_has_move_eval(T* t, U* u)      -> decltype(t->move_construct(*u, *u), char());    static char (&asio_service_has_move_eval(...))[2];  public:    static const bool value =      sizeof(asio_service_has_move_eval(        static_cast<service_type*>(0),        static_cast<implementation_type*>(0))) == 1;  };}#endif // defined(BOOST_ASIO_HAS_MOVE)/// Base class for all I/O objects./** * @note All I/O objects are non-copyable. However, when using C++0x, certain * I/O objects do support move construction and move assignment. */#if !defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)template <typename IoObjectService>#elsetemplate <typename IoObjectService,    bool Movable = detail::service_has_move<IoObjectService>::value>#endifclass basic_io_object{public:  /// The type of the service that will be used to provide I/O operations.  typedef IoObjectService service_type;  /// The underlying implementation type of I/O object.  typedef typename service_type::implementation_type implementation_type;#if !defined(BOOST_ASIO_NO_DEPRECATED)  /// (Deprecated: Use get_executor().) Get the io_context associated with the  /// object.  /**   * This function may be used to obtain the io_context object that the I/O   * object uses to dispatch handlers for asynchronous operations.   *   * @return A reference to the io_context object that the I/O object will use   * to dispatch handlers. Ownership is not transferred to the caller.   */  boost::asio::io_context& get_io_context()  {    return service_.get_io_context();  }  /// (Deprecated: Use get_executor().) Get the io_context associated with the  /// object.  /**   * This function may be used to obtain the io_context object that the I/O   * object uses to dispatch handlers for asynchronous operations.   *   * @return A reference to the io_context object that the I/O object will use   * to dispatch handlers. Ownership is not transferred to the caller.   */  boost::asio::io_context& get_io_service()  {    return service_.get_io_context();  }#endif // !defined(BOOST_ASIO_NO_DEPRECATED)  /// The type of the executor associated with the object.  typedef boost::asio::io_context::executor_type executor_type;  /// Get the executor associated with the object.  executor_type get_executor() BOOST_ASIO_NOEXCEPT  {    return service_.get_io_context().get_executor();  }protected:  /// Construct a basic_io_object.  /**   * Performs:   * @code get_service().construct(get_implementation()); @endcode   */  explicit basic_io_object(boost::asio::io_context& io_context)    : service_(boost::asio::use_service<IoObjectService>(io_context))  {    service_.construct(implementation_);  }#if defined(GENERATING_DOCUMENTATION)  /// Move-construct a basic_io_object.  /**   * Performs:   * @code get_service().move_construct(   *     get_implementation(), other.get_implementation()); @endcode   *   * @note Available only for services that support movability,   */  basic_io_object(basic_io_object&& other);  /// Move-assign a basic_io_object.  /**   * Performs:   * @code get_service().move_assign(get_implementation(),   *     other.get_service(), other.get_implementation()); @endcode   *   * @note Available only for services that support movability,   */  basic_io_object& operator=(basic_io_object&& other);  /// Perform a converting move-construction of a basic_io_object.  template <typename IoObjectService1>  basic_io_object(IoObjectService1& other_service,      typename IoObjectService1::implementation_type& other_implementation);#endif // defined(GENERATING_DOCUMENTATION)  /// Protected destructor to prevent deletion through this type.  /**   * Performs:   * @code get_service().destroy(get_implementation()); @endcode   */  ~basic_io_object()  {    service_.destroy(implementation_);  }  /// Get the service associated with the I/O object.  service_type& get_service()  {    return service_;  }  /// Get the service associated with the I/O object.  const service_type& get_service() const  {    return service_;  }  /// Get the underlying implementation of the I/O object.  implementation_type& get_implementation()  {    return implementation_;  }  /// Get the underlying implementation of the I/O object.  const implementation_type& get_implementation() const  {    return implementation_;  }private:  basic_io_object(const basic_io_object&);  basic_io_object& operator=(const basic_io_object&);  // The service associated with the I/O object.  service_type& service_;  /// The underlying implementation of the I/O object.  implementation_type implementation_;};#if defined(BOOST_ASIO_HAS_MOVE)// Specialisation for movable objects.template <typename IoObjectService>class basic_io_object<IoObjectService, true>{public:  typedef IoObjectService service_type;  typedef typename service_type::implementation_type implementation_type;#if !defined(BOOST_ASIO_NO_DEPRECATED)  boost::asio::io_context& get_io_context()  {    return service_->get_io_context();  }  boost::asio::io_context& get_io_service()  {    return service_->get_io_context();  }#endif // !defined(BOOST_ASIO_NO_DEPRECATED)  typedef boost::asio::io_context::executor_type executor_type;  executor_type get_executor() BOOST_ASIO_NOEXCEPT  {    return service_->get_io_context().get_executor();  }protected:  explicit basic_io_object(boost::asio::io_context& io_context)    : service_(&boost::asio::use_service<IoObjectService>(io_context))  {    service_->construct(implementation_);  }  basic_io_object(basic_io_object&& other)    : service_(&other.get_service())  {    service_->move_construct(implementation_, other.implementation_);  }  template <typename IoObjectService1>  basic_io_object(IoObjectService1& other_service,      typename IoObjectService1::implementation_type& other_implementation)    : service_(&boost::asio::use_service<IoObjectService>(          other_service.get_io_context()))  {    service_->converting_move_construct(implementation_,        other_service, other_implementation);  }  ~basic_io_object()  {    service_->destroy(implementation_);  }  basic_io_object& operator=(basic_io_object&& other)  {    service_->move_assign(implementation_,        *other.service_, other.implementation_);    service_ = other.service_;    return *this;  }  service_type& get_service()  {    return *service_;  }  const service_type& get_service() const  {    return *service_;  }  implementation_type& get_implementation()  {    return implementation_;  }  const implementation_type& get_implementation() const  {    return implementation_;  }private:  basic_io_object(const basic_io_object&);  void operator=(const basic_io_object&);  IoObjectService* service_;  implementation_type implementation_;};#endif // defined(BOOST_ASIO_HAS_MOVE)} // namespace asio} // namespace boost#include <boost/asio/detail/pop_options.hpp>#endif // BOOST_ASIO_BASIC_IO_OBJECT_HPP
 |