Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r70092 - in trunk: boost/asio boost/asio/detail boost/asio/detail/impl boost/asio/posix boost/asio/windows libs/asio/doc libs/asio/doc/requirements libs/asio/test libs/asio/test/ip libs/asio/test/posix libs/asio/test/windows
From: chris_at_[hidden]
Date: 2011-03-17 19:36:13


Author: chris_kohlhoff
Date: 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
New Revision: 70092
URL: http://svn.boost.org/trac/boost/changeset/70092

Log:
Remaining changes for asio 1.5.2:

* Added support for C++0x move construction and assignment to sockets, serial
  ports, POSIX descriptors and Windows handles.

* Regenerate documentation.

Text files modified:
   trunk/boost/asio/basic_datagram_socket.hpp | 107
   trunk/boost/asio/basic_io_object.hpp | 168 +
   trunk/boost/asio/basic_raw_socket.hpp | 106
   trunk/boost/asio/basic_seq_packet_socket.hpp | 62
   trunk/boost/asio/basic_serial_port.hpp | 100
   trunk/boost/asio/basic_socket.hpp | 143
   trunk/boost/asio/basic_socket_acceptor.hpp | 131
   trunk/boost/asio/basic_socket_streambuf.hpp | 26
   trunk/boost/asio/basic_stream_socket.hpp | 87
   trunk/boost/asio/datagram_socket_service.hpp | 17
   trunk/boost/asio/detail/config.hpp | 28
   trunk/boost/asio/detail/dev_poll_reactor.hpp | 5
   trunk/boost/asio/detail/epoll_reactor.hpp | 5
   trunk/boost/asio/detail/impl/dev_poll_reactor.ipp | 6
   trunk/boost/asio/detail/impl/epoll_reactor.ipp | 8
   trunk/boost/asio/detail/impl/kqueue_reactor.ipp | 8
   trunk/boost/asio/detail/impl/reactive_descriptor_service.ipp | 31
   trunk/boost/asio/detail/impl/reactive_socket_service_base.ipp | 31
   trunk/boost/asio/detail/impl/select_reactor.ipp | 6
   trunk/boost/asio/detail/impl/socket_ops.ipp | 7
   trunk/boost/asio/detail/impl/win_iocp_handle_service.ipp | 68
   trunk/boost/asio/detail/impl/win_iocp_socket_service_base.ipp | 87
   trunk/boost/asio/detail/kqueue_reactor.hpp | 5
   trunk/boost/asio/detail/reactive_descriptor_service.hpp | 9
   trunk/boost/asio/detail/reactive_serial_port_service.hpp | 16
   trunk/boost/asio/detail/reactive_socket_service.hpp | 21
   trunk/boost/asio/detail/reactive_socket_service_base.hpp | 9
   trunk/boost/asio/detail/select_reactor.hpp | 5
   trunk/boost/asio/detail/win_iocp_handle_service.hpp | 9
   trunk/boost/asio/detail/win_iocp_serial_port_service.hpp | 16
   trunk/boost/asio/detail/win_iocp_socket_service.hpp | 33
   trunk/boost/asio/detail/win_iocp_socket_service_base.hpp | 9
   trunk/boost/asio/posix/basic_descriptor.hpp | 80
   trunk/boost/asio/posix/basic_stream_descriptor.hpp | 56
   trunk/boost/asio/posix/stream_descriptor_service.hpp | 17
   trunk/boost/asio/raw_socket_service.hpp | 17
   trunk/boost/asio/seq_packet_socket_service.hpp | 17
   trunk/boost/asio/serial_port_service.hpp | 17
   trunk/boost/asio/socket_acceptor_service.hpp | 17
   trunk/boost/asio/stream_socket_service.hpp | 17
   trunk/boost/asio/version.hpp | 2
   trunk/boost/asio/windows/basic_handle.hpp | 53
   trunk/boost/asio/windows/basic_random_access_handle.hpp | 58
   trunk/boost/asio/windows/basic_stream_handle.hpp | 56
   trunk/boost/asio/windows/random_access_handle_service.hpp | 17
   trunk/boost/asio/windows/stream_handle_service.hpp | 17
   trunk/libs/asio/doc/reference.qbk | 4906 +++++++++++++++++++++++++++++++++++----
   trunk/libs/asio/doc/requirements/DescriptorService.qbk | 32
   trunk/libs/asio/doc/requirements/HandleService.qbk | 34
   trunk/libs/asio/doc/requirements/IoObjectService.qbk | 22
   trunk/libs/asio/doc/requirements/SerialPortService.qbk | 34
   trunk/libs/asio/doc/requirements/SocketAcceptorService.qbk | 41
   trunk/libs/asio/doc/requirements/SocketService.qbk | 32
   trunk/libs/asio/doc/tutorial.qbk | 4
   trunk/libs/asio/test/ip/tcp.cpp | 153 +
   trunk/libs/asio/test/ip/udp.cpp | 15
   trunk/libs/asio/test/posix/stream_descriptor.cpp | 15
   trunk/libs/asio/test/serial_port.cpp | 15
   trunk/libs/asio/test/windows/random_access_handle.cpp | 15
   trunk/libs/asio/test/windows/stream_handle.cpp | 15
   60 files changed, 6248 insertions(+), 895 deletions(-)

Modified: trunk/boost/asio/basic_datagram_socket.hpp
==============================================================================
--- trunk/boost/asio/basic_datagram_socket.hpp (original)
+++ trunk/boost/asio/basic_datagram_socket.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -132,6 +132,42 @@
   {
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_datagram_socket from another.
+ /**
+ * This constructor moves a datagram socket from one object to another.
+ *
+ * @param other The other basic_datagram_socket object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_datagram_socket(io_service&) constructor.
+ */
+ basic_datagram_socket(basic_datagram_socket&& other)
+ : basic_socket<Protocol, DatagramSocketService>(
+ BOOST_ASIO_MOVE_CAST(basic_datagram_socket)(other))
+ {
+ }
+
+ /// Move-assign a basic_datagram_socket from another.
+ /**
+ * This assignment operator moves a datagram socket from one object to
+ * another.
+ *
+ * @param other The other basic_datagram_socket object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_datagram_socket(io_service&) constructor.
+ */
+ basic_datagram_socket& operator=(basic_datagram_socket&& other)
+ {
+ basic_socket<Protocol, DatagramSocketService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_datagram_socket)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Send some data on a connected socket.
   /**
    * This function is used to send data on the datagram socket. The function
@@ -158,7 +194,8 @@
   std::size_t send(const ConstBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send(this->implementation, buffers, 0, ec);
+ std::size_t s = this->get_service().send(
+ this->get_implementation(), buffers, 0, ec);
     boost::asio::detail::throw_error(ec, "send");
     return s;
   }
@@ -185,8 +222,8 @@
       socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send(
- this->implementation, buffers, flags, ec);
+ std::size_t s = this->get_service().send(
+ this->get_implementation(), buffers, flags, ec);
     boost::asio::detail::throw_error(ec, "send");
     return s;
   }
@@ -212,7 +249,8 @@
   std::size_t send(const ConstBufferSequence& buffers,
       socket_base::message_flags flags, boost::system::error_code& ec)
   {
- return this->service.send(this->implementation, buffers, flags, ec);
+ return this->get_service().send(
+ this->get_implementation(), buffers, flags, ec);
   }
 
   /// Start an asynchronous send on a connected socket.
@@ -258,8 +296,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send(this->implementation, buffers, 0,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send(this->get_implementation(),
+ buffers, 0, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Start an asynchronous send on a connected socket.
@@ -299,8 +337,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send(this->implementation, buffers, flags,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send(this->get_implementation(),
+ buffers, flags, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Send a datagram to the specified endpoint.
@@ -333,8 +371,8 @@
       const endpoint_type& destination)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send_to(
- this->implementation, buffers, destination, 0, ec);
+ std::size_t s = this->get_service().send_to(
+ this->get_implementation(), buffers, destination, 0, ec);
     boost::asio::detail::throw_error(ec, "send_to");
     return s;
   }
@@ -360,8 +398,8 @@
       const endpoint_type& destination, socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send_to(
- this->implementation, buffers, destination, flags, ec);
+ std::size_t s = this->get_service().send_to(
+ this->get_implementation(), buffers, destination, flags, ec);
     boost::asio::detail::throw_error(ec, "send_to");
     return s;
   }
@@ -387,7 +425,7 @@
       const endpoint_type& destination, socket_base::message_flags flags,
       boost::system::error_code& ec)
   {
- return this->service.send_to(this->implementation,
+ return this->get_service().send_to(this->get_implementation(),
         buffers, destination, flags, ec);
   }
 
@@ -436,8 +474,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send_to(this->implementation, buffers, destination, 0,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send_to(this->get_implementation(), buffers,
+ destination, 0, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Start an asynchronous send.
@@ -476,8 +514,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send_to(this->implementation, buffers, destination,
- flags, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send_to(this->get_implementation(), buffers,
+ destination, flags, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Receive some data on a connected socket.
@@ -508,8 +546,8 @@
   std::size_t receive(const MutableBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive(
- this->implementation, buffers, 0, ec);
+ std::size_t s = this->get_service().receive(
+ this->get_implementation(), buffers, 0, ec);
     boost::asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -537,8 +575,8 @@
       socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive(
- this->implementation, buffers, flags, ec);
+ std::size_t s = this->get_service().receive(
+ this->get_implementation(), buffers, flags, ec);
     boost::asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -565,7 +603,8 @@
   std::size_t receive(const MutableBufferSequence& buffers,
       socket_base::message_flags flags, boost::system::error_code& ec)
   {
- return this->service.receive(this->implementation, buffers, flags, ec);
+ return this->get_service().receive(
+ this->get_implementation(), buffers, flags, ec);
   }
 
   /// Start an asynchronous receive on a connected socket.
@@ -611,8 +650,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive(this->implementation, buffers, 0,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_receive(this->get_implementation(),
+ buffers, 0, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 
   /// Start an asynchronous receive on a connected socket.
@@ -651,8 +690,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive(this->implementation, buffers, flags,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_receive(this->get_implementation(),
+ buffers, flags, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 
   /// Receive a datagram with the endpoint of the sender.
@@ -686,8 +725,8 @@
       endpoint_type& sender_endpoint)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive_from(
- this->implementation, buffers, sender_endpoint, 0, ec);
+ std::size_t s = this->get_service().receive_from(
+ this->get_implementation(), buffers, sender_endpoint, 0, ec);
     boost::asio::detail::throw_error(ec, "receive_from");
     return s;
   }
@@ -713,8 +752,8 @@
       endpoint_type& sender_endpoint, socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive_from(
- this->implementation, buffers, sender_endpoint, flags, ec);
+ std::size_t s = this->get_service().receive_from(
+ this->get_implementation(), buffers, sender_endpoint, flags, ec);
     boost::asio::detail::throw_error(ec, "receive_from");
     return s;
   }
@@ -740,8 +779,8 @@
       endpoint_type& sender_endpoint, socket_base::message_flags flags,
       boost::system::error_code& ec)
   {
- return this->service.receive_from(this->implementation, buffers,
- sender_endpoint, flags, ec);
+ return this->get_service().receive_from(this->get_implementation(),
+ buffers, sender_endpoint, flags, ec);
   }
 
   /// Start an asynchronous receive.
@@ -788,7 +827,7 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive_from(this->implementation, buffers,
+ this->get_service().async_receive_from(this->get_implementation(), buffers,
         sender_endpoint, 0, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 
@@ -830,7 +869,7 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive_from(this->implementation, buffers,
+ this->get_service().async_receive_from(this->get_implementation(), buffers,
         sender_endpoint, flags, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 };

Modified: trunk/boost/asio/basic_io_object.hpp
==============================================================================
--- trunk/boost/asio/basic_io_object.hpp (original)
+++ trunk/boost/asio/basic_io_object.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -16,7 +16,6 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include <boost/asio/detail/config.hpp>
-#include <boost/asio/detail/noncopyable.hpp>
 #include <boost/asio/io_service.hpp>
 
 #include <boost/asio/detail/push_options.hpp>
@@ -24,10 +23,42 @@
 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 eval(T* t, U* u) -> decltype(t->move_construct(*u, *u), char());
+ static char (&eval(...))[2];
+
+ public:
+ static const bool value =
+ sizeof(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>
+#else
+template <typename IoObjectService,
+ bool Movable = detail::service_has_move<IoObjectService>::value>
+#endif
 class basic_io_object
- : private noncopyable
 {
 public:
   /// The type of the service that will be used to provide I/O operations.
@@ -53,7 +84,7 @@
   /// Construct a basic_io_object.
   /**
    * Performs:
- * @code service.construct(implementation); @endcode
+ * @code get_service().construct(get_implementation()); @endcode
    */
   explicit basic_io_object(boost::asio::io_service& io_service)
     : service(boost::asio::use_service<IoObjectService>(io_service))
@@ -61,22 +92,147 @@
     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);
+#endif // defined(GENERATING_DOCUMENTATION)
+
   /// Protected destructor to prevent deletion through this type.
   /**
    * Performs:
- * @code service.destroy(implementation); @endcode
+ * @code get_service().destroy(get_implementation()); @endcode
    */
   ~basic_io_object()
   {
     service.destroy(implementation);
   }
 
- /// The service associated with the I/O object.
+ /// 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;
+ }
+
+ /// (Deprecated: Use get_service().) The service associated with the I/O
+ /// object.
+ /**
+ * @note Available only for services that do not support movability.
+ */
   service_type& service;
 
- /// The underlying implementation of the I/O object.
+ /// 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;
+ }
+
+ /// (Deprecated: Use get_implementation().) The underlying implementation of
+ /// the I/O object.
+ implementation_type implementation;
+
+private:
+ basic_io_object(const basic_io_object&);
+ basic_io_object& operator=(const basic_io_object&);
+};
+
+#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;
+
+ boost::asio::io_service& get_io_service()
+ {
+ return service_->get_io_service();
+ }
+
+protected:
+ explicit basic_io_object(boost::asio::io_service& io_service)
+ : service_(&boost::asio::use_service<IoObjectService>(io_service))
+ {
+ service_->construct(implementation);
+ }
+
+ basic_io_object(basic_io_object&& other)
+ : service_(&other.get_service())
+ {
+ service_->move_construct(implementation, 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;
+ }
+
   implementation_type implementation;
+
+private:
+ basic_io_object(const basic_io_object&);
+ void operator=(const basic_io_object&);
+
+ IoObjectService* service_;
 };
+#endif // defined(BOOST_ASIO_HAS_MOVE)
 
 } // namespace asio
 } // namespace boost

Modified: trunk/boost/asio/basic_raw_socket.hpp
==============================================================================
--- trunk/boost/asio/basic_raw_socket.hpp (original)
+++ trunk/boost/asio/basic_raw_socket.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -132,6 +132,41 @@
   {
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_raw_socket from another.
+ /**
+ * This constructor moves a raw socket from one object to another.
+ *
+ * @param other The other basic_raw_socket object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_raw_socket(io_service&) constructor.
+ */
+ basic_raw_socket(basic_raw_socket&& other)
+ : basic_socket<Protocol, RawSocketService>(
+ BOOST_ASIO_MOVE_CAST(basic_raw_socket)(other))
+ {
+ }
+
+ /// Move-assign a basic_raw_socket from another.
+ /**
+ * This assignment operator moves a raw socket from one object to another.
+ *
+ * @param other The other basic_raw_socket object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_raw_socket(io_service&) constructor.
+ */
+ basic_raw_socket& operator=(basic_raw_socket&& other)
+ {
+ basic_socket<Protocol, RawSocketService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_raw_socket)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Send some data on a connected socket.
   /**
    * This function is used to send data on the raw socket. The function call
@@ -157,7 +192,8 @@
   std::size_t send(const ConstBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send(this->implementation, buffers, 0, ec);
+ std::size_t s = this->get_service().send(
+ this->get_implementation(), buffers, 0, ec);
     boost::asio::detail::throw_error(ec, "send");
     return s;
   }
@@ -183,8 +219,8 @@
       socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send(
- this->implementation, buffers, flags, ec);
+ std::size_t s = this->get_service().send(
+ this->get_implementation(), buffers, flags, ec);
     boost::asio::detail::throw_error(ec, "send");
     return s;
   }
@@ -209,7 +245,8 @@
   std::size_t send(const ConstBufferSequence& buffers,
       socket_base::message_flags flags, boost::system::error_code& ec)
   {
- return this->service.send(this->implementation, buffers, flags, ec);
+ return this->get_service().send(
+ this->get_implementation(), buffers, flags, ec);
   }
 
   /// Start an asynchronous send on a connected socket.
@@ -254,8 +291,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send(this->implementation, buffers, 0,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send(this->get_implementation(),
+ buffers, 0, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Start an asynchronous send on a connected socket.
@@ -294,8 +331,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send(this->implementation, buffers, flags,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send(this->get_implementation(),
+ buffers, flags, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Send raw data to the specified endpoint.
@@ -328,8 +365,8 @@
       const endpoint_type& destination)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send_to(
- this->implementation, buffers, destination, 0, ec);
+ std::size_t s = this->get_service().send_to(
+ this->get_implementation(), buffers, destination, 0, ec);
     boost::asio::detail::throw_error(ec, "send_to");
     return s;
   }
@@ -355,8 +392,8 @@
       const endpoint_type& destination, socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send_to(
- this->implementation, buffers, destination, flags, ec);
+ std::size_t s = this->get_service().send_to(
+ this->get_implementation(), buffers, destination, flags, ec);
     boost::asio::detail::throw_error(ec, "send_to");
     return s;
   }
@@ -382,7 +419,7 @@
       const endpoint_type& destination, socket_base::message_flags flags,
       boost::system::error_code& ec)
   {
- return this->service.send_to(this->implementation,
+ return this->get_service().send_to(this->get_implementation(),
         buffers, destination, flags, ec);
   }
 
@@ -431,8 +468,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send_to(this->implementation, buffers, destination, 0,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send_to(this->get_implementation(), buffers,
+ destination, 0, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Start an asynchronous send.
@@ -471,8 +508,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send_to(this->implementation, buffers, destination,
- flags, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send_to(this->get_implementation(), buffers,
+ destination, flags, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Receive some data on a connected socket.
@@ -503,8 +540,8 @@
   std::size_t receive(const MutableBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive(
- this->implementation, buffers, 0, ec);
+ std::size_t s = this->get_service().receive(
+ this->get_implementation(), buffers, 0, ec);
     boost::asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -532,8 +569,8 @@
       socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive(
- this->implementation, buffers, flags, ec);
+ std::size_t s = this->get_service().receive(
+ this->get_implementation(), buffers, flags, ec);
     boost::asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -560,7 +597,8 @@
   std::size_t receive(const MutableBufferSequence& buffers,
       socket_base::message_flags flags, boost::system::error_code& ec)
   {
- return this->service.receive(this->implementation, buffers, flags, ec);
+ return this->get_service().receive(
+ this->get_implementation(), buffers, flags, ec);
   }
 
   /// Start an asynchronous receive on a connected socket.
@@ -606,8 +644,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive(this->implementation, buffers, 0,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_receive(this->get_implementation(),
+ buffers, 0, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 
   /// Start an asynchronous receive on a connected socket.
@@ -646,8 +684,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive(this->implementation, buffers, flags,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_receive(this->get_implementation(),
+ buffers, flags, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 
   /// Receive raw data with the endpoint of the sender.
@@ -681,8 +719,8 @@
       endpoint_type& sender_endpoint)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive_from(
- this->implementation, buffers, sender_endpoint, 0, ec);
+ std::size_t s = this->get_service().receive_from(
+ this->get_implementation(), buffers, sender_endpoint, 0, ec);
     boost::asio::detail::throw_error(ec, "receive_from");
     return s;
   }
@@ -708,8 +746,8 @@
       endpoint_type& sender_endpoint, socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive_from(
- this->implementation, buffers, sender_endpoint, flags, ec);
+ std::size_t s = this->get_service().receive_from(
+ this->get_implementation(), buffers, sender_endpoint, flags, ec);
     boost::asio::detail::throw_error(ec, "receive_from");
     return s;
   }
@@ -735,8 +773,8 @@
       endpoint_type& sender_endpoint, socket_base::message_flags flags,
       boost::system::error_code& ec)
   {
- return this->service.receive_from(this->implementation, buffers,
- sender_endpoint, flags, ec);
+ return this->get_service().receive_from(this->get_implementation(),
+ buffers, sender_endpoint, flags, ec);
   }
 
   /// Start an asynchronous receive.
@@ -783,7 +821,7 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive_from(this->implementation, buffers,
+ this->get_service().async_receive_from(this->get_implementation(), buffers,
         sender_endpoint, 0, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 
@@ -825,7 +863,7 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive_from(this->implementation, buffers,
+ this->get_service().async_receive_from(this->get_implementation(), buffers,
         sender_endpoint, flags, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 };

Modified: trunk/boost/asio/basic_seq_packet_socket.hpp
==============================================================================
--- trunk/boost/asio/basic_seq_packet_socket.hpp (original)
+++ trunk/boost/asio/basic_seq_packet_socket.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -136,6 +136,43 @@
   {
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_seq_packet_socket from another.
+ /**
+ * This constructor moves a sequenced packet socket from one object to
+ * another.
+ *
+ * @param other The other basic_seq_packet_socket object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_seq_packet_socket(io_service&) constructor.
+ */
+ basic_seq_packet_socket(basic_seq_packet_socket&& other)
+ : basic_socket<Protocol, SeqPacketSocketService>(
+ BOOST_ASIO_MOVE_CAST(basic_seq_packet_socket)(other))
+ {
+ }
+
+ /// Move-assign a basic_seq_packet_socket from another.
+ /**
+ * This assignment operator moves a sequenced packet socket from one object to
+ * another.
+ *
+ * @param other The other basic_seq_packet_socket object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_seq_packet_socket(io_service&) constructor.
+ */
+ basic_seq_packet_socket& operator=(basic_seq_packet_socket&& other)
+ {
+ basic_socket<Protocol, SeqPacketSocketService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_seq_packet_socket)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Send some data on the socket.
   /**
    * This function is used to send data on the sequenced packet socket. The
@@ -164,8 +201,8 @@
       socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send(
- this->implementation, buffers, flags, ec);
+ std::size_t s = this->get_service().send(
+ this->get_implementation(), buffers, flags, ec);
     boost::asio::detail::throw_error(ec, "send");
     return s;
   }
@@ -192,7 +229,8 @@
   std::size_t send(const ConstBufferSequence& buffers,
       socket_base::message_flags flags, boost::system::error_code& ec)
   {
- return this->service.send(this->implementation, buffers, flags, ec);
+ return this->get_service().send(
+ this->get_implementation(), buffers, flags, ec);
   }
 
   /// Start an asynchronous send.
@@ -236,8 +274,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send(this->implementation, buffers, flags,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send(this->get_implementation(),
+ buffers, flags, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Receive some data on the socket.
@@ -274,8 +312,8 @@
       socket_base::message_flags& out_flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive(
- this->implementation, buffers, 0, out_flags, ec);
+ std::size_t s = this->get_service().receive(
+ this->get_implementation(), buffers, 0, out_flags, ec);
     boost::asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -321,8 +359,8 @@
       socket_base::message_flags& out_flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive(
- this->implementation, buffers, in_flags, out_flags, ec);
+ std::size_t s = this->get_service().receive(
+ this->get_implementation(), buffers, in_flags, out_flags, ec);
     boost::asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -355,7 +393,7 @@
       socket_base::message_flags in_flags,
       socket_base::message_flags& out_flags, boost::system::error_code& ec)
   {
- return this->service.receive(this->implementation,
+ return this->get_service().receive(this->get_implementation(),
         buffers, in_flags, out_flags, ec);
   }
 
@@ -405,7 +443,7 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive(this->implementation, buffers,
+ this->get_service().async_receive(this->get_implementation(), buffers,
         0, out_flags, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 
@@ -460,7 +498,7 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive(this->implementation, buffers,
+ this->get_service().async_receive(this->get_implementation(), buffers,
         in_flags, out_flags, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 };

Modified: trunk/boost/asio/basic_serial_port.hpp
==============================================================================
--- trunk/boost/asio/basic_serial_port.hpp (original)
+++ trunk/boost/asio/basic_serial_port.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -87,7 +87,7 @@
     : basic_io_object<SerialPortService>(io_service)
   {
     boost::system::error_code ec;
- this->service.open(this->implementation, device, ec);
+ this->get_service().open(this->get_implementation(), device, ec);
     boost::asio::detail::throw_error(ec, "open");
   }
 
@@ -107,7 +107,7 @@
     : basic_io_object<SerialPortService>(io_service)
   {
     boost::system::error_code ec;
- this->service.open(this->implementation, device, ec);
+ this->get_service().open(this->get_implementation(), device, ec);
     boost::asio::detail::throw_error(ec, "open");
   }
 
@@ -128,10 +128,46 @@
     : basic_io_object<SerialPortService>(io_service)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, native_serial_port, ec);
+ this->get_service().assign(this->get_implementation(),
+ native_serial_port, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_serial_port from another.
+ /**
+ * This constructor moves a serial port from one object to another.
+ *
+ * @param other The other basic_serial_port object from which the move will
+ * occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_serial_port(io_service&) constructor.
+ */
+ basic_serial_port(basic_serial_port&& other)
+ : basic_io_object<SerialPortService>(
+ BOOST_ASIO_MOVE_CAST(basic_serial_port)(other))
+ {
+ }
+
+ /// Move-assign a basic_serial_port from another.
+ /**
+ * This assignment operator moves a serial port from one object to another.
+ *
+ * @param other The other basic_serial_port object from which the move will
+ * occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_serial_port(io_service&) constructor.
+ */
+ basic_serial_port& operator=(basic_serial_port&& other)
+ {
+ basic_io_object<SerialPortService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_serial_port)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Get a reference to the lowest layer.
   /**
    * This function returns a reference to the lowest layer in a stack of
@@ -171,7 +207,7 @@
   void open(const std::string& device)
   {
     boost::system::error_code ec;
- this->service.open(this->implementation, device, ec);
+ this->get_service().open(this->get_implementation(), device, ec);
     boost::asio::detail::throw_error(ec, "open");
   }
 
@@ -187,7 +223,7 @@
   boost::system::error_code open(const std::string& device,
       boost::system::error_code& ec)
   {
- return this->service.open(this->implementation, device, ec);
+ return this->get_service().open(this->get_implementation(), device, ec);
   }
 
   /// Assign an existing native serial port to the serial port.
@@ -201,7 +237,8 @@
   void assign(const native_handle_type& native_serial_port)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, native_serial_port, ec);
+ this->get_service().assign(this->get_implementation(),
+ native_serial_port, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
@@ -216,13 +253,14 @@
   boost::system::error_code assign(const native_handle_type& native_serial_port,
       boost::system::error_code& ec)
   {
- return this->service.assign(this->implementation, native_serial_port, ec);
+ return this->get_service().assign(this->get_implementation(),
+ native_serial_port, ec);
   }
 
   /// Determine whether the serial port is open.
   bool is_open() const
   {
- return this->service.is_open(this->implementation);
+ return this->get_service().is_open(this->get_implementation());
   }
 
   /// Close the serial port.
@@ -236,7 +274,7 @@
   void close()
   {
     boost::system::error_code ec;
- this->service.close(this->implementation, ec);
+ this->get_service().close(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "close");
   }
 
@@ -250,7 +288,7 @@
    */
   boost::system::error_code close(boost::system::error_code& ec)
   {
- return this->service.close(this->implementation, ec);
+ return this->get_service().close(this->get_implementation(), ec);
   }
 
   /// (Deprecated: Use native_handle().) Get the native serial port
@@ -262,7 +300,7 @@
    */
   native_type native()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->get_implementation());
   }
 
   /// Get the native serial port representation.
@@ -273,7 +311,7 @@
    */
   native_handle_type native_handle()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->get_implementation());
   }
 
   /// Cancel all asynchronous operations associated with the serial port.
@@ -287,7 +325,7 @@
   void cancel()
   {
     boost::system::error_code ec;
- this->service.cancel(this->implementation, ec);
+ this->get_service().cancel(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "cancel");
   }
 
@@ -301,7 +339,7 @@
    */
   boost::system::error_code cancel(boost::system::error_code& ec)
   {
- return this->service.cancel(this->implementation, ec);
+ return this->get_service().cancel(this->get_implementation(), ec);
   }
 
   /// Send a break sequence to the serial port.
@@ -314,7 +352,7 @@
   void send_break()
   {
     boost::system::error_code ec;
- this->service.send_break(this->implementation, ec);
+ this->get_service().send_break(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "send_break");
   }
 
@@ -327,7 +365,7 @@
    */
   boost::system::error_code send_break(boost::system::error_code& ec)
   {
- return this->service.send_break(this->implementation, ec);
+ return this->get_service().send_break(this->get_implementation(), ec);
   }
 
   /// Set an option on the serial port.
@@ -349,7 +387,7 @@
   void set_option(const SettableSerialPortOption& option)
   {
     boost::system::error_code ec;
- this->service.set_option(this->implementation, option, ec);
+ this->get_service().set_option(this->get_implementation(), option, ec);
     boost::asio::detail::throw_error(ec, "set_option");
   }
 
@@ -372,7 +410,8 @@
   boost::system::error_code set_option(const SettableSerialPortOption& option,
       boost::system::error_code& ec)
   {
- return this->service.set_option(this->implementation, option, ec);
+ return this->get_service().set_option(
+ this->get_implementation(), option, ec);
   }
 
   /// Get an option from the serial port.
@@ -395,7 +434,7 @@
   void get_option(GettableSerialPortOption& option)
   {
     boost::system::error_code ec;
- this->service.get_option(this->implementation, option, ec);
+ this->get_service().get_option(this->get_implementation(), option, ec);
     boost::asio::detail::throw_error(ec, "get_option");
   }
 
@@ -419,7 +458,8 @@
   boost::system::error_code get_option(GettableSerialPortOption& option,
       boost::system::error_code& ec)
   {
- return this->service.get_option(this->implementation, option, ec);
+ return this->get_service().get_option(
+ this->get_implementation(), option, ec);
   }
 
   /// Write some data to the serial port.
@@ -453,7 +493,8 @@
   std::size_t write_some(const ConstBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.write_some(this->implementation, buffers, ec);
+ std::size_t s = this->get_service().write_some(
+ this->get_implementation(), buffers, ec);
     boost::asio::detail::throw_error(ec, "write_some");
     return s;
   }
@@ -478,7 +519,8 @@
   std::size_t write_some(const ConstBufferSequence& buffers,
       boost::system::error_code& ec)
   {
- return this->service.write_some(this->implementation, buffers, ec);
+ return this->get_service().write_some(
+ this->get_implementation(), buffers, ec);
   }
 
   /// Start an asynchronous write.
@@ -524,8 +566,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_write_some(this->implementation, buffers,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_write_some(this->get_implementation(),
+ buffers, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Read some data from the serial port.
@@ -560,7 +602,8 @@
   std::size_t read_some(const MutableBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.read_some(this->implementation, buffers, ec);
+ std::size_t s = this->get_service().read_some(
+ this->get_implementation(), buffers, ec);
     boost::asio::detail::throw_error(ec, "read_some");
     return s;
   }
@@ -586,7 +629,8 @@
   std::size_t read_some(const MutableBufferSequence& buffers,
       boost::system::error_code& ec)
   {
- return this->service.read_some(this->implementation, buffers, ec);
+ return this->get_service().read_some(
+ this->get_implementation(), buffers, ec);
   }
 
   /// Start an asynchronous read.
@@ -633,8 +677,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_read_some(this->implementation, buffers,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_read_some(this->get_implementation(),
+ buffers, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 };
 

Modified: trunk/boost/asio/basic_socket.hpp
==============================================================================
--- trunk/boost/asio/basic_socket.hpp (original)
+++ trunk/boost/asio/basic_socket.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -86,7 +86,7 @@
     : basic_io_object<SocketService>(io_service)
   {
     boost::system::error_code ec;
- this->service.open(this->implementation, protocol, ec);
+ this->get_service().open(this->get_implementation(), protocol, ec);
     boost::asio::detail::throw_error(ec, "open");
   }
 
@@ -110,9 +110,10 @@
     : basic_io_object<SocketService>(io_service)
   {
     boost::system::error_code ec;
- this->service.open(this->implementation, endpoint.protocol(), ec);
+ const protocol_type protocol = endpoint.protocol();
+ this->get_service().open(this->get_implementation(), protocol, ec);
     boost::asio::detail::throw_error(ec, "open");
- this->service.bind(this->implementation, endpoint, ec);
+ this->get_service().bind(this->get_implementation(), endpoint, ec);
     boost::asio::detail::throw_error(ec, "bind");
   }
 
@@ -134,10 +135,46 @@
     : basic_io_object<SocketService>(io_service)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, protocol, native_socket, ec);
+ this->get_service().assign(this->get_implementation(),
+ protocol, native_socket, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_socket from another.
+ /**
+ * This constructor moves a socket from one object to another.
+ *
+ * @param other The other basic_socket object from which the move will
+ * occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_socket(io_service&) constructor.
+ */
+ basic_socket(basic_socket&& other)
+ : basic_io_object<SocketService>(
+ BOOST_ASIO_MOVE_CAST(basic_socket)(other))
+ {
+ }
+
+ /// Move-assign a basic_socket from another.
+ /**
+ * This assignment operator moves a socket from one object to another.
+ *
+ * @param other The other basic_socket object from which the move will
+ * occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_socket(io_service&) constructor.
+ */
+ basic_socket& operator=(basic_socket&& other)
+ {
+ basic_io_object<SocketService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_socket)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Get a reference to the lowest layer.
   /**
    * This function returns a reference to the lowest layer in a stack of
@@ -183,7 +220,7 @@
   void open(const protocol_type& protocol = protocol_type())
   {
     boost::system::error_code ec;
- this->service.open(this->implementation, protocol, ec);
+ this->get_service().open(this->get_implementation(), protocol, ec);
     boost::asio::detail::throw_error(ec, "open");
   }
 
@@ -209,7 +246,7 @@
   boost::system::error_code open(const protocol_type& protocol,
       boost::system::error_code& ec)
   {
- return this->service.open(this->implementation, protocol, ec);
+ return this->get_service().open(this->get_implementation(), protocol, ec);
   }
 
   /// Assign an existing native socket to the socket.
@@ -226,7 +263,8 @@
       const native_handle_type& native_socket)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, protocol, native_socket, ec);
+ this->get_service().assign(this->get_implementation(),
+ protocol, native_socket, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
@@ -243,14 +281,14 @@
   boost::system::error_code assign(const protocol_type& protocol,
       const native_handle_type& native_socket, boost::system::error_code& ec)
   {
- return this->service.assign(this->implementation,
+ return this->get_service().assign(this->get_implementation(),
         protocol, native_socket, ec);
   }
 
   /// Determine whether the socket is open.
   bool is_open() const
   {
- return this->service.is_open(this->implementation);
+ return this->get_service().is_open(this->get_implementation());
   }
 
   /// Close the socket.
@@ -268,7 +306,7 @@
   void close()
   {
     boost::system::error_code ec;
- this->service.close(this->implementation, ec);
+ this->get_service().close(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "close");
   }
 
@@ -298,7 +336,7 @@
    */
   boost::system::error_code close(boost::system::error_code& ec)
   {
- return this->service.close(this->implementation, ec);
+ return this->get_service().close(this->get_implementation(), ec);
   }
 
   /// (Deprecated: Use native_handle().) Get the native socket representation.
@@ -309,7 +347,7 @@
    */
   native_type native()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->get_implementation());
   }
 
   /// Get the native socket representation.
@@ -320,7 +358,7 @@
    */
   native_handle_type native_handle()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->get_implementation());
   }
 
   /// Cancel all asynchronous operations associated with the socket.
@@ -367,7 +405,7 @@
   void cancel()
   {
     boost::system::error_code ec;
- this->service.cancel(this->implementation, ec);
+ this->get_service().cancel(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "cancel");
   }
 
@@ -414,7 +452,7 @@
 #endif
   boost::system::error_code cancel(boost::system::error_code& ec)
   {
- return this->service.cancel(this->implementation, ec);
+ return this->get_service().cancel(this->get_implementation(), ec);
   }
 
   /// Determine whether the socket is at the out-of-band data mark.
@@ -430,7 +468,7 @@
   bool at_mark() const
   {
     boost::system::error_code ec;
- bool b = this->service.at_mark(this->implementation, ec);
+ bool b = this->get_service().at_mark(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "at_mark");
     return b;
   }
@@ -447,7 +485,7 @@
    */
   bool at_mark(boost::system::error_code& ec) const
   {
- return this->service.at_mark(this->implementation, ec);
+ return this->get_service().at_mark(this->get_implementation(), ec);
   }
 
   /// Determine the number of bytes available for reading.
@@ -463,7 +501,8 @@
   std::size_t available() const
   {
     boost::system::error_code ec;
- std::size_t s = this->service.available(this->implementation, ec);
+ std::size_t s = this->get_service().available(
+ this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "available");
     return s;
   }
@@ -480,7 +519,7 @@
    */
   std::size_t available(boost::system::error_code& ec) const
   {
- return this->service.available(this->implementation, ec);
+ return this->get_service().available(this->get_implementation(), ec);
   }
 
   /// Bind the socket to the given local endpoint.
@@ -504,7 +543,7 @@
   void bind(const endpoint_type& endpoint)
   {
     boost::system::error_code ec;
- this->service.bind(this->implementation, endpoint, ec);
+ this->get_service().bind(this->get_implementation(), endpoint, ec);
     boost::asio::detail::throw_error(ec, "bind");
   }
 
@@ -534,7 +573,7 @@
   boost::system::error_code bind(const endpoint_type& endpoint,
       boost::system::error_code& ec)
   {
- return this->service.bind(this->implementation, endpoint, ec);
+ return this->get_service().bind(this->get_implementation(), endpoint, ec);
   }
 
   /// Connect the socket to the specified endpoint.
@@ -565,10 +604,11 @@
     boost::system::error_code ec;
     if (!is_open())
     {
- this->service.open(this->implementation, peer_endpoint.protocol(), ec);
+ this->get_service().open(this->get_implementation(),
+ peer_endpoint.protocol(), ec);
       boost::asio::detail::throw_error(ec, "connect");
     }
- this->service.connect(this->implementation, peer_endpoint, ec);
+ this->get_service().connect(this->get_implementation(), peer_endpoint, ec);
     boost::asio::detail::throw_error(ec, "connect");
   }
 
@@ -605,14 +645,15 @@
   {
     if (!is_open())
     {
- if (this->service.open(this->implementation,
+ if (this->get_service().open(this->get_implementation(),
             peer_endpoint.protocol(), ec))
       {
         return ec;
       }
     }
 
- return this->service.connect(this->implementation, peer_endpoint, ec);
+ return this->get_service().connect(
+ this->get_implementation(), peer_endpoint, ec);
   }
 
   /// Start an asynchronous connect.
@@ -666,8 +707,8 @@
     if (!is_open())
     {
       boost::system::error_code ec;
- if (this->service.open(this->implementation,
- peer_endpoint.protocol(), ec))
+ const protocol_type protocol = peer_endpoint.protocol();
+ if (this->get_service().open(this->get_implementation(), protocol, ec))
       {
         this->get_io_service().post(
             boost::asio::detail::bind_handler(handler, ec));
@@ -675,8 +716,8 @@
       }
     }
 
- this->service.async_connect(this->implementation, peer_endpoint,
- BOOST_ASIO_MOVE_CAST(ConnectHandler)(handler));
+ this->get_service().async_connect(this->get_implementation(),
+ peer_endpoint, BOOST_ASIO_MOVE_CAST(ConnectHandler)(handler));
   }
 
   /// Set an option on the socket.
@@ -717,7 +758,7 @@
   void set_option(const SettableSocketOption& option)
   {
     boost::system::error_code ec;
- this->service.set_option(this->implementation, option, ec);
+ this->get_service().set_option(this->get_implementation(), option, ec);
     boost::asio::detail::throw_error(ec, "set_option");
   }
 
@@ -764,7 +805,8 @@
   boost::system::error_code set_option(const SettableSocketOption& option,
       boost::system::error_code& ec)
   {
- return this->service.set_option(this->implementation, option, ec);
+ return this->get_service().set_option(
+ this->get_implementation(), option, ec);
   }
 
   /// Get an option from the socket.
@@ -806,7 +848,7 @@
   void get_option(GettableSocketOption& option) const
   {
     boost::system::error_code ec;
- this->service.get_option(this->implementation, option, ec);
+ this->get_service().get_option(this->get_implementation(), option, ec);
     boost::asio::detail::throw_error(ec, "get_option");
   }
 
@@ -854,7 +896,8 @@
   boost::system::error_code get_option(GettableSocketOption& option,
       boost::system::error_code& ec) const
   {
- return this->service.get_option(this->implementation, option, ec);
+ return this->get_service().get_option(
+ this->get_implementation(), option, ec);
   }
 
   /// Perform an IO control command on the socket.
@@ -883,7 +926,7 @@
   void io_control(IoControlCommand& command)
   {
     boost::system::error_code ec;
- this->service.io_control(this->implementation, command, ec);
+ this->get_service().io_control(this->get_implementation(), command, ec);
     boost::asio::detail::throw_error(ec, "io_control");
   }
 
@@ -918,7 +961,8 @@
   boost::system::error_code io_control(IoControlCommand& command,
       boost::system::error_code& ec)
   {
- return this->service.io_control(this->implementation, command, ec);
+ return this->get_service().io_control(
+ this->get_implementation(), command, ec);
   }
 
   /// Gets the non-blocking mode of the socket.
@@ -934,7 +978,7 @@
    */
   bool non_blocking() const
   {
- return this->service.non_blocking(this->implementation);
+ return this->get_service().non_blocking(this->get_implementation());
   }
 
   /// Sets the non-blocking mode of the socket.
@@ -953,7 +997,7 @@
   void non_blocking(bool mode)
   {
     boost::system::error_code ec;
- this->service.non_blocking(this->implementation, mode, ec);
+ this->get_service().non_blocking(this->get_implementation(), mode, ec);
     boost::asio::detail::throw_error(ec, "non_blocking");
   }
 
@@ -973,7 +1017,8 @@
   boost::system::error_code non_blocking(
       bool mode, boost::system::error_code& ec)
   {
- return this->service.non_blocking(this->implementation, mode, ec);
+ return this->get_service().non_blocking(
+ this->get_implementation(), mode, ec);
   }
 
   /// Gets the non-blocking mode of the native socket implementation.
@@ -1062,7 +1107,7 @@
    */
   bool native_non_blocking() const
   {
- return this->service.native_non_blocking(this->implementation);
+ return this->get_service().native_non_blocking(this->get_implementation());
   }
 
   /// Sets the non-blocking mode of the native socket implementation.
@@ -1153,7 +1198,8 @@
   void native_non_blocking(bool mode)
   {
     boost::system::error_code ec;
- this->service.native_non_blocking(this->implementation, mode, ec);
+ this->get_service().native_non_blocking(
+ this->get_implementation(), mode, ec);
     boost::asio::detail::throw_error(ec, "native_non_blocking");
   }
 
@@ -1245,7 +1291,8 @@
   boost::system::error_code native_non_blocking(
       bool mode, boost::system::error_code& ec)
   {
- return this->service.native_non_blocking(this->implementation, mode, ec);
+ return this->get_service().native_non_blocking(
+ this->get_implementation(), mode, ec);
   }
 
   /// Get the local endpoint of the socket.
@@ -1266,7 +1313,8 @@
   endpoint_type local_endpoint() const
   {
     boost::system::error_code ec;
- endpoint_type ep = this->service.local_endpoint(this->implementation, ec);
+ endpoint_type ep = this->get_service().local_endpoint(
+ this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "local_endpoint");
     return ep;
   }
@@ -1294,7 +1342,7 @@
    */
   endpoint_type local_endpoint(boost::system::error_code& ec) const
   {
- return this->service.local_endpoint(this->implementation, ec);
+ return this->get_service().local_endpoint(this->get_implementation(), ec);
   }
 
   /// Get the remote endpoint of the socket.
@@ -1315,7 +1363,8 @@
   endpoint_type remote_endpoint() const
   {
     boost::system::error_code ec;
- endpoint_type ep = this->service.remote_endpoint(this->implementation, ec);
+ endpoint_type ep = this->get_service().remote_endpoint(
+ this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "remote_endpoint");
     return ep;
   }
@@ -1343,7 +1392,7 @@
    */
   endpoint_type remote_endpoint(boost::system::error_code& ec) const
   {
- return this->service.remote_endpoint(this->implementation, ec);
+ return this->get_service().remote_endpoint(this->get_implementation(), ec);
   }
 
   /// Disable sends or receives on the socket.
@@ -1366,7 +1415,7 @@
   void shutdown(shutdown_type what)
   {
     boost::system::error_code ec;
- this->service.shutdown(this->implementation, what, ec);
+ this->get_service().shutdown(this->get_implementation(), what, ec);
     boost::asio::detail::throw_error(ec, "shutdown");
   }
 
@@ -1395,7 +1444,7 @@
   boost::system::error_code shutdown(shutdown_type what,
       boost::system::error_code& ec)
   {
- return this->service.shutdown(this->implementation, what, ec);
+ return this->get_service().shutdown(this->get_implementation(), what, ec);
   }
 
 protected:

Modified: trunk/boost/asio/basic_socket_acceptor.hpp
==============================================================================
--- trunk/boost/asio/basic_socket_acceptor.hpp (original)
+++ trunk/boost/asio/basic_socket_acceptor.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -101,7 +101,7 @@
     : basic_io_object<SocketAcceptorService>(io_service)
   {
     boost::system::error_code ec;
- this->service.open(this->implementation, protocol, ec);
+ this->get_service().open(this->get_implementation(), protocol, ec);
     boost::asio::detail::throw_error(ec, "open");
   }
 
@@ -137,17 +137,18 @@
     : basic_io_object<SocketAcceptorService>(io_service)
   {
     boost::system::error_code ec;
- this->service.open(this->implementation, endpoint.protocol(), ec);
+ const protocol_type protocol = endpoint.protocol();
+ this->get_service().open(this->get_implementation(), protocol, ec);
     boost::asio::detail::throw_error(ec, "open");
     if (reuse_addr)
     {
- this->service.set_option(this->implementation,
+ this->get_service().set_option(this->get_implementation(),
           socket_base::reuse_address(true), ec);
       boost::asio::detail::throw_error(ec, "set_option");
     }
- this->service.bind(this->implementation, endpoint, ec);
+ this->get_service().bind(this->get_implementation(), endpoint, ec);
     boost::asio::detail::throw_error(ec, "bind");
- this->service.listen(this->implementation,
+ this->get_service().listen(this->get_implementation(),
         socket_base::max_connections, ec);
     boost::asio::detail::throw_error(ec, "listen");
   }
@@ -172,10 +173,46 @@
     : basic_io_object<SocketAcceptorService>(io_service)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, protocol, native_acceptor, ec);
+ this->get_service().assign(this->get_implementation(),
+ protocol, native_acceptor, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_socket_acceptor from another.
+ /**
+ * This constructor moves an acceptor from one object to another.
+ *
+ * @param other The other basic_socket_acceptor object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_socket_acceptor(io_service&) constructor.
+ */
+ basic_socket_acceptor(basic_socket_acceptor&& other)
+ : basic_io_object<SocketAcceptorService>(
+ BOOST_ASIO_MOVE_CAST(basic_socket_acceptor)(other))
+ {
+ }
+
+ /// Move-assign a basic_socket_acceptor from another.
+ /**
+ * This assignment operator moves an acceptor from one object to another.
+ *
+ * @param other The other basic_socket_acceptor object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_socket_acceptor(io_service&) constructor.
+ */
+ basic_socket_acceptor& operator=(basic_socket_acceptor&& other)
+ {
+ basic_io_object<SocketAcceptorService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_socket_acceptor)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Open the acceptor using the specified protocol.
   /**
    * This function opens the socket acceptor so that it will use the specified
@@ -194,7 +231,7 @@
   void open(const protocol_type& protocol = protocol_type())
   {
     boost::system::error_code ec;
- this->service.open(this->implementation, protocol, ec);
+ this->get_service().open(this->get_implementation(), protocol, ec);
     boost::asio::detail::throw_error(ec, "open");
   }
 
@@ -221,7 +258,7 @@
   boost::system::error_code open(const protocol_type& protocol,
       boost::system::error_code& ec)
   {
- return this->service.open(this->implementation, protocol, ec);
+ return this->get_service().open(this->get_implementation(), protocol, ec);
   }
 
   /// Assigns an existing native acceptor to the acceptor.
@@ -238,7 +275,8 @@
       const native_handle_type& native_acceptor)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, protocol, native_acceptor, ec);
+ this->get_service().assign(this->get_implementation(),
+ protocol, native_acceptor, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
@@ -255,14 +293,14 @@
   boost::system::error_code assign(const protocol_type& protocol,
       const native_handle_type& native_acceptor, boost::system::error_code& ec)
   {
- return this->service.assign(this->implementation,
+ return this->get_service().assign(this->get_implementation(),
         protocol, native_acceptor, ec);
   }
 
   /// Determine whether the acceptor is open.
   bool is_open() const
   {
- return this->service.is_open(this->implementation);
+ return this->get_service().is_open(this->get_implementation());
   }
 
   /// Bind the acceptor to the given local endpoint.
@@ -285,7 +323,7 @@
   void bind(const endpoint_type& endpoint)
   {
     boost::system::error_code ec;
- this->service.bind(this->implementation, endpoint, ec);
+ this->get_service().bind(this->get_implementation(), endpoint, ec);
     boost::asio::detail::throw_error(ec, "bind");
   }
 
@@ -314,7 +352,7 @@
   boost::system::error_code bind(const endpoint_type& endpoint,
       boost::system::error_code& ec)
   {
- return this->service.bind(this->implementation, endpoint, ec);
+ return this->get_service().bind(this->get_implementation(), endpoint, ec);
   }
 
   /// Place the acceptor into the state where it will listen for new
@@ -330,7 +368,7 @@
   void listen(int backlog = socket_base::max_connections)
   {
     boost::system::error_code ec;
- this->service.listen(this->implementation, backlog, ec);
+ this->get_service().listen(this->get_implementation(), backlog, ec);
     boost::asio::detail::throw_error(ec, "listen");
   }
 
@@ -358,7 +396,7 @@
    */
   boost::system::error_code listen(int backlog, boost::system::error_code& ec)
   {
- return this->service.listen(this->implementation, backlog, ec);
+ return this->get_service().listen(this->get_implementation(), backlog, ec);
   }
 
   /// Close the acceptor.
@@ -374,7 +412,7 @@
   void close()
   {
     boost::system::error_code ec;
- this->service.close(this->implementation, ec);
+ this->get_service().close(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "close");
   }
 
@@ -402,7 +440,7 @@
    */
   boost::system::error_code close(boost::system::error_code& ec)
   {
- return this->service.close(this->implementation, ec);
+ return this->get_service().close(this->get_implementation(), ec);
   }
 
   /// (Deprecated: Use native_handle().) Get the native acceptor representation.
@@ -413,7 +451,7 @@
    */
   native_type native()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->get_implementation());
   }
 
   /// Get the native acceptor representation.
@@ -424,7 +462,7 @@
    */
   native_handle_type native_handle()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->get_implementation());
   }
 
   /// Cancel all asynchronous operations associated with the acceptor.
@@ -438,7 +476,7 @@
   void cancel()
   {
     boost::system::error_code ec;
- this->service.cancel(this->implementation, ec);
+ this->get_service().cancel(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "cancel");
   }
 
@@ -452,7 +490,7 @@
    */
   boost::system::error_code cancel(boost::system::error_code& ec)
   {
- return this->service.cancel(this->implementation, ec);
+ return this->get_service().cancel(this->get_implementation(), ec);
   }
 
   /// Set an option on the acceptor.
@@ -480,7 +518,7 @@
   void set_option(const SettableSocketOption& option)
   {
     boost::system::error_code ec;
- this->service.set_option(this->implementation, option, ec);
+ this->get_service().set_option(this->get_implementation(), option, ec);
     boost::asio::detail::throw_error(ec, "set_option");
   }
 
@@ -514,7 +552,8 @@
   boost::system::error_code set_option(const SettableSocketOption& option,
       boost::system::error_code& ec)
   {
- return this->service.set_option(this->implementation, option, ec);
+ return this->get_service().set_option(
+ this->get_implementation(), option, ec);
   }
 
   /// Get an option from the acceptor.
@@ -543,7 +582,7 @@
   void get_option(GettableSocketOption& option)
   {
     boost::system::error_code ec;
- this->service.get_option(this->implementation, option, ec);
+ this->get_service().get_option(this->get_implementation(), option, ec);
     boost::asio::detail::throw_error(ec, "get_option");
   }
 
@@ -578,7 +617,8 @@
   boost::system::error_code get_option(GettableSocketOption& option,
       boost::system::error_code& ec)
   {
- return this->service.get_option(this->implementation, option, ec);
+ return this->get_service().get_option(
+ this->get_implementation(), option, ec);
   }
 
   /// Perform an IO control command on the acceptor.
@@ -605,7 +645,7 @@
   void io_control(IoControlCommand& command)
   {
     boost::system::error_code ec;
- this->service.io_control(this->implementation, command, ec);
+ this->get_service().io_control(this->get_implementation(), command, ec);
     boost::asio::detail::throw_error(ec, "io_control");
   }
 
@@ -638,7 +678,8 @@
   boost::system::error_code io_control(IoControlCommand& command,
       boost::system::error_code& ec)
   {
- return this->service.io_control(this->implementation, command, ec);
+ return this->get_service().io_control(
+ this->get_implementation(), command, ec);
   }
 
   /// Gets the non-blocking mode of the acceptor.
@@ -654,7 +695,7 @@
    */
   bool non_blocking() const
   {
- return this->service.non_blocking(this->implementation);
+ return this->get_service().non_blocking(this->get_implementation());
   }
 
   /// Sets the non-blocking mode of the acceptor.
@@ -673,7 +714,7 @@
   void non_blocking(bool mode)
   {
     boost::system::error_code ec;
- this->service.non_blocking(this->implementation, mode, ec);
+ this->get_service().non_blocking(this->get_implementation(), mode, ec);
     boost::asio::detail::throw_error(ec, "non_blocking");
   }
 
@@ -693,7 +734,8 @@
   boost::system::error_code non_blocking(
       bool mode, boost::system::error_code& ec)
   {
- return this->service.non_blocking(this->implementation, mode, ec);
+ return this->get_service().non_blocking(
+ this->get_implementation(), mode, ec);
   }
 
   /// Gets the non-blocking mode of the native acceptor implementation.
@@ -712,7 +754,7 @@
    */
   bool native_non_blocking() const
   {
- return this->service.native_non_blocking(this->implementation);
+ return this->get_service().native_non_blocking(this->get_implementation());
   }
 
   /// Sets the non-blocking mode of the native acceptor implementation.
@@ -733,7 +775,8 @@
   void native_non_blocking(bool mode)
   {
     boost::system::error_code ec;
- this->service.native_non_blocking(this->implementation, mode, ec);
+ this->get_service().native_non_blocking(
+ this->get_implementation(), mode, ec);
     boost::asio::detail::throw_error(ec, "native_non_blocking");
   }
 
@@ -755,7 +798,8 @@
   boost::system::error_code native_non_blocking(
       bool mode, boost::system::error_code& ec)
   {
- return this->service.native_non_blocking(this->implementation, mode, ec);
+ return this->get_service().native_non_blocking(
+ this->get_implementation(), mode, ec);
   }
 
   /// Get the local endpoint of the acceptor.
@@ -776,7 +820,8 @@
   endpoint_type local_endpoint() const
   {
     boost::system::error_code ec;
- endpoint_type ep = this->service.local_endpoint(this->implementation, ec);
+ endpoint_type ep = this->get_service().local_endpoint(
+ this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "local_endpoint");
     return ep;
   }
@@ -805,7 +850,7 @@
    */
   endpoint_type local_endpoint(boost::system::error_code& ec) const
   {
- return this->service.local_endpoint(this->implementation, ec);
+ return this->get_service().local_endpoint(this->get_implementation(), ec);
   }
 
   /// Accept a new connection.
@@ -830,7 +875,7 @@
   void accept(basic_socket<protocol_type, SocketService>& peer)
   {
     boost::system::error_code ec;
- this->service.accept(this->implementation, peer, 0, ec);
+ this->get_service().accept(this->get_implementation(), peer, 0, ec);
     boost::asio::detail::throw_error(ec, "accept");
   }
 
@@ -862,7 +907,7 @@
       basic_socket<protocol_type, SocketService>& peer,
       boost::system::error_code& ec)
   {
- return this->service.accept(this->implementation, peer, 0, ec);
+ return this->get_service().accept(this->get_implementation(), peer, 0, ec);
   }
 
   /// Start an asynchronous accept.
@@ -911,8 +956,8 @@
     // not meet the documented type requirements for a AcceptHandler.
     BOOST_ASIO_ACCEPT_HANDLER_CHECK(AcceptHandler, handler) type_check;
 
- this->service.async_accept(this->implementation, peer, 0,
- BOOST_ASIO_MOVE_CAST(AcceptHandler)(handler));
+ this->get_service().async_accept(this->get_implementation(),
+ peer, 0, BOOST_ASIO_MOVE_CAST(AcceptHandler)(handler));
   }
 
   /// Accept a new connection and obtain the endpoint of the peer
@@ -943,7 +988,8 @@
       endpoint_type& peer_endpoint)
   {
     boost::system::error_code ec;
- this->service.accept(this->implementation, peer, &peer_endpoint, ec);
+ this->get_service().accept(this->get_implementation(),
+ peer, &peer_endpoint, ec);
     boost::asio::detail::throw_error(ec, "accept");
   }
 
@@ -980,7 +1026,8 @@
       basic_socket<protocol_type, SocketService>& peer,
       endpoint_type& peer_endpoint, boost::system::error_code& ec)
   {
- return this->service.accept(this->implementation, peer, &peer_endpoint, ec);
+ return this->get_service().accept(
+ this->get_implementation(), peer, &peer_endpoint, ec);
   }
 
   /// Start an asynchronous accept.
@@ -1017,7 +1064,7 @@
     // not meet the documented type requirements for a AcceptHandler.
     BOOST_ASIO_ACCEPT_HANDLER_CHECK(AcceptHandler, handler) type_check;
 
- this->service.async_accept(this->implementation, peer,
+ this->get_service().async_accept(this->get_implementation(), peer,
         &peer_endpoint, BOOST_ASIO_MOVE_CAST(AcceptHandler)(handler));
   }
 };

Modified: trunk/boost/asio/basic_socket_streambuf.hpp
==============================================================================
--- trunk/boost/asio/basic_socket_streambuf.hpp (original)
+++ trunk/boost/asio/basic_socket_streambuf.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -145,8 +145,8 @@
         endpoint, handler);
 
     ec_ = boost::asio::error::would_block;
- this->service.get_io_service().reset();
- do this->service.get_io_service().run_one();
+ this->get_service().get_io_service().reset();
+ do this->get_service().get_io_service().run_one();
     while (ec_ == boost::asio::error::would_block);
 
     return !ec_ ? this : 0;
@@ -269,13 +269,13 @@
       }
 
       io_handler handler = { this };
- this->service.async_receive(this->implementation,
+ this->get_service().async_receive(this->get_implementation(),
           boost::asio::buffer(boost::asio::buffer(get_buffer_) + putback_max),
           0, handler);
 
       ec_ = boost::asio::error::would_block;
- this->service.get_io_service().reset();
- do this->service.get_io_service().run_one();
+ this->get_service().get_io_service().reset();
+ do this->get_service().get_io_service().run_one();
       while (ec_ == boost::asio::error::would_block);
       if (ec_)
         return traits_type::eof();
@@ -310,12 +310,12 @@
         // Send the single character immediately.
         char_type ch = traits_type::to_char_type(c);
         io_handler handler = { this };
- this->service.async_send(this->implementation,
+ this->get_service().async_send(this->get_implementation(),
             boost::asio::buffer(&ch, sizeof(char_type)), 0, handler);
 
         ec_ = boost::asio::error::would_block;
- this->service.get_io_service().reset();
- do this->service.get_io_service().run_one();
+ this->get_service().get_io_service().reset();
+ do this->get_service().get_io_service().run_one();
         while (ec_ == boost::asio::error::would_block);
         if (ec_)
           return traits_type::eof();
@@ -337,12 +337,12 @@
         }
 
         io_handler handler = { this };
- this->service.async_send(this->implementation,
+ this->get_service().async_send(this->get_implementation(),
             boost::asio::buffer(buffer), 0, handler);
 
         ec_ = boost::asio::error::would_block;
- this->service.get_io_service().reset();
- do this->service.get_io_service().run_one();
+ this->get_service().get_io_service().reset();
+ do this->get_service().get_io_service().run_one();
         while (ec_ == boost::asio::error::would_block);
         if (ec_)
           return traits_type::eof();
@@ -428,8 +428,8 @@
             *i, handler);
 
         ec_ = boost::asio::error::would_block;
- this->service.get_io_service().reset();
- do this->service.get_io_service().run_one();
+ this->get_service().get_io_service().reset();
+ do this->get_service().get_io_service().run_one();
         while (ec_ == boost::asio::error::would_block);
 
         ++i;

Modified: trunk/boost/asio/basic_stream_socket.hpp
==============================================================================
--- trunk/boost/asio/basic_stream_socket.hpp (original)
+++ trunk/boost/asio/basic_stream_socket.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -133,6 +133,41 @@
   {
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_stream_socket from another.
+ /**
+ * This constructor moves a stream socket from one object to another.
+ *
+ * @param other The other basic_stream_socket object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_stream_socket(io_service&) constructor.
+ */
+ basic_stream_socket(basic_stream_socket&& other)
+ : basic_socket<Protocol, StreamSocketService>(
+ BOOST_ASIO_MOVE_CAST(basic_stream_socket)(other))
+ {
+ }
+
+ /// Move-assign a basic_stream_socket from another.
+ /**
+ * This assignment operator moves a stream socket from one object to another.
+ *
+ * @param other The other basic_stream_socket object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_stream_socket(io_service&) constructor.
+ */
+ basic_stream_socket& operator=(basic_stream_socket&& other)
+ {
+ basic_socket<Protocol, StreamSocketService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_stream_socket)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Send some data on the socket.
   /**
    * This function is used to send data on the stream socket. The function
@@ -162,8 +197,8 @@
   std::size_t send(const ConstBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send(
- this->implementation, buffers, 0, ec);
+ std::size_t s = this->get_service().send(
+ this->get_implementation(), buffers, 0, ec);
     boost::asio::detail::throw_error(ec, "send");
     return s;
   }
@@ -200,8 +235,8 @@
       socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send(
- this->implementation, buffers, flags, ec);
+ std::size_t s = this->get_service().send(
+ this->get_implementation(), buffers, flags, ec);
     boost::asio::detail::throw_error(ec, "send");
     return s;
   }
@@ -228,7 +263,8 @@
   std::size_t send(const ConstBufferSequence& buffers,
       socket_base::message_flags flags, boost::system::error_code& ec)
   {
- return this->service.send(this->implementation, buffers, flags, ec);
+ return this->get_service().send(
+ this->get_implementation(), buffers, flags, ec);
   }
 
   /// Start an asynchronous send.
@@ -273,7 +309,7 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send(this->implementation, buffers, 0,
+ this->get_service().async_send(this->get_implementation(), buffers, 0,
         BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
@@ -322,7 +358,7 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send(this->implementation, buffers, flags,
+ this->get_service().async_send(this->get_implementation(), buffers, flags,
         BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
@@ -358,7 +394,8 @@
   std::size_t receive(const MutableBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive(this->implementation, buffers, 0, ec);
+ std::size_t s = this->get_service().receive(
+ this->get_implementation(), buffers, 0, ec);
     boost::asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -398,8 +435,8 @@
       socket_base::message_flags flags)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive(
- this->implementation, buffers, flags, ec);
+ std::size_t s = this->get_service().receive(
+ this->get_implementation(), buffers, flags, ec);
     boost::asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -426,7 +463,8 @@
   std::size_t receive(const MutableBufferSequence& buffers,
       socket_base::message_flags flags, boost::system::error_code& ec)
   {
- return this->service.receive(this->implementation, buffers, flags, ec);
+ return this->get_service().receive(
+ this->get_implementation(), buffers, flags, ec);
   }
 
   /// Start an asynchronous receive.
@@ -473,8 +511,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive(this->implementation, buffers, 0,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_receive(this->get_implementation(),
+ buffers, 0, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 
   /// Start an asynchronous receive.
@@ -524,8 +562,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive(this->implementation, buffers, flags,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_receive(this->get_implementation(),
+ buffers, flags, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 
   /// Write some data to the socket.
@@ -559,7 +597,8 @@
   std::size_t write_some(const ConstBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.send(this->implementation, buffers, 0, ec);
+ std::size_t s = this->get_service().send(
+ this->get_implementation(), buffers, 0, ec);
     boost::asio::detail::throw_error(ec, "write_some");
     return s;
   }
@@ -584,7 +623,7 @@
   std::size_t write_some(const ConstBufferSequence& buffers,
       boost::system::error_code& ec)
   {
- return this->service.send(this->implementation, buffers, 0, ec);
+ return this->get_service().send(this->get_implementation(), buffers, 0, ec);
   }
 
   /// Start an asynchronous write.
@@ -630,8 +669,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_send(this->implementation, buffers, 0,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_send(this->get_implementation(),
+ buffers, 0, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Read some data from the socket.
@@ -666,7 +705,8 @@
   std::size_t read_some(const MutableBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.receive(this->implementation, buffers, 0, ec);
+ std::size_t s = this->get_service().receive(
+ this->get_implementation(), buffers, 0, ec);
     boost::asio::detail::throw_error(ec, "read_some");
     return s;
   }
@@ -692,7 +732,8 @@
   std::size_t read_some(const MutableBufferSequence& buffers,
       boost::system::error_code& ec)
   {
- return this->service.receive(this->implementation, buffers, 0, ec);
+ return this->get_service().receive(
+ this->get_implementation(), buffers, 0, ec);
   }
 
   /// Start an asynchronous read.
@@ -739,8 +780,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_receive(this->implementation, buffers, 0,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_receive(this->get_implementation(),
+ buffers, 0, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 };
 

Modified: trunk/boost/asio/datagram_socket_service.hpp
==============================================================================
--- trunk/boost/asio/datagram_socket_service.hpp (original)
+++ trunk/boost/asio/datagram_socket_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -96,6 +96,23 @@
     service_impl_.construct(impl);
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a new datagram socket implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_construct(impl, other_impl);
+ }
+
+ /// Move-assign from another datagram socket implementation.
+ void move_assign(implementation_type& impl,
+ datagram_socket_service& other_service,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_assign(impl, other_service.service_impl_, other_impl);
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Destroy a datagram socket implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/detail/config.hpp
==============================================================================
--- trunk/boost/asio/detail/config.hpp (original)
+++ trunk/boost/asio/detail/config.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -46,19 +46,23 @@
 # define BOOST_ASIO_DECL
 #endif // !defined(BOOST_ASIO_DECL)
 
-// Support move construction on compilers known to allow it.
-#if defined(__GNUC__)
-# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4)
-# if defined(__GXX_EXPERIMENTAL_CXX0X__)
+// Support move construction and assignment on compilers known to allow it.
+#if !defined(BOOST_ASIO_DISABLE_MOVE)
+# if defined(__GNUC__)
+# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4)
+# if defined(__GXX_EXPERIMENTAL_CXX0X__)
+# define BOOST_ASIO_HAS_MOVE
+# define BOOST_ASIO_MOVE_CAST(type) static_cast<type&&>
+# endif // defined(__GXX_EXPERIMENTAL_CXX0X__)
+# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4)
+# endif // defined(__GNUC__)
+# if defined(BOOST_MSVC)
+# if (_MSC_VER >= 1600)
+# define BOOST_ASIO_HAS_MOVE
 # define BOOST_ASIO_MOVE_CAST(type) static_cast<type&&>
-# endif // defined(__GXX_EXPERIMENTAL_CXX0X__)
-# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4)
-#endif // defined(__GNUC__)
-#if defined(BOOST_MSVC)
-# if (_MSC_VER >= 1600)
-# define BOOST_ASIO_MOVE_CAST(type) static_cast<type&&>
-# endif // (_MSC_VER >= 1600)
-#endif // defined(BOOST_MSVC)
+# endif // (_MSC_VER >= 1600)
+# endif // defined(BOOST_MSVC)
+#endif // !defined(BOOST_ASIO_DISABLE_MOVE)
 
 // If BOOST_ASIO_MOVE_CAST isn't defined yet use a C++03 compatible version.
 #if !defined(BOOST_ASIO_MOVE_CAST)

Modified: trunk/boost/asio/detail/dev_poll_reactor.hpp
==============================================================================
--- trunk/boost/asio/detail/dev_poll_reactor.hpp (original)
+++ trunk/boost/asio/detail/dev_poll_reactor.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -81,6 +81,11 @@
       int op_type, socket_type descriptor,
       per_descriptor_data& descriptor_data, reactor_op* op);
 
+ // Move descriptor registration from one descriptor_data object to another.
+ BOOST_ASIO_DECL void move_descriptor(socket_type descriptor,
+ per_descriptor_data& target_descriptor_data,
+ per_descriptor_data& source_descriptor_data);
+
   // Post a reactor operation for immediate completion.
   void post_immediate_completion(reactor_op* op)
   {

Modified: trunk/boost/asio/detail/epoll_reactor.hpp
==============================================================================
--- trunk/boost/asio/detail/epoll_reactor.hpp (original)
+++ trunk/boost/asio/detail/epoll_reactor.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -89,6 +89,11 @@
       int op_type, socket_type descriptor,
       per_descriptor_data& descriptor_data, reactor_op* op);
 
+ // Move descriptor registration from one descriptor_data object to another.
+ BOOST_ASIO_DECL void move_descriptor(socket_type descriptor,
+ per_descriptor_data& target_descriptor_data,
+ per_descriptor_data& source_descriptor_data);
+
   // Post a reactor operation for immediate completion.
   void post_immediate_completion(reactor_op* op)
   {

Modified: trunk/boost/asio/detail/impl/dev_poll_reactor.ipp
==============================================================================
--- trunk/boost/asio/detail/impl/dev_poll_reactor.ipp (original)
+++ trunk/boost/asio/detail/impl/dev_poll_reactor.ipp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -154,6 +154,12 @@
   return 0;
 }
 
+void dev_poll_reactor::move_descriptor(socket_type,
+ dev_poll_reactor::per_descriptor_data&,
+ dev_poll_reactor::per_descriptor_data&)
+{
+}
+
 void dev_poll_reactor::start_op(int op_type, socket_type descriptor,
     dev_poll_reactor::per_descriptor_data&,
     reactor_op* op, bool allow_speculative)

Modified: trunk/boost/asio/detail/impl/epoll_reactor.ipp
==============================================================================
--- trunk/boost/asio/detail/impl/epoll_reactor.ipp (original)
+++ trunk/boost/asio/detail/impl/epoll_reactor.ipp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -187,6 +187,14 @@
   return 0;
 }
 
+void epoll_reactor::move_descriptor(socket_type,
+ epoll_reactor::per_descriptor_data& target_descriptor_data,
+ epoll_reactor::per_descriptor_data& source_descriptor_data)
+{
+ target_descriptor_data = source_descriptor_data;
+ source_descriptor_data = 0;
+}
+
 void epoll_reactor::start_op(int op_type, socket_type descriptor,
     epoll_reactor::per_descriptor_data& descriptor_data,
     reactor_op* op, bool allow_speculative)

Modified: trunk/boost/asio/detail/impl/kqueue_reactor.ipp
==============================================================================
--- trunk/boost/asio/detail/impl/kqueue_reactor.ipp (original)
+++ trunk/boost/asio/detail/impl/kqueue_reactor.ipp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -165,6 +165,14 @@
   return 0;
 }
 
+void kqueue_reactor::move_descriptor(socket_type,
+ kqueue_reactor::per_descriptor_data& target_descriptor_data,
+ kqueue_reactor::per_descriptor_data& source_descriptor_data)
+{
+ target_descriptor_data = source_descriptor_data;
+ source_descriptor_data = 0;
+}
+
 void kqueue_reactor::start_op(int op_type, socket_type descriptor,
     kqueue_reactor::per_descriptor_data& descriptor_data,
     reactor_op* op, bool allow_speculative)

Modified: trunk/boost/asio/detail/impl/reactive_descriptor_service.ipp
==============================================================================
--- trunk/boost/asio/detail/impl/reactive_descriptor_service.ipp (original)
+++ trunk/boost/asio/detail/impl/reactive_descriptor_service.ipp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -46,6 +46,37 @@
   impl.state_ = 0;
 }
 
+void reactive_descriptor_service::move_construct(
+ reactive_descriptor_service::implementation_type& impl,
+ reactive_descriptor_service::implementation_type& other_impl)
+{
+ impl.descriptor_ = other_impl.descriptor_;
+ other_impl.descriptor_ = -1;
+
+ impl.state_ = other_impl.state_;
+ other_impl.state_ = 0;
+
+ reactor_.move_descriptor(impl.descriptor_,
+ impl.reactor_data_, other_impl.reactor_data_);
+}
+
+void reactive_descriptor_service::move_assign(
+ reactive_descriptor_service::implementation_type& impl,
+ reactive_descriptor_service& other_service,
+ reactive_descriptor_service::implementation_type& other_impl)
+{
+ destroy(impl);
+
+ impl.descriptor_ = other_impl.descriptor_;
+ other_impl.descriptor_ = -1;
+
+ impl.state_ = other_impl.state_;
+ other_impl.state_ = 0;
+
+ other_service.reactor_.move_descriptor(impl.descriptor_,
+ impl.reactor_data_, other_impl.reactor_data_);
+}
+
 void reactive_descriptor_service::destroy(
     reactive_descriptor_service::implementation_type& impl)
 {

Modified: trunk/boost/asio/detail/impl/reactive_socket_service_base.ipp
==============================================================================
--- trunk/boost/asio/detail/impl/reactive_socket_service_base.ipp (original)
+++ trunk/boost/asio/detail/impl/reactive_socket_service_base.ipp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -45,6 +45,37 @@
   impl.state_ = 0;
 }
 
+void reactive_socket_service_base::base_move_construct(
+ reactive_socket_service_base::base_implementation_type& impl,
+ reactive_socket_service_base::base_implementation_type& other_impl)
+{
+ impl.socket_ = other_impl.socket_;
+ other_impl.socket_ = invalid_socket;
+
+ impl.state_ = other_impl.state_;
+ other_impl.state_ = 0;
+
+ reactor_.move_descriptor(impl.socket_,
+ impl.reactor_data_, other_impl.reactor_data_);
+}
+
+void reactive_socket_service_base::base_move_assign(
+ reactive_socket_service_base::base_implementation_type& impl,
+ reactive_socket_service_base& other_service,
+ reactive_socket_service_base::base_implementation_type& other_impl)
+{
+ destroy(impl);
+
+ impl.socket_ = other_impl.socket_;
+ other_impl.socket_ = invalid_socket;
+
+ impl.state_ = other_impl.state_;
+ other_impl.state_ = 0;
+
+ other_service.reactor_.move_descriptor(impl.socket_,
+ impl.reactor_data_, other_impl.reactor_data_);
+}
+
 void reactive_socket_service_base::destroy(
     reactive_socket_service_base::base_implementation_type& impl)
 {

Modified: trunk/boost/asio/detail/impl/select_reactor.ipp
==============================================================================
--- trunk/boost/asio/detail/impl/select_reactor.ipp (original)
+++ trunk/boost/asio/detail/impl/select_reactor.ipp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -113,6 +113,12 @@
   return 0;
 }
 
+void select_reactor::move_descriptor(socket_type,
+ select_reactor::per_descriptor_data&,
+ select_reactor::per_descriptor_data&)
+{
+}
+
 void select_reactor::start_op(int op_type, socket_type descriptor,
     select_reactor::per_descriptor_data&, reactor_op* op, bool)
 {

Modified: trunk/boost/asio/detail/impl/socket_ops.ipp
==============================================================================
--- trunk/boost/asio/detail/impl/socket_ops.ipp (original)
+++ trunk/boost/asio/detail/impl/socket_ops.ipp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -322,6 +322,13 @@
 # endif // defined(__SYMBIAN32__)
 #endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
       state &= ~non_blocking;
+
+ clear_last_error();
+#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+ result = error_wrapper(::closesocket(s), ec);
+#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+ result = error_wrapper(::close(s), ec);
+#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
     }
   }
 

Modified: trunk/boost/asio/detail/impl/win_iocp_handle_service.ipp
==============================================================================
--- trunk/boost/asio/detail/impl/win_iocp_handle_service.ipp (original)
+++ trunk/boost/asio/detail/impl/win_iocp_handle_service.ipp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -100,6 +100,64 @@
   impl_list_ = &impl;
 }
 
+void win_iocp_handle_service::move_construct(
+ win_iocp_handle_service::implementation_type& impl,
+ win_iocp_handle_service::implementation_type& other_impl)
+{
+ impl.handle_ = other_impl.handle_;
+ other_impl.handle_ = INVALID_HANDLE_VALUE;
+
+ impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_;
+ other_impl.safe_cancellation_thread_id_ = 0;
+
+ // Insert implementation into linked list of all implementations.
+ boost::asio::detail::mutex::scoped_lock lock(mutex_);
+ impl.next_ = impl_list_;
+ impl.prev_ = 0;
+ if (impl_list_)
+ impl_list_->prev_ = &impl;
+ impl_list_ = &impl;
+}
+
+void win_iocp_handle_service::move_assign(
+ win_iocp_handle_service::implementation_type& impl,
+ win_iocp_handle_service& other_service,
+ win_iocp_handle_service::implementation_type& other_impl)
+{
+ close_for_destruction(impl);
+
+ if (this != &other_service)
+ {
+ // Remove implementation from linked list of all implementations.
+ boost::asio::detail::mutex::scoped_lock lock(mutex_);
+ if (impl_list_ == &impl)
+ impl_list_ = impl.next_;
+ if (impl.prev_)
+ impl.prev_->next_ = impl.next_;
+ if (impl.next_)
+ impl.next_->prev_= impl.prev_;
+ impl.next_ = 0;
+ impl.prev_ = 0;
+ }
+
+ impl.handle_ = other_impl.handle_;
+ other_impl.handle_ = INVALID_HANDLE_VALUE;
+
+ impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_;
+ other_impl.safe_cancellation_thread_id_ = 0;
+
+ if (this != &other_service)
+ {
+ // Insert implementation into linked list of all implementations.
+ boost::asio::detail::mutex::scoped_lock lock(other_service.mutex_);
+ impl.next_ = other_service.impl_list_;
+ impl.prev_ = 0;
+ if (other_service.impl_list_)
+ other_service.impl_list_->prev_ = &impl;
+ other_service.impl_list_ = &impl;
+ }
+}
+
 void win_iocp_handle_service::destroy(
     win_iocp_handle_service::implementation_type& impl)
 {
@@ -148,14 +206,20 @@
       DWORD last_error = ::GetLastError();
       ec = boost::system::error_code(last_error,
           boost::asio::error::get_system_category());
- return ec;
+ }
+ else
+ {
+ ec = boost::system::error_code();
     }
 
     impl.handle_ = INVALID_HANDLE_VALUE;
     impl.safe_cancellation_thread_id_ = 0;
   }
+ else
+ {
+ ec = boost::system::error_code();
+ }
 
- ec = boost::system::error_code();
   return ec;
 }
 

Modified: trunk/boost/asio/detail/impl/win_iocp_socket_service_base.ipp
==============================================================================
--- trunk/boost/asio/detail/impl/win_iocp_socket_service_base.ipp (original)
+++ trunk/boost/asio/detail/impl/win_iocp_socket_service_base.ipp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -69,6 +69,80 @@
   impl_list_ = &impl;
 }
 
+void win_iocp_socket_service_base::base_move_construct(
+ win_iocp_socket_service_base::base_implementation_type& impl,
+ win_iocp_socket_service_base::base_implementation_type& other_impl)
+{
+ impl.socket_ = other_impl.socket_;
+ other_impl.socket_ = invalid_socket;
+
+ impl.state_ = other_impl.state_;
+ other_impl.state_ = 0;
+
+ impl.cancel_token_ = other_impl.cancel_token_;
+ other_impl.cancel_token_.reset();
+
+#if defined(BOOST_ASIO_ENABLE_CANCELIO)
+ impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_;
+ other_impl.safe_cancellation_thread_id_ = 0;
+#endif // defined(BOOST_ASIO_ENABLE_CANCELIO)
+
+ // Insert implementation into linked list of all implementations.
+ boost::asio::detail::mutex::scoped_lock lock(mutex_);
+ impl.next_ = impl_list_;
+ impl.prev_ = 0;
+ if (impl_list_)
+ impl_list_->prev_ = &impl;
+ impl_list_ = &impl;
+}
+
+void win_iocp_socket_service_base::base_move_assign(
+ win_iocp_socket_service_base::base_implementation_type& impl,
+ win_iocp_socket_service_base& other_service,
+ win_iocp_socket_service_base::base_implementation_type& other_impl)
+{
+ close_for_destruction(impl);
+
+ if (this != &other_service)
+ {
+ // Remove implementation from linked list of all implementations.
+ boost::asio::detail::mutex::scoped_lock lock(mutex_);
+ if (impl_list_ == &impl)
+ impl_list_ = impl.next_;
+ if (impl.prev_)
+ impl.prev_->next_ = impl.next_;
+ if (impl.next_)
+ impl.next_->prev_= impl.prev_;
+ impl.next_ = 0;
+ impl.prev_ = 0;
+ }
+
+ impl.socket_ = other_impl.socket_;
+ other_impl.socket_ = invalid_socket;
+
+ impl.state_ = other_impl.state_;
+ other_impl.state_ = 0;
+
+ impl.cancel_token_ = other_impl.cancel_token_;
+ other_impl.cancel_token_.reset();
+
+#if defined(BOOST_ASIO_ENABLE_CANCELIO)
+ impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_;
+ other_impl.safe_cancellation_thread_id_ = 0;
+#endif // defined(BOOST_ASIO_ENABLE_CANCELIO)
+
+ if (this != &other_service)
+ {
+ // Insert implementation into linked list of all implementations.
+ boost::asio::detail::mutex::scoped_lock lock(other_service.mutex_);
+ impl.next_ = other_service.impl_list_;
+ impl.prev_ = 0;
+ if (other_service.impl_list_)
+ other_service.impl_list_->prev_ = &impl;
+ other_service.impl_list_ = &impl;
+ }
+}
+
 void win_iocp_socket_service_base::destroy(
     win_iocp_socket_service_base::base_implementation_type& impl)
 {
@@ -104,15 +178,14 @@
       r->deregister_descriptor(impl.socket_, impl.reactor_data_, true);
   }
 
- if (socket_ops::close(impl.socket_, impl.state_, false, ec) == 0)
- {
- impl.socket_ = invalid_socket;
- impl.state_ = 0;
- impl.cancel_token_.reset();
+ socket_ops::close(impl.socket_, impl.state_, false, ec);
+
+ impl.socket_ = invalid_socket;
+ impl.state_ = 0;
+ impl.cancel_token_.reset();
 #if defined(BOOST_ASIO_ENABLE_CANCELIO)
- impl.safe_cancellation_thread_id_ = 0;
+ impl.safe_cancellation_thread_id_ = 0;
 #endif // defined(BOOST_ASIO_ENABLE_CANCELIO)
- }
 
   return ec;
 }

Modified: trunk/boost/asio/detail/kqueue_reactor.hpp
==============================================================================
--- trunk/boost/asio/detail/kqueue_reactor.hpp (original)
+++ trunk/boost/asio/detail/kqueue_reactor.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -100,6 +100,11 @@
       int op_type, socket_type descriptor,
       per_descriptor_data& descriptor_data, reactor_op* op);
 
+ // Move descriptor registration from one descriptor_data object to another.
+ BOOST_ASIO_DECL void move_descriptor(socket_type descriptor,
+ per_descriptor_data& target_descriptor_data,
+ per_descriptor_data& source_descriptor_data);
+
   // Post a reactor operation for immediate completion.
   void post_immediate_completion(reactor_op* op)
   {

Modified: trunk/boost/asio/detail/reactive_descriptor_service.hpp
==============================================================================
--- trunk/boost/asio/detail/reactive_descriptor_service.hpp (original)
+++ trunk/boost/asio/detail/reactive_descriptor_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -80,6 +80,15 @@
   // Construct a new descriptor implementation.
   BOOST_ASIO_DECL void construct(implementation_type& impl);
 
+ // Move-construct a new descriptor implementation.
+ BOOST_ASIO_DECL void move_construct(implementation_type& impl,
+ implementation_type& other_impl);
+
+ // Move-assign from another descriptor implementation.
+ BOOST_ASIO_DECL void move_assign(implementation_type& impl,
+ reactive_descriptor_service& other_service,
+ implementation_type& other_impl);
+
   // Destroy a descriptor implementation.
   BOOST_ASIO_DECL void destroy(implementation_type& impl);
 

Modified: trunk/boost/asio/detail/reactive_serial_port_service.hpp
==============================================================================
--- trunk/boost/asio/detail/reactive_serial_port_service.hpp (original)
+++ trunk/boost/asio/detail/reactive_serial_port_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -56,6 +56,22 @@
     descriptor_service_.construct(impl);
   }
 
+ // Move-construct a new serial port implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ descriptor_service_.move_construct(impl, other_impl);
+ }
+
+ // Move-assign from another serial port implementation.
+ void move_assign(implementation_type& impl,
+ reactive_serial_port_service& other_service,
+ implementation_type& other_impl)
+ {
+ descriptor_service_.move_assign(impl,
+ other_service.descriptor_service_, other_impl);
+ }
+
   // Destroy a serial port implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/detail/reactive_socket_service.hpp
==============================================================================
--- trunk/boost/asio/detail/reactive_socket_service.hpp (original)
+++ trunk/boost/asio/detail/reactive_socket_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -78,6 +78,27 @@
   {
   }
 
+ // Move-construct a new socket implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ this->base_move_construct(impl, other_impl);
+
+ impl.protocol_ = other_impl.protocol_;
+ other_impl.protocol_ = endpoint_type().protocol();
+ }
+
+ // Move-assign from another socket implementation.
+ void move_assign(implementation_type& impl,
+ reactive_socket_service_base& other_service,
+ implementation_type& other_impl)
+ {
+ this->base_move_assign(impl, other_service, other_impl);
+
+ impl.protocol_ = other_impl.protocol_;
+ other_impl.protocol_ = endpoint_type().protocol();
+ }
+
   // Open a new socket implementation.
   boost::system::error_code open(implementation_type& impl,
       const protocol_type& protocol, boost::system::error_code& ec)

Modified: trunk/boost/asio/detail/reactive_socket_service_base.hpp
==============================================================================
--- trunk/boost/asio/detail/reactive_socket_service_base.hpp (original)
+++ trunk/boost/asio/detail/reactive_socket_service_base.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -70,6 +70,15 @@
   // Construct a new socket implementation.
   BOOST_ASIO_DECL void construct(base_implementation_type& impl);
 
+ // Move-construct a new socket implementation.
+ BOOST_ASIO_DECL void base_move_construct(base_implementation_type& impl,
+ base_implementation_type& other_impl);
+
+ // Move-assign from another socket implementation.
+ BOOST_ASIO_DECL void base_move_assign(base_implementation_type& impl,
+ reactive_socket_service_base& other_service,
+ base_implementation_type& other_impl);
+
   // Destroy a socket implementation.
   BOOST_ASIO_DECL void destroy(base_implementation_type& impl);
 

Modified: trunk/boost/asio/detail/select_reactor.hpp
==============================================================================
--- trunk/boost/asio/detail/select_reactor.hpp (original)
+++ trunk/boost/asio/detail/select_reactor.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -115,6 +115,11 @@
   BOOST_ASIO_DECL void deregister_internal_descriptor(
       socket_type descriptor, per_descriptor_data& descriptor_data);
 
+ // Move descriptor registration from one descriptor_data object to another.
+ BOOST_ASIO_DECL void move_descriptor(socket_type descriptor,
+ per_descriptor_data& target_descriptor_data,
+ per_descriptor_data& source_descriptor_data);
+
   // Add a new timer queue to the reactor.
   template <typename Time_Traits>
   void add_timer_queue(timer_queue<Time_Traits>& queue);

Modified: trunk/boost/asio/detail/win_iocp_handle_service.hpp
==============================================================================
--- trunk/boost/asio/detail/win_iocp_handle_service.hpp (original)
+++ trunk/boost/asio/detail/win_iocp_handle_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -82,6 +82,15 @@
   // Construct a new handle implementation.
   BOOST_ASIO_DECL void construct(implementation_type& impl);
 
+ // Move-construct a new handle implementation.
+ BOOST_ASIO_DECL void move_construct(implementation_type& impl,
+ implementation_type& other_impl);
+
+ // Move-assign from another handle implementation.
+ BOOST_ASIO_DECL void move_assign(implementation_type& impl,
+ win_iocp_handle_service& other_service,
+ implementation_type& other_impl);
+
   // Destroy a handle implementation.
   BOOST_ASIO_DECL void destroy(implementation_type& impl);
 

Modified: trunk/boost/asio/detail/win_iocp_serial_port_service.hpp
==============================================================================
--- trunk/boost/asio/detail/win_iocp_serial_port_service.hpp (original)
+++ trunk/boost/asio/detail/win_iocp_serial_port_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -54,6 +54,22 @@
     handle_service_.construct(impl);
   }
 
+ // Move-construct a new serial port implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ handle_service_.move_construct(impl, other_impl);
+ }
+
+ // Move-assign from another serial port implementation.
+ void move_assign(implementation_type& impl,
+ win_iocp_serial_port_service& other_service,
+ implementation_type& other_impl)
+ {
+ handle_service_.move_assign(impl,
+ other_service.handle_service_, other_impl);
+ }
+
   // Destroy a serial port implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/detail/win_iocp_socket_service.hpp
==============================================================================
--- trunk/boost/asio/detail/win_iocp_socket_service.hpp (original)
+++ trunk/boost/asio/detail/win_iocp_socket_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -133,6 +133,39 @@
   {
   }
 
+ // Move-construct a new socket implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ this->base_move_construct(impl, other_impl);
+
+ impl.protocol_ = other_impl.protocol_;
+ other_impl.protocol_ = endpoint_type().protocol();
+
+ impl.have_remote_endpoint_ = other_impl.have_remote_endpoint_;
+ other_impl.have_remote_endpoint_ = false;
+
+ impl.remote_endpoint_ = other_impl.remote_endpoint_;
+ other_impl.remote_endpoint_ = endpoint_type();
+ }
+
+ // Move-assign from another socket implementation.
+ void move_assign(implementation_type& impl,
+ win_iocp_socket_service_base& other_service,
+ implementation_type& other_impl)
+ {
+ this->base_move_assign(impl, other_service, other_impl);
+
+ impl.protocol_ = other_impl.protocol_;
+ other_impl.protocol_ = endpoint_type().protocol();
+
+ impl.have_remote_endpoint_ = other_impl.have_remote_endpoint_;
+ other_impl.have_remote_endpoint_ = false;
+
+ impl.remote_endpoint_ = other_impl.remote_endpoint_;
+ other_impl.remote_endpoint_ = endpoint_type();
+ }
+
   // Open a new socket implementation.
   boost::system::error_code open(implementation_type& impl,
       const protocol_type& protocol, boost::system::error_code& ec)

Modified: trunk/boost/asio/detail/win_iocp_socket_service_base.hpp
==============================================================================
--- trunk/boost/asio/detail/win_iocp_socket_service_base.hpp (original)
+++ trunk/boost/asio/detail/win_iocp_socket_service_base.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -94,6 +94,15 @@
   // Construct a new socket implementation.
   BOOST_ASIO_DECL void construct(base_implementation_type& impl);
 
+ // Move-construct a new socket implementation.
+ BOOST_ASIO_DECL void base_move_construct(base_implementation_type& impl,
+ base_implementation_type& other_impl);
+
+ // Move-assign from another socket implementation.
+ BOOST_ASIO_DECL void base_move_assign(base_implementation_type& impl,
+ win_iocp_socket_service_base& other_service,
+ base_implementation_type& other_impl);
+
   // Destroy a socket implementation.
   BOOST_ASIO_DECL void destroy(base_implementation_type& impl);
 

Modified: trunk/boost/asio/posix/basic_descriptor.hpp
==============================================================================
--- trunk/boost/asio/posix/basic_descriptor.hpp (original)
+++ trunk/boost/asio/posix/basic_descriptor.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -87,10 +87,46 @@
     : basic_io_object<DescriptorService>(io_service)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, native_descriptor, ec);
+ this->get_service().assign(this->get_implementation(),
+ native_descriptor, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_descriptor from another.
+ /**
+ * This constructor moves a descriptor from one object to another.
+ *
+ * @param other The other basic_descriptor object from which the move will
+ * occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_descriptor(io_service&) constructor.
+ */
+ basic_descriptor(basic_descriptor&& other)
+ : basic_io_object<DescriptorService>(
+ BOOST_ASIO_MOVE_CAST(basic_descriptor)(other))
+ {
+ }
+
+ /// Move-assign a basic_descriptor from another.
+ /**
+ * This assignment operator moves a descriptor from one object to another.
+ *
+ * @param other The other basic_descriptor object from which the move will
+ * occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_descriptor(io_service&) constructor.
+ */
+ basic_descriptor& operator=(basic_descriptor&& other)
+ {
+ basic_io_object<DescriptorService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_descriptor)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Get a reference to the lowest layer.
   /**
    * This function returns a reference to the lowest layer in a stack of
@@ -130,7 +166,8 @@
   void assign(const native_handle_type& native_descriptor)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, native_descriptor, ec);
+ this->get_service().assign(this->get_implementation(),
+ native_descriptor, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
@@ -145,13 +182,14 @@
   boost::system::error_code assign(const native_handle_type& native_descriptor,
       boost::system::error_code& ec)
   {
- return this->service.assign(this->implementation, native_descriptor, ec);
+ return this->get_service().assign(
+ this->get_implementation(), native_descriptor, ec);
   }
 
   /// Determine whether the descriptor is open.
   bool is_open() const
   {
- return this->service.is_open(this->implementation);
+ return this->get_service().is_open(this->implementation);
   }
 
   /// Close the descriptor.
@@ -166,7 +204,7 @@
   void close()
   {
     boost::system::error_code ec;
- this->service.close(this->implementation, ec);
+ this->get_service().close(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "close");
   }
 
@@ -181,7 +219,7 @@
    */
   boost::system::error_code close(boost::system::error_code& ec)
   {
- return this->service.close(this->implementation, ec);
+ return this->get_service().close(this->get_implementation(), ec);
   }
 
   /// (Deprecated: Use native_handle().) Get the native descriptor
@@ -193,7 +231,7 @@
    */
   native_type native()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->implementation);
   }
 
   /// Get the native descriptor representation.
@@ -204,7 +242,7 @@
    */
   native_handle_type native_handle()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->implementation);
   }
 
   /// Release ownership of the native descriptor implementation.
@@ -219,7 +257,7 @@
    */
   native_handle_type release()
   {
- return this->service.release(this->implementation);
+ return this->get_service().release(this->implementation);
   }
 
   /// Cancel all asynchronous operations associated with the descriptor.
@@ -233,7 +271,7 @@
   void cancel()
   {
     boost::system::error_code ec;
- this->service.cancel(this->implementation, ec);
+ this->get_service().cancel(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "cancel");
   }
 
@@ -247,7 +285,7 @@
    */
   boost::system::error_code cancel(boost::system::error_code& ec)
   {
- return this->service.cancel(this->implementation, ec);
+ return this->get_service().cancel(this->get_implementation(), ec);
   }
 
   /// Perform an IO control command on the descriptor.
@@ -276,7 +314,7 @@
   void io_control(IoControlCommand& command)
   {
     boost::system::error_code ec;
- this->service.io_control(this->implementation, command, ec);
+ this->get_service().io_control(this->get_implementation(), command, ec);
     boost::asio::detail::throw_error(ec, "io_control");
   }
 
@@ -311,7 +349,8 @@
   boost::system::error_code io_control(IoControlCommand& command,
       boost::system::error_code& ec)
   {
- return this->service.io_control(this->implementation, command, ec);
+ return this->get_service().io_control(
+ this->get_implementation(), command, ec);
   }
 
   /// Gets the non-blocking mode of the descriptor.
@@ -327,7 +366,7 @@
    */
   bool non_blocking() const
   {
- return this->service.non_blocking(this->implementation);
+ return this->get_service().non_blocking(this->implementation);
   }
 
   /// Sets the non-blocking mode of the descriptor.
@@ -346,7 +385,7 @@
   void non_blocking(bool mode)
   {
     boost::system::error_code ec;
- this->service.non_blocking(this->implementation, mode, ec);
+ this->get_service().non_blocking(this->get_implementation(), mode, ec);
     boost::asio::detail::throw_error(ec, "non_blocking");
   }
 
@@ -366,7 +405,8 @@
   boost::system::error_code non_blocking(
       bool mode, boost::system::error_code& ec)
   {
- return this->service.non_blocking(this->implementation, mode, ec);
+ return this->get_service().non_blocking(
+ this->get_implementation(), mode, ec);
   }
 
   /// Gets the non-blocking mode of the native descriptor implementation.
@@ -385,7 +425,7 @@
    */
   bool native_non_blocking() const
   {
- return this->service.native_non_blocking(this->implementation);
+ return this->get_service().native_non_blocking(this->implementation);
   }
 
   /// Sets the non-blocking mode of the native descriptor implementation.
@@ -406,7 +446,8 @@
   void native_non_blocking(bool mode)
   {
     boost::system::error_code ec;
- this->service.native_non_blocking(this->implementation, mode, ec);
+ this->get_service().native_non_blocking(
+ this->get_implementation(), mode, ec);
     boost::asio::detail::throw_error(ec, "native_non_blocking");
   }
 
@@ -428,7 +469,8 @@
   boost::system::error_code native_non_blocking(
       bool mode, boost::system::error_code& ec)
   {
- return this->service.native_non_blocking(this->implementation, mode, ec);
+ return this->get_service().native_non_blocking(
+ this->get_implementation(), mode, ec);
   }
 
 protected:

Modified: trunk/boost/asio/posix/basic_stream_descriptor.hpp
==============================================================================
--- trunk/boost/asio/posix/basic_stream_descriptor.hpp (original)
+++ trunk/boost/asio/posix/basic_stream_descriptor.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -92,6 +92,42 @@
   {
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_stream_descriptor from another.
+ /**
+ * This constructor moves a stream descriptor from one object to another.
+ *
+ * @param other The other basic_stream_descriptor object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_stream_descriptor(io_service&) constructor.
+ */
+ basic_stream_descriptor(basic_stream_descriptor&& other)
+ : basic_descriptor<StreamDescriptorService>(
+ BOOST_ASIO_MOVE_CAST(basic_stream_descriptor)(other))
+ {
+ }
+
+ /// Move-assign a basic_stream_descriptor from another.
+ /**
+ * This assignment operator moves a stream descriptor from one object to
+ * another.
+ *
+ * @param other The other basic_stream_descriptor object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_stream_descriptor(io_service&) constructor.
+ */
+ basic_stream_descriptor& operator=(basic_stream_descriptor&& other)
+ {
+ basic_descriptor<StreamDescriptorService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_stream_descriptor)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Write some data to the descriptor.
   /**
    * This function is used to write data to the stream descriptor. The function
@@ -123,7 +159,8 @@
   std::size_t write_some(const ConstBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.write_some(this->implementation, buffers, ec);
+ std::size_t s = this->get_service().write_some(
+ this->get_implementation(), buffers, ec);
     boost::asio::detail::throw_error(ec, "write_some");
     return s;
   }
@@ -148,7 +185,8 @@
   std::size_t write_some(const ConstBufferSequence& buffers,
       boost::system::error_code& ec)
   {
- return this->service.write_some(this->implementation, buffers, ec);
+ return this->get_service().write_some(
+ this->get_implementation(), buffers, ec);
   }
 
   /// Start an asynchronous write.
@@ -194,8 +232,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_write_some(this->implementation, buffers,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_write_some(this->get_implementation(),
+ buffers, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Read some data from the descriptor.
@@ -230,7 +268,8 @@
   std::size_t read_some(const MutableBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.read_some(this->implementation, buffers, ec);
+ std::size_t s = this->get_service().read_some(
+ this->get_implementation(), buffers, ec);
     boost::asio::detail::throw_error(ec, "read_some");
     return s;
   }
@@ -256,7 +295,8 @@
   std::size_t read_some(const MutableBufferSequence& buffers,
       boost::system::error_code& ec)
   {
- return this->service.read_some(this->implementation, buffers, ec);
+ return this->get_service().read_some(
+ this->get_implementation(), buffers, ec);
   }
 
   /// Start an asynchronous read.
@@ -303,8 +343,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_read_some(this->implementation, buffers,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_read_some(this->get_implementation(),
+ buffers, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 };
 

Modified: trunk/boost/asio/posix/stream_descriptor_service.hpp
==============================================================================
--- trunk/boost/asio/posix/stream_descriptor_service.hpp (original)
+++ trunk/boost/asio/posix/stream_descriptor_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -84,6 +84,23 @@
     service_impl_.construct(impl);
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a new stream descriptor implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_construct(impl, other_impl);
+ }
+
+ /// Move-assign from another stream descriptor implementation.
+ void move_assign(implementation_type& impl,
+ stream_descriptor_service& other_service,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_assign(impl, other_service.service_impl_, other_impl);
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Destroy a stream descriptor implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/raw_socket_service.hpp
==============================================================================
--- trunk/boost/asio/raw_socket_service.hpp (original)
+++ trunk/boost/asio/raw_socket_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -96,6 +96,23 @@
     service_impl_.construct(impl);
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a new raw socket implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_construct(impl, other_impl);
+ }
+
+ /// Move-assign from another raw socket implementation.
+ void move_assign(implementation_type& impl,
+ raw_socket_service& other_service,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_assign(impl, other_service.service_impl_, other_impl);
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Destroy a raw socket implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/seq_packet_socket_service.hpp
==============================================================================
--- trunk/boost/asio/seq_packet_socket_service.hpp (original)
+++ trunk/boost/asio/seq_packet_socket_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -98,6 +98,23 @@
     service_impl_.construct(impl);
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a new sequenced packet socket implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_construct(impl, other_impl);
+ }
+
+ /// Move-assign from another sequenced packet socket implementation.
+ void move_assign(implementation_type& impl,
+ seq_packet_socket_service& other_service,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_assign(impl, other_service.service_impl_, other_impl);
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Destroy a sequenced packet socket implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/serial_port_service.hpp
==============================================================================
--- trunk/boost/asio/serial_port_service.hpp (original)
+++ trunk/boost/asio/serial_port_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -90,6 +90,23 @@
     service_impl_.construct(impl);
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a new serial port implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_construct(impl, other_impl);
+ }
+
+ /// Move-assign from another serial port implementation.
+ void move_assign(implementation_type& impl,
+ serial_port_service& other_service,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_assign(impl, other_service.service_impl_, other_impl);
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Destroy a serial port implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/socket_acceptor_service.hpp
==============================================================================
--- trunk/boost/asio/socket_acceptor_service.hpp (original)
+++ trunk/boost/asio/socket_acceptor_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -96,6 +96,23 @@
     service_impl_.construct(impl);
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a new socket acceptor implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_construct(impl, other_impl);
+ }
+
+ /// Move-assign from another socket acceptor implementation.
+ void move_assign(implementation_type& impl,
+ socket_acceptor_service& other_service,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_assign(impl, other_service.service_impl_, other_impl);
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Destroy a socket acceptor implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/stream_socket_service.hpp
==============================================================================
--- trunk/boost/asio/stream_socket_service.hpp (original)
+++ trunk/boost/asio/stream_socket_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -96,6 +96,23 @@
     service_impl_.construct(impl);
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a new stream socket implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_construct(impl, other_impl);
+ }
+
+ /// Move-assign from another stream socket implementation.
+ void move_assign(implementation_type& impl,
+ stream_socket_service& other_service,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_assign(impl, other_service.service_impl_, other_impl);
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Destroy a stream socket implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/version.hpp
==============================================================================
--- trunk/boost/asio/version.hpp (original)
+++ trunk/boost/asio/version.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -18,6 +18,6 @@
 // BOOST_ASIO_VERSION % 100 is the sub-minor version
 // BOOST_ASIO_VERSION / 100 % 1000 is the minor version
 // BOOST_ASIO_VERSION / 100000 is the major version
-#define BOOST_ASIO_VERSION 100501 // 1.5.1
+#define BOOST_ASIO_VERSION 100502 // 1.5.2
 
 #endif // BOOST_ASIO_VERSION_HPP

Modified: trunk/boost/asio/windows/basic_handle.hpp
==============================================================================
--- trunk/boost/asio/windows/basic_handle.hpp (original)
+++ trunk/boost/asio/windows/basic_handle.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -83,10 +83,43 @@
     : basic_io_object<HandleService>(io_service)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, handle, ec);
+ this->get_service().assign(this->get_implementation(), handle, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_handle from another.
+ /**
+ * This constructor moves a handle from one object to another.
+ *
+ * @param other The other basic_handle object from which the move will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_handle(io_service&) constructor.
+ */
+ basic_handle(basic_handle&& other)
+ : basic_io_object<HandleService>(
+ BOOST_ASIO_MOVE_CAST(basic_handle)(other))
+ {
+ }
+
+ /// Move-assign a basic_handle from another.
+ /**
+ * This assignment operator moves a handle from one object to another.
+ *
+ * @param other The other basic_handle object from which the move will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_handle(io_service&) constructor.
+ */
+ basic_handle& operator=(basic_handle&& other)
+ {
+ basic_io_object<HandleService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_handle)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Get a reference to the lowest layer.
   /**
    * This function returns a reference to the lowest layer in a stack of
@@ -126,7 +159,7 @@
   void assign(const native_handle_type& handle)
   {
     boost::system::error_code ec;
- this->service.assign(this->implementation, handle, ec);
+ this->get_service().assign(this->get_implementation(), handle, ec);
     boost::asio::detail::throw_error(ec, "assign");
   }
 
@@ -141,13 +174,13 @@
   boost::system::error_code assign(const native_handle_type& handle,
       boost::system::error_code& ec)
   {
- return this->service.assign(this->implementation, handle, ec);
+ return this->get_service().assign(this->get_implementation(), handle, ec);
   }
 
   /// Determine whether the handle is open.
   bool is_open() const
   {
- return this->service.is_open(this->implementation);
+ return this->get_service().is_open(this->get_implementation());
   }
 
   /// Close the handle.
@@ -161,7 +194,7 @@
   void close()
   {
     boost::system::error_code ec;
- this->service.close(this->implementation, ec);
+ this->get_service().close(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "close");
   }
 
@@ -175,7 +208,7 @@
    */
   boost::system::error_code close(boost::system::error_code& ec)
   {
- return this->service.close(this->implementation, ec);
+ return this->get_service().close(this->get_implementation(), ec);
   }
 
   /// (Deprecated: Use native_handle().) Get the native handle representation.
@@ -186,7 +219,7 @@
    */
   native_type native()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->get_implementation());
   }
 
   /// Get the native handle representation.
@@ -197,7 +230,7 @@
    */
   native_handle_type native_handle()
   {
- return this->service.native_handle(this->implementation);
+ return this->get_service().native_handle(this->get_implementation());
   }
 
   /// Cancel all asynchronous operations associated with the handle.
@@ -211,7 +244,7 @@
   void cancel()
   {
     boost::system::error_code ec;
- this->service.cancel(this->implementation, ec);
+ this->get_service().cancel(this->get_implementation(), ec);
     boost::asio::detail::throw_error(ec, "cancel");
   }
 
@@ -225,7 +258,7 @@
    */
   boost::system::error_code cancel(boost::system::error_code& ec)
   {
- return this->service.cancel(this->implementation, ec);
+ return this->get_service().cancel(this->get_implementation(), ec);
   }
 
 protected:

Modified: trunk/boost/asio/windows/basic_random_access_handle.hpp
==============================================================================
--- trunk/boost/asio/windows/basic_random_access_handle.hpp (original)
+++ trunk/boost/asio/windows/basic_random_access_handle.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -88,6 +88,44 @@
   {
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_random_access_handle from another.
+ /**
+ * This constructor moves a random-access handle from one object to another.
+ *
+ * @param other The other basic_random_access_handle object from which the
+ * move will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_random_access_handle(io_service&)
+ * constructor.
+ */
+ basic_random_access_handle(basic_random_access_handle&& other)
+ : basic_handle<RandomAccessHandleService>(
+ BOOST_ASIO_MOVE_CAST(basic_random_access_handle)(other))
+ {
+ }
+
+ /// Move-assign a basic_random_access_handle from another.
+ /**
+ * This assignment operator moves a random-access handle from one object to
+ * another.
+ *
+ * @param other The other basic_random_access_handle object from which the
+ * move will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_random_access_handle(io_service&)
+ * constructor.
+ */
+ basic_random_access_handle& operator=(basic_random_access_handle&& other)
+ {
+ basic_handle<RandomAccessHandleService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_random_access_handle)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Write some data to the handle at the specified offset.
   /**
    * This function is used to write data to the random-access handle. The
@@ -122,8 +160,8 @@
       const ConstBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.write_some_at(
- this->implementation, offset, buffers, ec);
+ std::size_t s = this->get_service().write_some_at(
+ this->get_implementation(), offset, buffers, ec);
     boost::asio::detail::throw_error(ec, "write_some_at");
     return s;
   }
@@ -150,8 +188,8 @@
   std::size_t write_some_at(boost::uint64_t offset,
       const ConstBufferSequence& buffers, boost::system::error_code& ec)
   {
- return this->service.write_some_at(
- this->implementation, offset, buffers, ec);
+ return this->get_service().write_some_at(
+ this->get_implementation(), offset, buffers, ec);
   }
 
   /// Start an asynchronous write at the specified offset.
@@ -199,7 +237,7 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_write_some_at(this->implementation,
+ this->get_service().async_write_some_at(this->get_implementation(),
         offset, buffers, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
@@ -238,8 +276,8 @@
       const MutableBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.read_some_at(
- this->implementation, offset, buffers, ec);
+ std::size_t s = this->get_service().read_some_at(
+ this->get_implementation(), offset, buffers, ec);
     boost::asio::detail::throw_error(ec, "read_some_at");
     return s;
   }
@@ -267,8 +305,8 @@
   std::size_t read_some_at(boost::uint64_t offset,
       const MutableBufferSequence& buffers, boost::system::error_code& ec)
   {
- return this->service.read_some_at(
- this->implementation, offset, buffers, ec);
+ return this->get_service().read_some_at(
+ this->get_implementation(), offset, buffers, ec);
   }
 
   /// Start an asynchronous read at the specified offset.
@@ -317,7 +355,7 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_read_some_at(this->implementation,
+ this->get_service().async_read_some_at(this->get_implementation(),
         offset, buffers, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 };

Modified: trunk/boost/asio/windows/basic_stream_handle.hpp
==============================================================================
--- trunk/boost/asio/windows/basic_stream_handle.hpp (original)
+++ trunk/boost/asio/windows/basic_stream_handle.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -89,6 +89,42 @@
   {
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a basic_stream_handle from another.
+ /**
+ * This constructor moves a stream handle from one object to another.
+ *
+ * @param other The other basic_stream_handle object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_stream_handle(io_service&) constructor.
+ */
+ basic_stream_handle(basic_stream_handle&& other)
+ : basic_handle<StreamHandleService>(
+ BOOST_ASIO_MOVE_CAST(basic_stream_handle)(other))
+ {
+ }
+
+ /// Move-assign a basic_stream_handle from another.
+ /**
+ * This assignment operator moves a stream handle from one object to
+ * another.
+ *
+ * @param other The other basic_stream_handle object from which the move
+ * will occur.
+ *
+ * @note Following the move, the moved-from object is in the same state as if
+ * constructed using the @c basic_stream_handle(io_service&) constructor.
+ */
+ basic_stream_handle& operator=(basic_stream_handle&& other)
+ {
+ basic_handle<StreamHandleService>::operator=(
+ BOOST_ASIO_MOVE_CAST(basic_stream_handle)(other));
+ return *this;
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Write some data to the handle.
   /**
    * This function is used to write data to the stream handle. The function call
@@ -120,7 +156,8 @@
   std::size_t write_some(const ConstBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.write_some(this->implementation, buffers, ec);
+ std::size_t s = this->get_service().write_some(
+ this->get_implementation(), buffers, ec);
     boost::asio::detail::throw_error(ec, "write_some");
     return s;
   }
@@ -145,7 +182,8 @@
   std::size_t write_some(const ConstBufferSequence& buffers,
       boost::system::error_code& ec)
   {
- return this->service.write_some(this->implementation, buffers, ec);
+ return this->get_service().write_some(
+ this->get_implementation(), buffers, ec);
   }
 
   /// Start an asynchronous write.
@@ -191,8 +229,8 @@
     // not meet the documented type requirements for a WriteHandler.
     BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
- this->service.async_write_some(this->implementation, buffers,
- BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
+ this->get_service().async_write_some(this->get_implementation(),
+ buffers, BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
   }
 
   /// Read some data from the handle.
@@ -227,7 +265,8 @@
   std::size_t read_some(const MutableBufferSequence& buffers)
   {
     boost::system::error_code ec;
- std::size_t s = this->service.read_some(this->implementation, buffers, ec);
+ std::size_t s = this->get_service().read_some(
+ this->get_implementation(), buffers, ec);
     boost::asio::detail::throw_error(ec, "read_some");
     return s;
   }
@@ -253,7 +292,8 @@
   std::size_t read_some(const MutableBufferSequence& buffers,
       boost::system::error_code& ec)
   {
- return this->service.read_some(this->implementation, buffers, ec);
+ return this->get_service().read_some(
+ this->get_implementation(), buffers, ec);
   }
 
   /// Start an asynchronous read.
@@ -300,8 +340,8 @@
     // not meet the documented type requirements for a ReadHandler.
     BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
- this->service.async_read_some(this->implementation, buffers,
- BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
+ this->get_service().async_read_some(this->get_implementation(),
+ buffers, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
   }
 };
 

Modified: trunk/boost/asio/windows/random_access_handle_service.hpp
==============================================================================
--- trunk/boost/asio/windows/random_access_handle_service.hpp (original)
+++ trunk/boost/asio/windows/random_access_handle_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -87,6 +87,23 @@
     service_impl_.construct(impl);
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a new random-access handle implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_construct(impl, other_impl);
+ }
+
+ /// Move-assign from another random-access handle implementation.
+ void move_assign(implementation_type& impl,
+ random_access_handle_service& other_service,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_assign(impl, other_service.service_impl_, other_impl);
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Destroy a random-access handle implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/boost/asio/windows/stream_handle_service.hpp
==============================================================================
--- trunk/boost/asio/windows/stream_handle_service.hpp (original)
+++ trunk/boost/asio/windows/stream_handle_service.hpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -84,6 +84,23 @@
     service_impl_.construct(impl);
   }
 
+#if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+ /// Move-construct a new stream handle implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_construct(impl, other_impl);
+ }
+
+ /// Move-assign from another stream handle implementation.
+ void move_assign(implementation_type& impl,
+ stream_handle_service& other_service,
+ implementation_type& other_impl)
+ {
+ service_impl_.move_assign(impl, other_service.service_impl_, other_impl);
+ }
+#endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
   /// Destroy a stream handle implementation.
   void destroy(implementation_type& impl)
   {

Modified: trunk/libs/asio/doc/reference.qbk
==============================================================================
--- trunk/libs/asio/doc/reference.qbk (original)
+++ trunk/libs/asio/doc/reference.qbk 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -2956,7 +2956,9 @@
 
      Construct a basic_datagram_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_datagram_socket on an existing native socket. ]
+ Construct a basic_datagram_socket on an existing native socket.
+
+ Move-construct a basic_datagram_socket from another. ]
   ]
   
   [
@@ -3041,6 +3043,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_datagram_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_datagram_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_datagram_socket.receive [*receive]]]
     [Receive some data on a connected socket. ]
   ]
@@ -3077,6 +3084,22 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_datagram_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -3114,12 +3137,12 @@
 
   [
     [[link boost_asio.reference.basic_datagram_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_datagram_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -4010,7 +4033,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.basic_datagram_socket.basic_datagram_socket.overload4 more...]]``
 
 
-[section:overload1 basic_datagram_socket::basic_datagram_socket (1 of 4 overloads)]
+Move-construct a [link boost_asio.reference.basic_datagram_socket `basic_datagram_socket`] from another.
+
+
+ ``[link boost_asio.reference.basic_datagram_socket.basic_datagram_socket.overload5 basic_datagram_socket]``(
+ basic_datagram_socket && other);
+ `` [''''&raquo;''' [link boost_asio.reference.basic_datagram_socket.basic_datagram_socket.overload5 more...]]``
+
+
+[section:overload1 basic_datagram_socket::basic_datagram_socket (1 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_datagram_socket `basic_datagram_socket`] without opening it.
@@ -4039,7 +4070,7 @@
 
 
 
-[section:overload2 basic_datagram_socket::basic_datagram_socket (2 of 4 overloads)]
+[section:overload2 basic_datagram_socket::basic_datagram_socket (2 of 5 overloads)]
 
 
 Construct and open a [link boost_asio.reference.basic_datagram_socket `basic_datagram_socket`].
@@ -4081,7 +4112,7 @@
 
 
 
-[section:overload3 basic_datagram_socket::basic_datagram_socket (3 of 4 overloads)]
+[section:overload3 basic_datagram_socket::basic_datagram_socket (3 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_datagram_socket `basic_datagram_socket`], opening it and binding it to the given local endpoint.
@@ -4123,7 +4154,7 @@
 
 
 
-[section:overload4 basic_datagram_socket::basic_datagram_socket (4 of 4 overloads)]
+[section:overload4 basic_datagram_socket::basic_datagram_socket (4 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_datagram_socket `basic_datagram_socket`] on an existing native socket.
@@ -4167,6 +4198,40 @@
 [endsect]
 
 
+
+[section:overload5 basic_datagram_socket::basic_datagram_socket (5 of 5 overloads)]
+
+
+Move-construct a [link boost_asio.reference.basic_datagram_socket `basic_datagram_socket`] from another.
+
+
+ basic_datagram_socket(
+ basic_datagram_socket && other);
+
+
+This constructor moves a datagram socket from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_datagram_socket `basic_datagram_socket`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_datagram_socket(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:bind basic_datagram_socket::bind]
@@ -4541,7 +4606,7 @@
 
 [variablelist
   
-[[boost::system::system_error][Thrown on failure.]]
+[[boost::system::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -4578,7 +4643,7 @@
 
 [variablelist
   
-[[ec][Set to indicate what error occurred, if any.]]
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -4924,6 +4989,54 @@
 [endsect]
 
 
+[section:get_implementation basic_datagram_socket::get_implementation]
+
+[indexterm2 get_implementation..basic_datagram_socket]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_datagram_socket.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_datagram_socket.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_datagram_socket.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_datagram_socket.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_datagram_socket::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_datagram_socket::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service basic_datagram_socket::get_io_service]
 
@@ -5083,6 +5196,54 @@
 
 [endsect]
 
+[section:get_service basic_datagram_socket::get_service]
+
+[indexterm2 get_service..basic_datagram_socket]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_datagram_socket.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_datagram_socket.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_datagram_socket.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_datagram_socket.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_datagram_socket::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_datagram_socket::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_datagram_socket::implementation]
 
@@ -5090,7 +5251,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_datagram_socket]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -5775,7 +5936,9 @@
 
      Construct a basic_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_socket on an existing native socket. ]
+ Construct a basic_socket on an existing native socket.
+
+ Move-construct a basic_socket from another. ]
   ]
   
   [
@@ -5860,6 +6023,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
     [Get the remote endpoint of the socket. ]
   ]
@@ -5881,6 +6049,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.basic_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket._basic_socket [*~basic_socket]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -5924,12 +6102,12 @@
 
   [
     [[link boost_asio.reference.basic_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -6796,6 +6974,40 @@
 [endsect]
 
 
+[section:operator_eq_ basic_datagram_socket::operator=]
+
+[indexterm2 operator=..basic_datagram_socket]
+Move-assign a [link boost_asio.reference.basic_datagram_socket `basic_datagram_socket`] from another.
+
+
+ basic_datagram_socket & operator=(
+ basic_datagram_socket && other);
+
+
+This assignment operator moves a datagram socket from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_datagram_socket `basic_datagram_socket`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_datagram_socket(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
+
 [section:protocol_type basic_datagram_socket::protocol_type]
 
 [indexterm2 protocol_type..basic_datagram_socket]
@@ -7972,13 +8184,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_datagram_socket]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -8413,18 +8632,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_deadline_timer.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_deadline_timer.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.basic_deadline_timer.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_deadline_timer.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -9220,6 +9455,54 @@
 
 [endsect]
 
+[section:get_implementation basic_deadline_timer::get_implementation]
+
+[indexterm2 get_implementation..basic_deadline_timer]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_deadline_timer.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_deadline_timer.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_deadline_timer.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_deadline_timer.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_deadline_timer::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_deadline_timer::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service basic_deadline_timer::get_io_service]
 
@@ -9246,6 +9529,54 @@
 [endsect]
 
 
+[section:get_service basic_deadline_timer::get_service]
+
+[indexterm2 get_service..basic_deadline_timer]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_deadline_timer.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_deadline_timer.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_deadline_timer.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_deadline_timer.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_deadline_timer::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_deadline_timer::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_deadline_timer::implementation]
 
@@ -9253,7 +9584,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_deadline_timer]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -9294,13 +9625,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_deadline_timer]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -9453,8 +9791,7 @@
 
   template<
       typename ``[link boost_asio.reference.IoObjectService IoObjectService]``>
- class basic_io_object :
- noncopyable
+ class basic_io_object
 
 
 [heading Types]
@@ -9494,7 +9831,24 @@
 
   [
     [[link boost_asio.reference.basic_io_object.basic_io_object [*basic_io_object]]]
- [Construct a basic_io_object. ]
+ [Construct a basic_io_object.
+
+ Move-construct a basic_io_object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_io_object.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_io_object.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_io_object.operator_eq_ [*operator=]]]
+ [Move-assign a basic_io_object. ]
   ]
   
   [
@@ -9510,44 +9864,143 @@
 
   [
     [[link boost_asio.reference.basic_io_object.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_io_object.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
 
+
+[heading Remarks]
+
+All I/O objects are non-copyable. However, when using C++0x, certain I/O objects do support move construction and move assignment.
+
+
+
 [heading Requirements]
 
 [*Header: ][^boost/asio/basic_io_object.hpp]
 
 [*Convenience header: ][^boost/asio.hpp]
 
-
 [section:basic_io_object basic_io_object::basic_io_object]
 
 [indexterm2 basic_io_object..basic_io_object]
 Construct a [link boost_asio.reference.basic_io_object `basic_io_object`].
 
 
+ explicit ``[link boost_asio.reference.basic_io_object.basic_io_object.overload1 basic_io_object]``(
+ boost::asio::io_service & io_service);
+ `` [''''&raquo;''' [link boost_asio.reference.basic_io_object.basic_io_object.overload1 more...]]``
+
+
+Move-construct a [link boost_asio.reference.basic_io_object `basic_io_object`].
+
+
+ ``[link boost_asio.reference.basic_io_object.basic_io_object.overload2 basic_io_object]``(
+ basic_io_object && other);
+ `` [''''&raquo;''' [link boost_asio.reference.basic_io_object.basic_io_object.overload2 more...]]``
+
+
+[section:overload1 basic_io_object::basic_io_object (1 of 2 overloads)]
+
+
+Construct a [link boost_asio.reference.basic_io_object `basic_io_object`].
+
+
   basic_io_object(
       boost::asio::io_service & io_service);
 
 
 Performs:
 
- service.construct(implementation);
+ get_service().construct(get_implementation());
+
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_io_object::basic_io_object (2 of 2 overloads)]
+
+
+Move-construct a [link boost_asio.reference.basic_io_object `basic_io_object`].
+
+
+ basic_io_object(
+ basic_io_object && other);
+
+
+Performs:
+
+ get_service().move_construct(
+ get_implementation(), other.get_implementation());
+
+
+
+
+
+[heading Remarks]
+
+Available only for services that support movability,
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:get_implementation basic_io_object::get_implementation]
+
+[indexterm2 get_implementation..basic_io_object]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_io_object.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_io_object.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_io_object.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_io_object.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_io_object::get_implementation (1 of 2 overloads)]
 
 
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_io_object::get_implementation (2 of 2 overloads)]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
 
 
 
 [endsect]
 
 
+[endsect]
+
 
 [section:get_io_service basic_io_object::get_io_service]
 
@@ -9571,11 +10024,53 @@
 [endsect]
 
 
+[section:get_service basic_io_object::get_service]
+
+[indexterm2 get_service..basic_io_object]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_io_object.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_io_object.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_io_object.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_io_object.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_io_object::get_service (1 of 2 overloads)]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_io_object::get_service (2 of 2 overloads)]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_io_object::implementation]
 
 [indexterm2 implementation..basic_io_object]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -9607,16 +10102,53 @@
 
 
 
+[section:operator_eq_ basic_io_object::operator=]
+
+[indexterm2 operator=..basic_io_object]
+Move-assign a [link boost_asio.reference.basic_io_object `basic_io_object`].
+
+
+ basic_io_object & operator=(
+ basic_io_object && other);
+
+
+Performs:
+
+ get_service().move_assign(get_implementation(),
+ other.get_service(), other.get_implementation());
+
+
+
+
+
+[heading Remarks]
+
+Available only for services that support movability,
+
+
+
+
+[endsect]
+
+
+
 [section:service basic_io_object::service]
 
 [indexterm2 service..basic_io_object]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -9653,7 +10185,7 @@
 
 Performs:
 
- service.destroy(implementation);
+ get_service().destroy(get_implementation());
 
 
 
@@ -9890,7 +10422,9 @@
 
      Construct a basic_raw_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_raw_socket on an existing native socket. ]
+ Construct a basic_raw_socket on an existing native socket.
+
+ Move-construct a basic_raw_socket from another. ]
   ]
   
   [
@@ -9975,6 +10509,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_raw_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_raw_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_raw_socket.receive [*receive]]]
     [Receive some data on a connected socket. ]
   ]
@@ -10011,6 +10550,22 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_raw_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_raw_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -10048,12 +10603,12 @@
 
   [
     [[link boost_asio.reference.basic_raw_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_raw_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -10944,7 +11499,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.basic_raw_socket.basic_raw_socket.overload4 more...]]``
 
 
-[section:overload1 basic_raw_socket::basic_raw_socket (1 of 4 overloads)]
+Move-construct a [link boost_asio.reference.basic_raw_socket `basic_raw_socket`] from another.
+
+
+ ``[link boost_asio.reference.basic_raw_socket.basic_raw_socket.overload5 basic_raw_socket]``(
+ basic_raw_socket && other);
+ `` [''''&raquo;''' [link boost_asio.reference.basic_raw_socket.basic_raw_socket.overload5 more...]]``
+
+
+[section:overload1 basic_raw_socket::basic_raw_socket (1 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_raw_socket `basic_raw_socket`] without opening it.
@@ -10973,7 +11536,7 @@
 
 
 
-[section:overload2 basic_raw_socket::basic_raw_socket (2 of 4 overloads)]
+[section:overload2 basic_raw_socket::basic_raw_socket (2 of 5 overloads)]
 
 
 Construct and open a [link boost_asio.reference.basic_raw_socket `basic_raw_socket`].
@@ -11015,7 +11578,7 @@
 
 
 
-[section:overload3 basic_raw_socket::basic_raw_socket (3 of 4 overloads)]
+[section:overload3 basic_raw_socket::basic_raw_socket (3 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_raw_socket `basic_raw_socket`], opening it and binding it to the given local endpoint.
@@ -11057,7 +11620,7 @@
 
 
 
-[section:overload4 basic_raw_socket::basic_raw_socket (4 of 4 overloads)]
+[section:overload4 basic_raw_socket::basic_raw_socket (4 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_raw_socket `basic_raw_socket`] on an existing native socket.
@@ -11101,6 +11664,40 @@
 [endsect]
 
 
+
+[section:overload5 basic_raw_socket::basic_raw_socket (5 of 5 overloads)]
+
+
+Move-construct a [link boost_asio.reference.basic_raw_socket `basic_raw_socket`] from another.
+
+
+ basic_raw_socket(
+ basic_raw_socket && other);
+
+
+This constructor moves a raw socket from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_raw_socket `basic_raw_socket`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_raw_socket(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:bind basic_raw_socket::bind]
@@ -11475,7 +12072,7 @@
 
 [variablelist
   
-[[boost::system::system_error][Thrown on failure.]]
+[[boost::system::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -11512,7 +12109,7 @@
 
 [variablelist
   
-[[ec][Set to indicate what error occurred, if any.]]
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -11858,6 +12455,54 @@
 [endsect]
 
 
+[section:get_implementation basic_raw_socket::get_implementation]
+
+[indexterm2 get_implementation..basic_raw_socket]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_raw_socket.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_raw_socket.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_raw_socket.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_raw_socket.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_raw_socket::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_raw_socket::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service basic_raw_socket::get_io_service]
 
@@ -12017,6 +12662,54 @@
 
 [endsect]
 
+[section:get_service basic_raw_socket::get_service]
+
+[indexterm2 get_service..basic_raw_socket]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_raw_socket.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_raw_socket.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_raw_socket.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_raw_socket.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_raw_socket::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_raw_socket::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_raw_socket::implementation]
 
@@ -12024,7 +12717,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_raw_socket]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -12709,7 +13402,9 @@
 
      Construct a basic_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_socket on an existing native socket. ]
+ Construct a basic_socket on an existing native socket.
+
+ Move-construct a basic_socket from another. ]
   ]
   
   [
@@ -12794,6 +13489,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
     [Get the remote endpoint of the socket. ]
   ]
@@ -12815,6 +13515,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.basic_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket._basic_socket [*~basic_socket]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -12858,12 +13568,12 @@
 
   [
     [[link boost_asio.reference.basic_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -13730,6 +14440,40 @@
 [endsect]
 
 
+[section:operator_eq_ basic_raw_socket::operator=]
+
+[indexterm2 operator=..basic_raw_socket]
+Move-assign a [link boost_asio.reference.basic_raw_socket `basic_raw_socket`] from another.
+
+
+ basic_raw_socket & operator=(
+ basic_raw_socket && other);
+
+
+This assignment operator moves a raw socket from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_raw_socket `basic_raw_socket`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_raw_socket(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
+
 [section:protocol_type basic_raw_socket::protocol_type]
 
 [indexterm2 protocol_type..basic_raw_socket]
@@ -14906,13 +15650,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_raw_socket]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -15453,7 +16204,9 @@
 
      Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_seq_packet_socket on an existing native socket. ]
+ Construct a basic_seq_packet_socket on an existing native socket.
+
+ Move-construct a basic_seq_packet_socket from another. ]
   ]
   
   [
@@ -15538,6 +16291,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_seq_packet_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_seq_packet_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_seq_packet_socket.receive [*receive]]]
     [Receive some data on the socket.
 
@@ -15566,6 +16324,22 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_seq_packet_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_seq_packet_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -15603,12 +16377,12 @@
 
   [
     [[link boost_asio.reference.basic_seq_packet_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_seq_packet_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -16168,7 +16942,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload4 more...]]``
 
 
-[section:overload1 basic_seq_packet_socket::basic_seq_packet_socket (1 of 4 overloads)]
+Move-construct a [link boost_asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from another.
+
+
+ ``[link boost_asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload5 basic_seq_packet_socket]``(
+ basic_seq_packet_socket && other);
+ `` [''''&raquo;''' [link boost_asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload5 more...]]``
+
+
+[section:overload1 basic_seq_packet_socket::basic_seq_packet_socket (1 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] without opening it.
@@ -16197,7 +16979,7 @@
 
 
 
-[section:overload2 basic_seq_packet_socket::basic_seq_packet_socket (2 of 4 overloads)]
+[section:overload2 basic_seq_packet_socket::basic_seq_packet_socket (2 of 5 overloads)]
 
 
 Construct and open a [link boost_asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`].
@@ -16239,7 +17021,7 @@
 
 
 
-[section:overload3 basic_seq_packet_socket::basic_seq_packet_socket (3 of 4 overloads)]
+[section:overload3 basic_seq_packet_socket::basic_seq_packet_socket (3 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`], opening it and binding it to the given local endpoint.
@@ -16281,7 +17063,7 @@
 
 
 
-[section:overload4 basic_seq_packet_socket::basic_seq_packet_socket (4 of 4 overloads)]
+[section:overload4 basic_seq_packet_socket::basic_seq_packet_socket (4 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] on an existing native socket.
@@ -16325,6 +17107,40 @@
 [endsect]
 
 
+
+[section:overload5 basic_seq_packet_socket::basic_seq_packet_socket (5 of 5 overloads)]
+
+
+Move-construct a [link boost_asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from another.
+
+
+ basic_seq_packet_socket(
+ basic_seq_packet_socket && other);
+
+
+This constructor moves a sequenced packet socket from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_seq_packet_socket(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:bind basic_seq_packet_socket::bind]
@@ -16699,7 +17515,7 @@
 
 [variablelist
   
-[[boost::system::system_error][Thrown on failure.]]
+[[boost::system::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -16736,7 +17552,7 @@
 
 [variablelist
   
-[[ec][Set to indicate what error occurred, if any.]]
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -17082,6 +17898,54 @@
 [endsect]
 
 
+[section:get_implementation basic_seq_packet_socket::get_implementation]
+
+[indexterm2 get_implementation..basic_seq_packet_socket]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_seq_packet_socket.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_seq_packet_socket.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_seq_packet_socket.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_seq_packet_socket.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_seq_packet_socket::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_seq_packet_socket::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service basic_seq_packet_socket::get_io_service]
 
@@ -17241,6 +18105,54 @@
 
 [endsect]
 
+[section:get_service basic_seq_packet_socket::get_service]
+
+[indexterm2 get_service..basic_seq_packet_socket]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_seq_packet_socket.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_seq_packet_socket.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_seq_packet_socket.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_seq_packet_socket.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_seq_packet_socket::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_seq_packet_socket::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_seq_packet_socket::implementation]
 
@@ -17248,7 +18160,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_seq_packet_socket]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -17933,7 +18845,9 @@
 
      Construct a basic_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_socket on an existing native socket. ]
+ Construct a basic_socket on an existing native socket.
+
+ Move-construct a basic_socket from another. ]
   ]
   
   [
@@ -18018,6 +18932,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
     [Get the remote endpoint of the socket. ]
   ]
@@ -18039,6 +18958,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.basic_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket._basic_socket [*~basic_socket]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -18082,12 +19011,12 @@
 
   [
     [[link boost_asio.reference.basic_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -18954,6 +19883,40 @@
 [endsect]
 
 
+[section:operator_eq_ basic_seq_packet_socket::operator=]
+
+[indexterm2 operator=..basic_seq_packet_socket]
+Move-assign a [link boost_asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] from another.
+
+
+ basic_seq_packet_socket & operator=(
+ basic_seq_packet_socket && other);
+
+
+This assignment operator moves a sequenced packet socket from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_seq_packet_socket `basic_seq_packet_socket`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_seq_packet_socket(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
+
 [section:protocol_type basic_seq_packet_socket::protocol_type]
 
 [indexterm2 protocol_type..basic_seq_packet_socket]
@@ -19709,13 +20672,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_seq_packet_socket]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -20120,7 +21090,9 @@
 
      Construct and open a basic_serial_port.
 
- Construct a basic_serial_port on an existing native serial port. ]
+ Construct a basic_serial_port on an existing native serial port.
+
+ Move-construct a basic_serial_port from another. ]
   ]
   
   [
@@ -20171,6 +21143,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
+ [Move-assign a basic_serial_port from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_serial_port.read_some [*read_some]]]
     [Read some data from the serial port. ]
   ]
@@ -20192,18 +21169,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_serial_port.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_serial_port.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.basic_serial_port.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_serial_port.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -20421,7 +21414,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.basic_serial_port.basic_serial_port.overload4 more...]]``
 
 
-[section:overload1 basic_serial_port::basic_serial_port (1 of 4 overloads)]
+Move-construct a [link boost_asio.reference.basic_serial_port `basic_serial_port`] from another.
+
+
+ ``[link boost_asio.reference.basic_serial_port.basic_serial_port.overload5 basic_serial_port]``(
+ basic_serial_port && other);
+ `` [''''&raquo;''' [link boost_asio.reference.basic_serial_port.basic_serial_port.overload5 more...]]``
+
+
+[section:overload1 basic_serial_port::basic_serial_port (1 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_serial_port `basic_serial_port`] without opening it.
@@ -20450,7 +21451,7 @@
 
 
 
-[section:overload2 basic_serial_port::basic_serial_port (2 of 4 overloads)]
+[section:overload2 basic_serial_port::basic_serial_port (2 of 5 overloads)]
 
 
 Construct and open a [link boost_asio.reference.basic_serial_port `basic_serial_port`].
@@ -20482,7 +21483,7 @@
 
 
 
-[section:overload3 basic_serial_port::basic_serial_port (3 of 4 overloads)]
+[section:overload3 basic_serial_port::basic_serial_port (3 of 5 overloads)]
 
 
 Construct and open a [link boost_asio.reference.basic_serial_port `basic_serial_port`].
@@ -20514,7 +21515,7 @@
 
 
 
-[section:overload4 basic_serial_port::basic_serial_port (4 of 4 overloads)]
+[section:overload4 basic_serial_port::basic_serial_port (4 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_serial_port `basic_serial_port`] on an existing native serial port.
@@ -20555,6 +21556,40 @@
 [endsect]
 
 
+
+[section:overload5 basic_serial_port::basic_serial_port (5 of 5 overloads)]
+
+
+Move-construct a [link boost_asio.reference.basic_serial_port `basic_serial_port`] from another.
+
+
+ basic_serial_port(
+ basic_serial_port && other);
+
+
+This constructor moves a serial port from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_serial_port `basic_serial_port`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_serial_port(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:cancel basic_serial_port::cancel]
@@ -20701,6 +21736,54 @@
 
 [endsect]
 
+[section:get_implementation basic_serial_port::get_implementation]
+
+[indexterm2 get_implementation..basic_serial_port]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_serial_port.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_serial_port.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_serial_port.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_serial_port.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_serial_port::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_serial_port::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service basic_serial_port::get_io_service]
 
@@ -20825,6 +21908,54 @@
 
 [endsect]
 
+[section:get_service basic_serial_port::get_service]
+
+[indexterm2 get_service..basic_serial_port]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_serial_port.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_serial_port.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_serial_port.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_serial_port.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_serial_port::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_serial_port::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_serial_port::implementation]
 
@@ -20832,7 +21963,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_serial_port]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -21020,7 +22151,9 @@
 
      Construct and open a basic_serial_port.
 
- Construct a basic_serial_port on an existing native serial port. ]
+ Construct a basic_serial_port on an existing native serial port.
+
+ Move-construct a basic_serial_port from another. ]
   ]
   
   [
@@ -21071,6 +22204,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
+ [Move-assign a basic_serial_port from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_serial_port.read_some [*read_some]]]
     [Read some data from the serial port. ]
   ]
@@ -21092,18 +22230,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_serial_port.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_serial_port.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.basic_serial_port.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_serial_port.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -21292,6 +22446,40 @@
 
 [endsect]
 
+
+[section:operator_eq_ basic_serial_port::operator=]
+
+[indexterm2 operator=..basic_serial_port]
+Move-assign a [link boost_asio.reference.basic_serial_port `basic_serial_port`] from another.
+
+
+ basic_serial_port & operator=(
+ basic_serial_port && other);
+
+
+This assignment operator moves a serial port from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_serial_port `basic_serial_port`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_serial_port(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [section:read_some basic_serial_port::read_some]
 
 [indexterm2 read_some..basic_serial_port]
@@ -21497,13 +22685,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_serial_port]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -21837,18 +23032,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_signal_set.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_signal_set.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.basic_signal_set.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_signal_set.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -22447,6 +23658,54 @@
 
 [endsect]
 
+[section:get_implementation basic_signal_set::get_implementation]
+
+[indexterm2 get_implementation..basic_signal_set]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_signal_set.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_signal_set.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_signal_set.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_signal_set.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_signal_set::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_signal_set::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service basic_signal_set::get_io_service]
 
@@ -22473,6 +23732,54 @@
 [endsect]
 
 
+[section:get_service basic_signal_set::get_service]
+
+[indexterm2 get_service..basic_signal_set]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_signal_set.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_signal_set.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_signal_set.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_signal_set.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_signal_set::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_signal_set::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_signal_set::implementation]
 
@@ -22480,7 +23787,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_signal_set]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -22619,13 +23926,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_signal_set]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -22862,7 +24176,9 @@
 
      Construct a basic_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_socket on an existing native socket. ]
+ Construct a basic_socket on an existing native socket.
+
+ Move-construct a basic_socket from another. ]
   ]
   
   [
@@ -22947,6 +24263,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
     [Get the remote endpoint of the socket. ]
   ]
@@ -22968,6 +24289,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.basic_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket._basic_socket [*~basic_socket]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -23011,12 +24342,12 @@
 
   [
     [[link boost_asio.reference.basic_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -23358,7 +24689,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.basic_socket.basic_socket.overload4 more...]]``
 
 
-[section:overload1 basic_socket::basic_socket (1 of 4 overloads)]
+Move-construct a [link boost_asio.reference.basic_socket `basic_socket`] from another.
+
+
+ ``[link boost_asio.reference.basic_socket.basic_socket.overload5 basic_socket]``(
+ basic_socket && other);
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket.basic_socket.overload5 more...]]``
+
+
+[section:overload1 basic_socket::basic_socket (1 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_socket `basic_socket`] without opening it.
@@ -23387,7 +24726,7 @@
 
 
 
-[section:overload2 basic_socket::basic_socket (2 of 4 overloads)]
+[section:overload2 basic_socket::basic_socket (2 of 5 overloads)]
 
 
 Construct and open a [link boost_asio.reference.basic_socket `basic_socket`].
@@ -23429,7 +24768,7 @@
 
 
 
-[section:overload3 basic_socket::basic_socket (3 of 4 overloads)]
+[section:overload3 basic_socket::basic_socket (3 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_socket `basic_socket`], opening it and binding it to the given local endpoint.
@@ -23471,7 +24810,7 @@
 
 
 
-[section:overload4 basic_socket::basic_socket (4 of 4 overloads)]
+[section:overload4 basic_socket::basic_socket (4 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_socket `basic_socket`] on an existing native socket.
@@ -23515,6 +24854,40 @@
 [endsect]
 
 
+
+[section:overload5 basic_socket::basic_socket (5 of 5 overloads)]
+
+
+Move-construct a [link boost_asio.reference.basic_socket `basic_socket`] from another.
+
+
+ basic_socket(
+ basic_socket && other);
+
+
+This constructor moves a socket from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_socket `basic_socket`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_socket(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:bind basic_socket::bind]
@@ -23874,7 +25247,7 @@
 
 [variablelist
   
-[[boost::system::system_error][Thrown on failure.]]
+[[boost::system::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -23908,7 +25281,7 @@
 
 [variablelist
   
-[[ec][Set to indicate what error occurred, if any.]]
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -24248,25 +25621,73 @@
 [endsect]
 
 
+[section:get_implementation basic_socket::get_implementation]
 
-[section:get_io_service basic_socket::get_io_service]
+[indexterm2 get_implementation..basic_socket]
+Get the underlying implementation of the I/O object.
 
 
-['Inherited from basic_io_object.]
+ implementation_type & ``[link boost_asio.reference.basic_socket.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket.get_implementation.overload1 more...]]``
 
-[indexterm2 get_io_service..basic_socket]
-Get the [link boost_asio.reference.io_service `io_service`] associated with the object.
+ const implementation_type & ``[link boost_asio.reference.basic_socket.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket.get_implementation.overload2 more...]]``
 
 
- boost::asio::io_service & get_io_service();
+[section:overload1 basic_socket::get_implementation (1 of 2 overloads)]
 
 
-This function may be used to obtain the [link boost_asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+['Inherited from basic_io_object.]
 
 
-[heading Return Value]
-
-A reference to the [link boost_asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_socket::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:get_io_service basic_socket::get_io_service]
+
+
+['Inherited from basic_io_object.]
+
+[indexterm2 get_io_service..basic_socket]
+Get the [link boost_asio.reference.io_service `io_service`] associated with the object.
+
+
+ boost::asio::io_service & get_io_service();
+
+
+This function may be used to obtain the [link boost_asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+
+A reference to the [link boost_asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.
 
 
 
@@ -24405,6 +25826,54 @@
 
 [endsect]
 
+[section:get_service basic_socket::get_service]
+
+[indexterm2 get_service..basic_socket]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_socket.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_socket.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_socket::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_socket::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_socket::implementation]
 
@@ -24412,7 +25881,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_socket]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -25077,7 +26546,9 @@
 
      Construct a basic_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_socket on an existing native socket. ]
+ Construct a basic_socket on an existing native socket.
+
+ Move-construct a basic_socket from another. ]
   ]
   
   [
@@ -25162,6 +26633,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
     [Get the remote endpoint of the socket. ]
   ]
@@ -25183,6 +26659,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.basic_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket._basic_socket [*~basic_socket]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -25226,12 +26712,12 @@
 
   [
     [[link boost_asio.reference.basic_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -26068,6 +27554,40 @@
 [endsect]
 
 
+[section:operator_eq_ basic_socket::operator=]
+
+[indexterm2 operator=..basic_socket]
+Move-assign a [link boost_asio.reference.basic_socket `basic_socket`] from another.
+
+
+ basic_socket & operator=(
+ basic_socket && other);
+
+
+This assignment operator moves a socket from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_socket `basic_socket`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_socket(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
+
 [section:protocol_type basic_socket::protocol_type]
 
 [indexterm2 protocol_type..basic_socket]
@@ -26476,13 +27996,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_socket]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -27010,7 +28537,9 @@
 
      Construct an acceptor opened on the given endpoint.
 
- Construct a basic_socket_acceptor on an existing native acceptor. ]
+ Construct a basic_socket_acceptor on an existing native acceptor.
+
+ Move-construct a basic_socket_acceptor from another. ]
   ]
   
   [
@@ -27088,12 +28617,33 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket_acceptor.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket_acceptor from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket_acceptor.set_option [*set_option]]]
     [Set an option on the acceptor. ]
   ]
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_socket_acceptor.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket_acceptor.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -27131,12 +28681,12 @@
 
   [
     [[link boost_asio.reference.basic_socket_acceptor.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket_acceptor.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -27658,7 +29208,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload4 more...]]``
 
 
-[section:overload1 basic_socket_acceptor::basic_socket_acceptor (1 of 4 overloads)]
+Move-construct a [link boost_asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from another.
+
+
+ ``[link boost_asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload5 basic_socket_acceptor]``(
+ basic_socket_acceptor && other);
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload5 more...]]``
+
+
+[section:overload1 basic_socket_acceptor::basic_socket_acceptor (1 of 5 overloads)]
 
 
 Construct an acceptor without opening it.
@@ -27687,7 +29245,7 @@
 
 
 
-[section:overload2 basic_socket_acceptor::basic_socket_acceptor (2 of 4 overloads)]
+[section:overload2 basic_socket_acceptor::basic_socket_acceptor (2 of 5 overloads)]
 
 
 Construct an open acceptor.
@@ -27729,7 +29287,7 @@
 
 
 
-[section:overload3 basic_socket_acceptor::basic_socket_acceptor (3 of 4 overloads)]
+[section:overload3 basic_socket_acceptor::basic_socket_acceptor (3 of 5 overloads)]
 
 
 Construct an acceptor opened on the given endpoint.
@@ -27789,7 +29347,7 @@
 
 
 
-[section:overload4 basic_socket_acceptor::basic_socket_acceptor (4 of 4 overloads)]
+[section:overload4 basic_socket_acceptor::basic_socket_acceptor (4 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_socket_acceptor `basic_socket_acceptor`] on an existing native acceptor.
@@ -27833,6 +29391,40 @@
 [endsect]
 
 
+
+[section:overload5 basic_socket_acceptor::basic_socket_acceptor (5 of 5 overloads)]
+
+
+Move-construct a [link boost_asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from another.
+
+
+ basic_socket_acceptor(
+ basic_socket_acceptor && other);
+
+
+This constructor moves an acceptor from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_socket_acceptor `basic_socket_acceptor`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_socket_acceptor(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:bind basic_socket_acceptor::bind]
@@ -28397,6 +29989,54 @@
 [endsect]
 
 
+[section:get_implementation basic_socket_acceptor::get_implementation]
+
+[indexterm2 get_implementation..basic_socket_acceptor]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_socket_acceptor.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket_acceptor.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_socket_acceptor.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket_acceptor.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_socket_acceptor::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_socket_acceptor::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service basic_socket_acceptor::get_io_service]
 
@@ -28554,6 +30194,54 @@
 
 [endsect]
 
+[section:get_service basic_socket_acceptor::get_service]
+
+[indexterm2 get_service..basic_socket_acceptor]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_socket_acceptor.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket_acceptor.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_socket_acceptor.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket_acceptor.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_socket_acceptor::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_socket_acceptor::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_socket_acceptor::implementation]
 
@@ -28561,7 +30249,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_socket_acceptor]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -29654,6 +31342,40 @@
 [endsect]
 
 
+[section:operator_eq_ basic_socket_acceptor::operator=]
+
+[indexterm2 operator=..basic_socket_acceptor]
+Move-assign a [link boost_asio.reference.basic_socket_acceptor `basic_socket_acceptor`] from another.
+
+
+ basic_socket_acceptor & operator=(
+ basic_socket_acceptor && other);
+
+
+This assignment operator moves an acceptor from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_socket_acceptor `basic_socket_acceptor`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_socket_acceptor(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
+
 [section:protocol_type basic_socket_acceptor::protocol_type]
 
 [indexterm2 protocol_type..basic_socket_acceptor]
@@ -29951,13 +31673,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_socket_acceptor]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -30960,6 +32689,16 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket_streambuf.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket_streambuf.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket_streambuf.overflow [*overflow]]]
     []
   ]
@@ -31018,12 +32757,12 @@
 
   [
     [[link boost_asio.reference.basic_socket_streambuf.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket_streambuf.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -31764,7 +33503,7 @@
 
 [variablelist
   
-[[ec][Set to indicate what error occurred, if any.]]
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -32301,6 +34040,54 @@
 
 [endsect]
 
+[section:get_implementation basic_socket_streambuf::get_implementation]
+
+[indexterm2 get_implementation..basic_socket_streambuf]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_socket_streambuf.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket_streambuf.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_socket_streambuf.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket_streambuf.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_socket_streambuf::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_socket_streambuf::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service basic_socket_streambuf::get_io_service]
 
@@ -32460,6 +34247,54 @@
 
 [endsect]
 
+[section:get_service basic_socket_streambuf::get_service]
+
+[indexterm2 get_service..basic_socket_streambuf]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_socket_streambuf.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket_streambuf.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_socket_streambuf.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_socket_streambuf.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_socket_streambuf::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_socket_streambuf::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_socket_streambuf::implementation]
 
@@ -32467,7 +34302,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_socket_streambuf]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -33170,7 +35005,9 @@
 
      Construct a basic_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_socket on an existing native socket. ]
+ Construct a basic_socket on an existing native socket.
+
+ Move-construct a basic_socket from another. ]
   ]
   
   [
@@ -33255,6 +35092,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
     [Get the remote endpoint of the socket. ]
   ]
@@ -33276,6 +35118,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.basic_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket._basic_socket [*~basic_socket]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -33319,12 +35171,12 @@
 
   [
     [[link boost_asio.reference.basic_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -34648,13 +36500,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_socket_streambuf]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -35296,7 +37155,9 @@
 
      Construct a basic_stream_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_stream_socket on an existing native socket. ]
+ Construct a basic_stream_socket on an existing native socket.
+
+ Move-construct a basic_stream_socket from another. ]
   ]
   
   [
@@ -35381,6 +37242,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_stream_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_stream_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_stream_socket.read_some [*read_some]]]
     [Read some data from the socket. ]
   ]
@@ -35419,6 +37285,22 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_stream_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -35456,12 +37338,12 @@
 
   [
     [[link boost_asio.reference.basic_stream_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_stream_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -36223,7 +38105,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.basic_stream_socket.basic_stream_socket.overload4 more...]]``
 
 
-[section:overload1 basic_stream_socket::basic_stream_socket (1 of 4 overloads)]
+Move-construct a [link boost_asio.reference.basic_stream_socket `basic_stream_socket`] from another.
+
+
+ ``[link boost_asio.reference.basic_stream_socket.basic_stream_socket.overload5 basic_stream_socket]``(
+ basic_stream_socket && other);
+ `` [''''&raquo;''' [link boost_asio.reference.basic_stream_socket.basic_stream_socket.overload5 more...]]``
+
+
+[section:overload1 basic_stream_socket::basic_stream_socket (1 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_stream_socket `basic_stream_socket`] without opening it.
@@ -36252,7 +38142,7 @@
 
 
 
-[section:overload2 basic_stream_socket::basic_stream_socket (2 of 4 overloads)]
+[section:overload2 basic_stream_socket::basic_stream_socket (2 of 5 overloads)]
 
 
 Construct and open a [link boost_asio.reference.basic_stream_socket `basic_stream_socket`].
@@ -36294,7 +38184,7 @@
 
 
 
-[section:overload3 basic_stream_socket::basic_stream_socket (3 of 4 overloads)]
+[section:overload3 basic_stream_socket::basic_stream_socket (3 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_stream_socket `basic_stream_socket`], opening it and binding it to the given local endpoint.
@@ -36336,7 +38226,7 @@
 
 
 
-[section:overload4 basic_stream_socket::basic_stream_socket (4 of 4 overloads)]
+[section:overload4 basic_stream_socket::basic_stream_socket (4 of 5 overloads)]
 
 
 Construct a [link boost_asio.reference.basic_stream_socket `basic_stream_socket`] on an existing native socket.
@@ -36380,6 +38270,40 @@
 [endsect]
 
 
+
+[section:overload5 basic_stream_socket::basic_stream_socket (5 of 5 overloads)]
+
+
+Move-construct a [link boost_asio.reference.basic_stream_socket `basic_stream_socket`] from another.
+
+
+ basic_stream_socket(
+ basic_stream_socket && other);
+
+
+This constructor moves a stream socket from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_stream_socket `basic_stream_socket`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_socket(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:bind basic_stream_socket::bind]
@@ -36754,7 +38678,7 @@
 
 [variablelist
   
-[[boost::system::system_error][Thrown on failure.]]
+[[boost::system::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -36791,7 +38715,7 @@
 
 [variablelist
   
-[[ec][Set to indicate what error occurred, if any.]]
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.]]
 
 ]
 
@@ -37137,6 +39061,54 @@
 [endsect]
 
 
+[section:get_implementation basic_stream_socket::get_implementation]
+
+[indexterm2 get_implementation..basic_stream_socket]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.basic_stream_socket.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_stream_socket.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.basic_stream_socket.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_stream_socket.get_implementation.overload2 more...]]``
+
+
+[section:overload1 basic_stream_socket::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_stream_socket::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service basic_stream_socket::get_io_service]
 
@@ -37296,6 +39268,54 @@
 
 [endsect]
 
+[section:get_service basic_stream_socket::get_service]
+
+[indexterm2 get_service..basic_stream_socket]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.basic_stream_socket.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.basic_stream_socket.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.basic_stream_socket.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.basic_stream_socket.get_service.overload2 more...]]``
+
+
+[section:overload1 basic_stream_socket::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 basic_stream_socket::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation basic_stream_socket::implementation]
 
@@ -37303,7 +39323,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..basic_stream_socket]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -37988,7 +40008,9 @@
 
      Construct a basic_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_socket on an existing native socket. ]
+ Construct a basic_socket on an existing native socket.
+
+ Move-construct a basic_socket from another. ]
   ]
   
   [
@@ -38073,6 +40095,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket.remote_endpoint [*remote_endpoint]]]
     [Get the remote endpoint of the socket. ]
   ]
@@ -38094,6 +40121,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.basic_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket._basic_socket [*~basic_socket]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -38137,12 +40174,12 @@
 
   [
     [[link boost_asio.reference.basic_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -39009,33 +41046,67 @@
 [endsect]
 
 
-[section:protocol_type basic_stream_socket::protocol_type]
+[section:operator_eq_ basic_stream_socket::operator=]
 
-[indexterm2 protocol_type..basic_stream_socket]
-The protocol type.
+[indexterm2 operator=..basic_stream_socket]
+Move-assign a [link boost_asio.reference.basic_stream_socket `basic_stream_socket`] from another.
 
 
- typedef Protocol protocol_type;
+ basic_stream_socket & operator=(
+ basic_stream_socket && other);
 
 
+This assignment operator moves a stream socket from one object to another.
 
-[heading Requirements]
 
-[*Header: ][^boost/asio/basic_stream_socket.hpp]
+[heading Parameters]
+
 
-[*Convenience header: ][^boost/asio.hpp]
+[variablelist
+
+[[other][The other [link boost_asio.reference.basic_stream_socket `basic_stream_socket`] object from which the move will occur.]]
 
+]
 
-[endsect]
 
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_socket(io_service&) constructor`.
 
-[section:read_some basic_stream_socket::read_some]
 
-[indexterm2 read_some..basic_stream_socket]
-Read some data from the socket.
 
 
- template<
+[endsect]
+
+
+
+[section:protocol_type basic_stream_socket::protocol_type]
+
+[indexterm2 protocol_type..basic_stream_socket]
+The protocol type.
+
+
+ typedef Protocol protocol_type;
+
+
+
+[heading Requirements]
+
+[*Header: ][^boost/asio/basic_stream_socket.hpp]
+
+[*Convenience header: ][^boost/asio.hpp]
+
+
+[endsect]
+
+
+[section:read_some basic_stream_socket::read_some]
+
+[indexterm2 read_some..basic_stream_socket]
+Read some data from the socket.
+
+
+ template<
       typename ``[link boost_asio.reference.MutableBufferSequence MutableBufferSequence]``>
   std::size_t ``[link boost_asio.reference.basic_stream_socket.read_some.overload1 read_some]``(
       const MutableBufferSequence & buffers);
@@ -39955,13 +42026,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..basic_stream_socket]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -48146,6 +50224,16 @@
   ]
   
   [
+ [[link boost_asio.reference.datagram_socket_service.move_assign [*move_assign]]]
+ [Move-assign from another datagram socket implementation. ]
+ ]
+
+ [
+ [[link boost_asio.reference.datagram_socket_service.move_construct [*move_construct]]]
+ [Move-construct a new datagram socket implementation. ]
+ ]
+
+ [
     [[link boost_asio.reference.datagram_socket_service.native [*native]]]
     [(Deprecated: Use native_handle().) Get the native socket implementation. ]
   ]
@@ -48209,11 +50297,6 @@
     [Disable sends or receives on the socket. ]
   ]
   
- [
- [[link boost_asio.reference.datagram_socket_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
 ]
 
 [heading Data Members]
@@ -48640,6 +50723,39 @@
 
 
 
+[section:move_assign datagram_socket_service::move_assign]
+
+[indexterm2 move_assign..datagram_socket_service]
+Move-assign from another datagram socket implementation.
+
+
+ void move_assign(
+ implementation_type & impl,
+ datagram_socket_service & other_service,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:move_construct datagram_socket_service::move_construct]
+
+[indexterm2 move_construct..datagram_socket_service]
+Move-construct a new datagram socket implementation.
+
+
+ void move_construct(
+ implementation_type & impl,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
 [section:native datagram_socket_service::native]
 
 [indexterm2 native..datagram_socket_service]
@@ -48990,20 +51106,6 @@
 
 
 
-[section:shutdown_service datagram_socket_service::shutdown_service]
-
-[indexterm2 shutdown_service..datagram_socket_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [endsect]
 
 
@@ -49111,18 +51213,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_deadline_timer.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_deadline_timer.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.basic_deadline_timer.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_deadline_timer.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -49333,11 +51451,6 @@
   ]
   
   [
- [[link boost_asio.reference.deadline_timer_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.deadline_timer_service.wait [*wait]]]
     []
   ]
@@ -49636,20 +51749,6 @@
 
 
 
-[section:shutdown_service deadline_timer_service::shutdown_service]
-
-[indexterm2 shutdown_service..deadline_timer_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:time_type deadline_timer_service::time_type]
 
 [indexterm2 time_type..deadline_timer_service]
@@ -50480,6 +52579,13 @@
   
   ]
 
+ [
+
+ [[link boost_asio.reference.io_service.fork_event [*fork_event]]]
+ [Fork-related event notifications. ]
+
+ ]
+
 ]
 
 [heading Member Functions]
@@ -50497,6 +52603,11 @@
   ]
   
   [
+ [[link boost_asio.reference.io_service.notify_fork [*notify_fork]]]
+ [Notify the io_service of a fork-related event. ]
+ ]
+
+ [
     [[link boost_asio.reference.io_service.poll [*poll]]]
     [Run the io_service object's event processing loop to execute ready handlers. ]
   ]
@@ -50587,7 +52698,7 @@
   
 [*Distinct] [*objects:] Safe.
 
-[*Shared] [*objects:] Safe, with the exception that calling `reset()` while there are unfinished `run()`, `run_one()`, `poll()` or `poll_one()` calls results in undefined behaviour.
+[*Shared] [*objects:] Safe, with the specific exceptions of the `reset()` and `notify_fork()` functions. Calling `reset()` while there are unfinished `run()`, `run_one()`, `poll()` or `poll_one()` calls results in undefined behaviour. The `notify_fork()` function should not be called while any [link boost_asio.reference.io_service `io_service`] function, or any function on an I/O object that is associated with the [link boost_asio.reference.io_service `io_service`], is being called in another thread.
 
 
 
@@ -50789,6 +52900,44 @@
 
 
 
+[section:fork_event io_service::fork_event]
+
+[indexterm2 fork_event..io_service]
+Fork-related event notifications.
+
+
+ enum fork_event
+
+[indexterm2 fork_prepare..io_service]
+[indexterm2 fork_parent..io_service]
+[indexterm2 fork_child..io_service]
+
+[heading Values]
+[variablelist
+
+ [
+ [fork_prepare]
+ [Notify the io_service that the process is about to fork. ]
+ ]
+
+ [
+ [fork_parent]
+ [Notify the io_service that the process has forked and is the parent. ]
+ ]
+
+ [
+ [fork_child]
+ [Notify the io_service that the process has forked and is the child. ]
+ ]
+
+]
+
+
+
+[endsect]
+
+
+
 [section:has_service io_service::has_service]
 
 [indexterm2 has_service..io_service]
@@ -50888,6 +53037,72 @@
 
 [endsect]
 
+
+[section:notify_fork io_service::notify_fork]
+
+[indexterm2 notify_fork..io_service]
+Notify the [link boost_asio.reference.io_service `io_service`] of a fork-related event.
+
+
+ void notify_fork(
+ boost::asio::io_service::fork_event event);
+
+
+This function is used to inform the [link boost_asio.reference.io_service `io_service`] that the process is about to fork, or has just forked. This allows the [link boost_asio.reference.io_service `io_service`], and the services it contains, to perform any necessary housekeeping to ensure correct operation following a fork.
+
+This function must not be called while any other [link boost_asio.reference.io_service `io_service`] function, or any function on an I/O object associated with the [link boost_asio.reference.io_service `io_service`], is being called in another thread. It is, however, safe to call this function from within a completion handler, provided no other thread is accessing the [link boost_asio.reference.io_service `io_service`].
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[event][A fork-related event.]]
+
+]
+
+
+[heading Exceptions]
+
+
+[variablelist
+
+[[boost::system::system_error][Thrown on failure. If the notification fails the [link boost_asio.reference.io_service `io_service`] object should no longer be used and should be destroyed.]]
+
+]
+
+
+[heading Example]
+
+The following code illustrates how to incorporate the `notify_fork()` function:
+
+ my_io_service.notify_fork(boost::asio::io_service::fork_prepare);
+ if (fork() == 0)
+ {
+ // This is the child process.
+ my_io_service.notify_fork(boost::asio::io_service::fork_child);
+ }
+ else
+ {
+ // This is the parent process.
+ my_io_service.notify_fork(boost::asio::io_service::fork_parent);
+ }
+
+
+
+
+
+[heading Remarks]
+
+For each service object `svc` in the [link boost_asio.reference.io_service `io_service`] set, performs `svc->fork_service();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime.
+
+
+
+
+[endsect]
+
+
 [section:poll io_service::poll]
 
 [indexterm2 poll..io_service]
@@ -55323,18 +57538,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.ip__basic_resolver.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.ip__basic_resolver.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.ip__basic_resolver.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -55544,6 +57775,54 @@
 [endsect]
 
 
+[section:get_implementation ip::basic_resolver::get_implementation]
+
+[indexterm2 get_implementation..ip::basic_resolver]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.ip__basic_resolver.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.ip__basic_resolver.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.ip__basic_resolver.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.ip__basic_resolver.get_implementation.overload2 more...]]``
+
+
+[section:overload1 ip::basic_resolver::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 ip::basic_resolver::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service ip::basic_resolver::get_io_service]
 
@@ -55570,6 +57849,54 @@
 [endsect]
 
 
+[section:get_service ip::basic_resolver::get_service]
+
+[indexterm2 get_service..ip::basic_resolver]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.ip__basic_resolver.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.ip__basic_resolver.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.ip__basic_resolver.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.ip__basic_resolver.get_service.overload2 more...]]``
+
+
+[section:overload1 ip::basic_resolver::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 ip::basic_resolver::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation ip::basic_resolver::implementation]
 
@@ -55577,7 +57904,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..ip::basic_resolver]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -56107,13 +58434,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..ip::basic_resolver]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -57945,18 +60279,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.ip__basic_resolver.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.ip__basic_resolver.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.ip__basic_resolver.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -58205,7 +60555,9 @@
 
      Construct a basic_raw_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_raw_socket on an existing native socket. ]
+ Construct a basic_raw_socket on an existing native socket.
+
+ Move-construct a basic_raw_socket from another. ]
   ]
   
   [
@@ -58290,6 +60642,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_raw_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_raw_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_raw_socket.receive [*receive]]]
     [Receive some data on a connected socket. ]
   ]
@@ -58326,6 +60683,22 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_raw_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_raw_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -58363,12 +60736,12 @@
 
   [
     [[link boost_asio.reference.basic_raw_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_raw_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -58977,11 +61350,6 @@
     [Construct a new resolver service for the specified io_service. ]
   ]
   
- [
- [[link boost_asio.reference.ip__resolver_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
 ]
 
 [heading Data Members]
@@ -59536,20 +61904,6 @@
 
 
 
-[section:shutdown_service ip::resolver_service::shutdown_service]
-
-[indexterm2 shutdown_service..ip::resolver_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [endsect]
 
 [section:ip__tcp ip::tcp]
@@ -59866,7 +62220,9 @@
 
      Construct an acceptor opened on the given endpoint.
 
- Construct a basic_socket_acceptor on an existing native acceptor. ]
+ Construct a basic_socket_acceptor on an existing native acceptor.
+
+ Move-construct a basic_socket_acceptor from another. ]
   ]
   
   [
@@ -59944,12 +62300,33 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket_acceptor.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket_acceptor from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket_acceptor.set_option [*set_option]]]
     [Set an option on the acceptor. ]
   ]
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_socket_acceptor.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket_acceptor.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -59987,12 +62364,12 @@
 
   [
     [[link boost_asio.reference.basic_socket_acceptor.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket_acceptor.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -60506,18 +62883,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.ip__basic_resolver.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.ip__basic_resolver.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.ip__basic_resolver.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -60766,7 +63159,9 @@
 
      Construct a basic_stream_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_stream_socket on an existing native socket. ]
+ Construct a basic_stream_socket on an existing native socket.
+
+ Move-construct a basic_stream_socket from another. ]
   ]
   
   [
@@ -60851,6 +63246,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_stream_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_stream_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_stream_socket.read_some [*read_some]]]
     [Read some data from the socket. ]
   ]
@@ -60889,6 +63289,22 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_stream_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -60926,12 +63342,12 @@
 
   [
     [[link boost_asio.reference.basic_stream_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_stream_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -61431,18 +63847,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.ip__basic_resolver.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.ip__basic_resolver.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.ip__basic_resolver.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -61691,7 +64123,9 @@
 
      Construct a basic_datagram_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_datagram_socket on an existing native socket. ]
+ Construct a basic_datagram_socket on an existing native socket.
+
+ Move-construct a basic_datagram_socket from another. ]
   ]
   
   [
@@ -61776,6 +64210,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_datagram_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_datagram_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_datagram_socket.receive [*receive]]]
     [Receive some data on a connected socket. ]
   ]
@@ -61812,6 +64251,22 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_datagram_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -61849,12 +64304,12 @@
 
   [
     [[link boost_asio.reference.basic_datagram_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_datagram_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -63340,7 +65795,9 @@
 
      Construct a basic_datagram_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_datagram_socket on an existing native socket. ]
+ Construct a basic_datagram_socket on an existing native socket.
+
+ Move-construct a basic_datagram_socket from another. ]
   ]
   
   [
@@ -63425,6 +65882,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_datagram_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_datagram_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_datagram_socket.receive [*receive]]]
     [Receive some data on a connected socket. ]
   ]
@@ -63461,6 +65923,22 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_datagram_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -63498,12 +65976,12 @@
 
   [
     [[link boost_asio.reference.basic_datagram_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_datagram_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -63821,7 +66299,9 @@
 
      Construct an acceptor opened on the given endpoint.
 
- Construct a basic_socket_acceptor on an existing native acceptor. ]
+ Construct a basic_socket_acceptor on an existing native acceptor.
+
+ Move-construct a basic_socket_acceptor from another. ]
   ]
   
   [
@@ -63899,12 +66379,33 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_socket_acceptor.operator_eq_ [*operator=]]]
+ [Move-assign a basic_socket_acceptor from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_socket_acceptor.set_option [*set_option]]]
     [Set an option on the acceptor. ]
   ]
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_socket_acceptor.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_socket_acceptor.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -63942,12 +66443,12 @@
 
   [
     [[link boost_asio.reference.basic_socket_acceptor.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_socket_acceptor.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -64486,7 +66987,9 @@
 
      Construct a basic_stream_socket, opening it and binding it to the given local endpoint.
 
- Construct a basic_stream_socket on an existing native socket. ]
+ Construct a basic_stream_socket on an existing native socket.
+
+ Move-construct a basic_stream_socket from another. ]
   ]
   
   [
@@ -64571,6 +67074,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_stream_socket.operator_eq_ [*operator=]]]
+ [Move-assign a basic_stream_socket from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_stream_socket.read_some [*read_some]]]
     [Read some data from the socket. ]
   ]
@@ -64609,6 +67117,22 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_stream_socket.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Data Members]
 [table
   [[Name][Description]]
@@ -64646,12 +67170,12 @@
 
   [
     [[link boost_asio.reference.basic_stream_socket.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_stream_socket.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -65482,7 +68006,9 @@
     [[link boost_asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]]]
     [Construct a basic_descriptor without opening it.
 
- Construct a basic_descriptor on an existing native descriptor. ]
+ Construct a basic_descriptor on an existing native descriptor.
+
+ Move-construct a basic_descriptor from another. ]
   ]
   
   [
@@ -65542,6 +68068,11 @@
   ]
   
   [
+ [[link boost_asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
+ [Move-assign a basic_descriptor from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.posix__basic_descriptor.release [*release]]]
     [Release ownership of the native descriptor implementation. ]
   ]
@@ -65553,6 +68084,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.posix__basic_descriptor.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.posix__basic_descriptor.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -65565,12 +68106,12 @@
 
   [
     [[link boost_asio.reference.posix__basic_descriptor.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.posix__basic_descriptor.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -65660,7 +68201,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.posix__basic_descriptor.basic_descriptor.overload2 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::basic_descriptor (1 of 2 overloads)]
+Move-construct a [link boost_asio.reference.posix__basic_descriptor `posix::basic_descriptor`] from another.
+
+
+ ``[link boost_asio.reference.posix__basic_descriptor.basic_descriptor.overload3 basic_descriptor]``(
+ basic_descriptor && other);
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_descriptor.basic_descriptor.overload3 more...]]``
+
+
+[section:overload1 posix::basic_descriptor::basic_descriptor (1 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.posix__basic_descriptor `posix::basic_descriptor`] without opening it.
@@ -65689,7 +68238,7 @@
 
 
 
-[section:overload2 posix::basic_descriptor::basic_descriptor (2 of 2 overloads)]
+[section:overload2 posix::basic_descriptor::basic_descriptor (2 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.posix__basic_descriptor `posix::basic_descriptor`] on an existing native descriptor.
@@ -65730,6 +68279,40 @@
 [endsect]
 
 
+
+[section:overload3 posix::basic_descriptor::basic_descriptor (3 of 3 overloads)]
+
+
+Move-construct a [link boost_asio.reference.posix__basic_descriptor `posix::basic_descriptor`] from another.
+
+
+ basic_descriptor(
+ basic_descriptor && other);
+
+
+This constructor moves a descriptor from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.posix__basic_descriptor `posix::basic_descriptor`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_descriptor(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 
@@ -65878,7 +68461,7 @@
 
 [variablelist
   
-[[boost::system::system_error][Thrown on failure. ]]
+[[boost::system::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
 
 ]
 
@@ -65907,7 +68490,7 @@
 
 [variablelist
   
-[[ec][Set to indicate what error occurred, if any. ]]
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
 
 ]
 
@@ -65919,74 +68502,170 @@
 
 [endsect]
 
+[section:get_implementation posix::basic_descriptor::get_implementation]
 
-[section:get_io_service posix::basic_descriptor::get_io_service]
+[indexterm2 get_implementation..posix::basic_descriptor]
+Get the underlying implementation of the I/O object.
 
 
-['Inherited from basic_io_object.]
+ implementation_type & ``[link boost_asio.reference.posix__basic_descriptor.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_descriptor.get_implementation.overload1 more...]]``
 
-[indexterm2 get_io_service..posix::basic_descriptor]
-Get the [link boost_asio.reference.io_service `io_service`] associated with the object.
+ const implementation_type & ``[link boost_asio.reference.posix__basic_descriptor.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_descriptor.get_implementation.overload2 more...]]``
 
 
- boost::asio::io_service & get_io_service();
+[section:overload1 posix::basic_descriptor::get_implementation (1 of 2 overloads)]
 
 
-This function may be used to obtain the [link boost_asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+['Inherited from basic_io_object.]
 
 
-[heading Return Value]
-
-A reference to the [link boost_asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.
+Get the underlying implementation of the I/O object.
 
 
+ implementation_type & get_implementation();
+
 
 
 [endsect]
 
 
 
-[section:implementation posix::basic_descriptor::implementation]
+[section:overload2 posix::basic_descriptor::get_implementation (2 of 2 overloads)]
 
 
 ['Inherited from basic_io_object.]
 
-[indexterm2 implementation..posix::basic_descriptor]
-The underlying implementation of the I/O object.
 
+Get the underlying implementation of the I/O object.
 
- implementation_type implementation;
+
+ const implementation_type & get_implementation() const;
 
 
 
 [endsect]
 
 
+[endsect]
+
 
-[section:implementation_type posix::basic_descriptor::implementation_type]
+[section:get_io_service posix::basic_descriptor::get_io_service]
 
 
 ['Inherited from basic_io_object.]
 
-[indexterm2 implementation_type..posix::basic_descriptor]
-The underlying implementation type of I/O object.
+[indexterm2 get_io_service..posix::basic_descriptor]
+Get the [link boost_asio.reference.io_service `io_service`] associated with the object.
 
 
- typedef service_type::implementation_type implementation_type;
+ boost::asio::io_service & get_io_service();
+
 
+This function may be used to obtain the [link boost_asio.reference.io_service `io_service`] object that the I/O object uses to dispatch handlers for asynchronous operations.
 
 
-[heading Requirements]
+[heading Return Value]
+
+A reference to the [link boost_asio.reference.io_service `io_service`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.
 
-[*Header: ][^boost/asio/posix/basic_descriptor.hpp]
 
-[*Convenience header: ][^boost/asio.hpp]
 
 
 [endsect]
 
 
-[section:io_control posix::basic_descriptor::io_control]
+[section:get_service posix::basic_descriptor::get_service]
+
+[indexterm2 get_service..posix::basic_descriptor]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.posix__basic_descriptor.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_descriptor.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.posix__basic_descriptor.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_descriptor.get_service.overload2 more...]]``
+
+
+[section:overload1 posix::basic_descriptor::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::basic_descriptor::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:implementation posix::basic_descriptor::implementation]
+
+
+['Inherited from basic_io_object.]
+
+[indexterm2 implementation..posix::basic_descriptor]
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
+
+
+ implementation_type implementation;
+
+
+
+[endsect]
+
+
+
+[section:implementation_type posix::basic_descriptor::implementation_type]
+
+
+['Inherited from basic_io_object.]
+
+[indexterm2 implementation_type..posix::basic_descriptor]
+The underlying implementation type of I/O object.
+
+
+ typedef service_type::implementation_type implementation_type;
+
+
+
+[heading Requirements]
+
+[*Header: ][^boost/asio/posix/basic_descriptor.hpp]
+
+[*Convenience header: ][^boost/asio.hpp]
+
+
+[endsect]
+
+
+[section:io_control posix::basic_descriptor::io_control]
 
 [indexterm2 io_control..posix::basic_descriptor]
 Perform an IO control command on the descriptor.
@@ -66273,7 +68952,9 @@
     [[link boost_asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]]]
     [Construct a basic_descriptor without opening it.
 
- Construct a basic_descriptor on an existing native descriptor. ]
+ Construct a basic_descriptor on an existing native descriptor.
+
+ Move-construct a basic_descriptor from another. ]
   ]
   
   [
@@ -66333,6 +69014,11 @@
   ]
   
   [
+ [[link boost_asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
+ [Move-assign a basic_descriptor from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.posix__basic_descriptor.release [*release]]]
     [Release ownership of the native descriptor implementation. ]
   ]
@@ -66344,6 +69030,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.posix__basic_descriptor.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.posix__basic_descriptor.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -66356,12 +69052,12 @@
 
   [
     [[link boost_asio.reference.posix__basic_descriptor.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.posix__basic_descriptor.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -66755,6 +69451,40 @@
 
 
 
+[section:operator_eq_ posix::basic_descriptor::operator=]
+
+[indexterm2 operator=..posix::basic_descriptor]
+Move-assign a [link boost_asio.reference.posix__basic_descriptor `posix::basic_descriptor`] from another.
+
+
+ basic_descriptor & operator=(
+ basic_descriptor && other);
+
+
+This assignment operator moves a descriptor from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.posix__basic_descriptor `posix::basic_descriptor`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_descriptor(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
+
 [section:release posix::basic_descriptor::release]
 
 [indexterm2 release..posix::basic_descriptor]
@@ -66779,13 +69509,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..posix::basic_descriptor]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -66920,7 +69657,9 @@
     [[link boost_asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor [*basic_stream_descriptor]]]
     [Construct a basic_stream_descriptor without opening it.
 
- Construct a basic_stream_descriptor on an existing native descriptor. ]
+ Construct a basic_stream_descriptor on an existing native descriptor.
+
+ Move-construct a basic_stream_descriptor from another. ]
   ]
   
   [
@@ -66980,6 +69719,11 @@
   ]
   
   [
+ [[link boost_asio.reference.posix__basic_stream_descriptor.operator_eq_ [*operator=]]]
+ [Move-assign a basic_stream_descriptor from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.posix__basic_stream_descriptor.read_some [*read_some]]]
     [Read some data from the descriptor. ]
   ]
@@ -66996,18 +69740,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.posix__basic_stream_descriptor.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.posix__basic_stream_descriptor.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.posix__basic_stream_descriptor.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.posix__basic_stream_descriptor.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -67218,7 +69978,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload2 more...]]``
 
 
-[section:overload1 posix::basic_stream_descriptor::basic_stream_descriptor (1 of 2 overloads)]
+Move-construct a [link boost_asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] from another.
+
+
+ ``[link boost_asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload3 basic_stream_descriptor]``(
+ basic_stream_descriptor && other);
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload3 more...]]``
+
+
+[section:overload1 posix::basic_stream_descriptor::basic_stream_descriptor (1 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] without opening it.
@@ -67247,7 +70015,7 @@
 
 
 
-[section:overload2 posix::basic_stream_descriptor::basic_stream_descriptor (2 of 2 overloads)]
+[section:overload2 posix::basic_stream_descriptor::basic_stream_descriptor (2 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] on an existing native descriptor.
@@ -67288,6 +70056,40 @@
 [endsect]
 
 
+
+[section:overload3 posix::basic_stream_descriptor::basic_stream_descriptor (3 of 3 overloads)]
+
+
+Move-construct a [link boost_asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] from another.
+
+
+ basic_stream_descriptor(
+ basic_stream_descriptor && other);
+
+
+This constructor moves a stream descriptor from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_descriptor(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 
@@ -67445,7 +70247,7 @@
 
 [variablelist
   
-[[boost::system::system_error][Thrown on failure. ]]
+[[boost::system::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
 
 ]
 
@@ -67477,7 +70279,7 @@
 
 [variablelist
   
-[[ec][Set to indicate what error occurred, if any. ]]
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
 
 ]
 
@@ -67489,6 +70291,54 @@
 
 [endsect]
 
+[section:get_implementation posix::basic_stream_descriptor::get_implementation]
+
+[indexterm2 get_implementation..posix::basic_stream_descriptor]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.posix__basic_stream_descriptor.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_stream_descriptor.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.posix__basic_stream_descriptor.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_stream_descriptor.get_implementation.overload2 more...]]``
+
+
+[section:overload1 posix::basic_stream_descriptor::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::basic_stream_descriptor::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service posix::basic_stream_descriptor::get_io_service]
 
@@ -67515,6 +70365,54 @@
 [endsect]
 
 
+[section:get_service posix::basic_stream_descriptor::get_service]
+
+[indexterm2 get_service..posix::basic_stream_descriptor]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.posix__basic_stream_descriptor.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_stream_descriptor.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.posix__basic_stream_descriptor.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.posix__basic_stream_descriptor.get_service.overload2 more...]]``
+
+
+[section:overload1 posix::basic_stream_descriptor::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::basic_stream_descriptor::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation posix::basic_stream_descriptor::implementation]
 
@@ -67522,7 +70420,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..posix::basic_stream_descriptor]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -67857,7 +70755,9 @@
     [[link boost_asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]]]
     [Construct a basic_descriptor without opening it.
 
- Construct a basic_descriptor on an existing native descriptor. ]
+ Construct a basic_descriptor on an existing native descriptor.
+
+ Move-construct a basic_descriptor from another. ]
   ]
   
   [
@@ -67917,6 +70817,11 @@
   ]
   
   [
+ [[link boost_asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
+ [Move-assign a basic_descriptor from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.posix__basic_descriptor.release [*release]]]
     [Release ownership of the native descriptor implementation. ]
   ]
@@ -67928,6 +70833,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.posix__basic_descriptor.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.posix__basic_descriptor.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -67940,12 +70855,12 @@
 
   [
     [[link boost_asio.reference.posix__basic_descriptor.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.posix__basic_descriptor.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -68362,6 +71277,40 @@
 [endsect]
 
 
+
+[section:operator_eq_ posix::basic_stream_descriptor::operator=]
+
+[indexterm2 operator=..posix::basic_stream_descriptor]
+Move-assign a [link boost_asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] from another.
+
+
+ basic_stream_descriptor & operator=(
+ basic_stream_descriptor && other);
+
+
+This assignment operator moves a stream descriptor from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_descriptor(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [section:read_some posix::basic_stream_descriptor::read_some]
 
 [indexterm2 read_some..posix::basic_stream_descriptor]
@@ -68516,13 +71465,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..posix::basic_stream_descriptor]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -68909,7 +71865,9 @@
     [[link boost_asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor [*basic_stream_descriptor]]]
     [Construct a basic_stream_descriptor without opening it.
 
- Construct a basic_stream_descriptor on an existing native descriptor. ]
+ Construct a basic_stream_descriptor on an existing native descriptor.
+
+ Move-construct a basic_stream_descriptor from another. ]
   ]
   
   [
@@ -68969,6 +71927,11 @@
   ]
   
   [
+ [[link boost_asio.reference.posix__basic_stream_descriptor.operator_eq_ [*operator=]]]
+ [Move-assign a basic_stream_descriptor from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.posix__basic_stream_descriptor.read_some [*read_some]]]
     [Read some data from the descriptor. ]
   ]
@@ -68985,18 +71948,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.posix__basic_stream_descriptor.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.posix__basic_stream_descriptor.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.posix__basic_stream_descriptor.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.posix__basic_stream_descriptor.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -69116,6 +72095,16 @@
   ]
   
   [
+ [[link boost_asio.reference.posix__stream_descriptor_service.move_assign [*move_assign]]]
+ [Move-assign from another stream descriptor implementation. ]
+ ]
+
+ [
+ [[link boost_asio.reference.posix__stream_descriptor_service.move_construct [*move_construct]]]
+ [Move-construct a new stream descriptor implementation. ]
+ ]
+
+ [
     [[link boost_asio.reference.posix__stream_descriptor_service.native [*native]]]
     [(Deprecated: Use native_handle().) Get the native descriptor implementation. ]
   ]
@@ -69150,11 +72139,6 @@
   ]
   
   [
- [[link boost_asio.reference.posix__stream_descriptor_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.posix__stream_descriptor_service.stream_descriptor_service [*stream_descriptor_service]]]
     [Construct a new stream descriptor service for the specified io_service. ]
   ]
@@ -69389,6 +72373,39 @@
 
 
 
+[section:move_assign posix::stream_descriptor_service::move_assign]
+
+[indexterm2 move_assign..posix::stream_descriptor_service]
+Move-assign from another stream descriptor implementation.
+
+
+ void move_assign(
+ implementation_type & impl,
+ stream_descriptor_service & other_service,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:move_construct posix::stream_descriptor_service::move_construct]
+
+[indexterm2 move_construct..posix::stream_descriptor_service]
+Move-construct a new stream descriptor implementation.
+
+
+ void move_construct(
+ implementation_type & impl,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
 [section:native posix::stream_descriptor_service::native]
 
 [indexterm2 native..posix::stream_descriptor_service]
@@ -69603,20 +72620,6 @@
 
 
 
-[section:shutdown_service posix::stream_descriptor_service::shutdown_service]
-
-[indexterm2 shutdown_service..posix::stream_descriptor_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:stream_descriptor_service posix::stream_descriptor_service::stream_descriptor_service]
 
 [indexterm2 stream_descriptor_service..posix::stream_descriptor_service]
@@ -69806,6 +72809,16 @@
   ]
   
   [
+ [[link boost_asio.reference.raw_socket_service.move_assign [*move_assign]]]
+ [Move-assign from another raw socket implementation. ]
+ ]
+
+ [
+ [[link boost_asio.reference.raw_socket_service.move_construct [*move_construct]]]
+ [Move-construct a new raw socket implementation. ]
+ ]
+
+ [
     [[link boost_asio.reference.raw_socket_service.native [*native]]]
     [(Deprecated: Use native_handle().) Get the native socket implementation. ]
   ]
@@ -69874,11 +72887,6 @@
     [Disable sends or receives on the socket. ]
   ]
   
- [
- [[link boost_asio.reference.raw_socket_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
 ]
 
 [heading Data Members]
@@ -70290,6 +73298,39 @@
 
 
 
+[section:move_assign raw_socket_service::move_assign]
+
+[indexterm2 move_assign..raw_socket_service]
+Move-assign from another raw socket implementation.
+
+
+ void move_assign(
+ implementation_type & impl,
+ raw_socket_service & other_service,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:move_construct raw_socket_service::move_construct]
+
+[indexterm2 move_construct..raw_socket_service]
+Move-construct a new raw socket implementation.
+
+
+ void move_construct(
+ implementation_type & impl,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
 [section:native raw_socket_service::native]
 
 [indexterm2 native..raw_socket_service]
@@ -70655,20 +73696,6 @@
 
 
 
-[section:shutdown_service raw_socket_service::shutdown_service]
-
-[indexterm2 shutdown_service..raw_socket_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [endsect]
 
 [section:read read]
@@ -72905,6 +75932,16 @@
   ]
   
   [
+ [[link boost_asio.reference.seq_packet_socket_service.move_assign [*move_assign]]]
+ [Move-assign from another sequenced packet socket implementation. ]
+ ]
+
+ [
+ [[link boost_asio.reference.seq_packet_socket_service.move_construct [*move_construct]]]
+ [Move-construct a new sequenced packet socket implementation. ]
+ ]
+
+ [
     [[link boost_asio.reference.seq_packet_socket_service.native [*native]]]
     [(Deprecated: Use native_handle().) Get the native socket implementation. ]
   ]
@@ -72963,11 +76000,6 @@
     [Disable sends or receives on the socket. ]
   ]
   
- [
- [[link boost_asio.reference.seq_packet_socket_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
 ]
 
 [heading Data Members]
@@ -73338,6 +76370,39 @@
 
 
 
+[section:move_assign seq_packet_socket_service::move_assign]
+
+[indexterm2 move_assign..seq_packet_socket_service]
+Move-assign from another sequenced packet socket implementation.
+
+
+ void move_assign(
+ implementation_type & impl,
+ seq_packet_socket_service & other_service,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:move_construct seq_packet_socket_service::move_construct]
+
+[indexterm2 move_construct..seq_packet_socket_service]
+Move-construct a new sequenced packet socket implementation.
+
+
+ void move_construct(
+ implementation_type & impl,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
 [section:native seq_packet_socket_service::native]
 
 [indexterm2 native..seq_packet_socket_service]
@@ -73664,20 +76729,6 @@
 
 
 
-[section:shutdown_service seq_packet_socket_service::shutdown_service]
-
-[indexterm2 shutdown_service..seq_packet_socket_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [endsect]
 
 
@@ -73756,7 +76807,9 @@
 
      Construct and open a basic_serial_port.
 
- Construct a basic_serial_port on an existing native serial port. ]
+ Construct a basic_serial_port on an existing native serial port.
+
+ Move-construct a basic_serial_port from another. ]
   ]
   
   [
@@ -73807,6 +76860,11 @@
   ]
   
   [
+ [[link boost_asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
+ [Move-assign a basic_serial_port from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.basic_serial_port.read_some [*read_some]]]
     [Read some data from the serial port. ]
   ]
@@ -73828,18 +76886,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_serial_port.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_serial_port.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.basic_serial_port.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_serial_port.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -74684,6 +77758,16 @@
   ]
   
   [
+ [[link boost_asio.reference.serial_port_service.move_assign [*move_assign]]]
+ [Move-assign from another serial port implementation. ]
+ ]
+
+ [
+ [[link boost_asio.reference.serial_port_service.move_construct [*move_construct]]]
+ [Move-construct a new serial port implementation. ]
+ ]
+
+ [
     [[link boost_asio.reference.serial_port_service.native [*native]]]
     [(Deprecated: Use native_handle().) Get the native handle implementation. ]
   ]
@@ -74719,11 +77803,6 @@
   ]
   
   [
- [[link boost_asio.reference.serial_port_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.serial_port_service.write_some [*write_some]]]
     [Write the given data to the stream. ]
   ]
@@ -74953,6 +78032,39 @@
 
 
 
+[section:move_assign serial_port_service::move_assign]
+
+[indexterm2 move_assign..serial_port_service]
+Move-assign from another serial port implementation.
+
+
+ void move_assign(
+ implementation_type & impl,
+ serial_port_service & other_service,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:move_construct serial_port_service::move_construct]
+
+[indexterm2 move_construct..serial_port_service]
+Move-construct a new serial port implementation.
+
+
+ void move_construct(
+ implementation_type & impl,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
 [section:native serial_port_service::native]
 
 [indexterm2 native..serial_port_service]
@@ -75111,20 +78223,6 @@
 
 
 
-[section:shutdown_service serial_port_service::shutdown_service]
-
-[indexterm2 shutdown_service..serial_port_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:write_some serial_port_service::write_some]
 
 [indexterm2 write_some..serial_port_service]
@@ -75264,18 +78362,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.basic_signal_set.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.basic_signal_set.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.basic_signal_set.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.basic_signal_set.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -75421,11 +78535,6 @@
   ]
   
   [
- [[link boost_asio.reference.signal_set_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.signal_set_service.signal_set_service [*signal_set_service]]]
     [Construct a new signal set service for the specified io_service. ]
   ]
@@ -75614,20 +78723,6 @@
 
 
 
-[section:shutdown_service signal_set_service::shutdown_service]
-
-[indexterm2 shutdown_service..signal_set_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:signal_set_service signal_set_service::signal_set_service]
 
 [indexterm2 signal_set_service..signal_set_service]
@@ -75773,6 +78868,16 @@
   ]
   
   [
+ [[link boost_asio.reference.socket_acceptor_service.move_assign [*move_assign]]]
+ [Move-assign from another socket acceptor implementation. ]
+ ]
+
+ [
+ [[link boost_asio.reference.socket_acceptor_service.move_construct [*move_construct]]]
+ [Move-construct a new socket acceptor implementation. ]
+ ]
+
+ [
     [[link boost_asio.reference.socket_acceptor_service.native [*native]]]
     [(Deprecated: Use native_handle().) Get the native acceptor implementation. ]
   ]
@@ -75807,11 +78912,6 @@
   ]
   
   [
- [[link boost_asio.reference.socket_acceptor_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.socket_acceptor_service.socket_acceptor_service [*socket_acceptor_service]]]
     [Construct a new socket acceptor service for the specified io_service. ]
   ]
@@ -76133,9 +79233,42 @@
 
 
 
-[section:native socket_acceptor_service::native]
+[section:move_assign socket_acceptor_service::move_assign]
 
-[indexterm2 native..socket_acceptor_service]
+[indexterm2 move_assign..socket_acceptor_service]
+Move-assign from another socket acceptor implementation.
+
+
+ void move_assign(
+ implementation_type & impl,
+ socket_acceptor_service & other_service,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:move_construct socket_acceptor_service::move_construct]
+
+[indexterm2 move_construct..socket_acceptor_service]
+Move-construct a new socket acceptor implementation.
+
+
+ void move_construct(
+ implementation_type & impl,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:native socket_acceptor_service::native]
+
+[indexterm2 native..socket_acceptor_service]
 (Deprecated: Use `native_handle()`.) Get the native acceptor implementation.
 
 
@@ -76370,20 +79503,6 @@
 
 
 
-[section:shutdown_service socket_acceptor_service::shutdown_service]
-
-[indexterm2 shutdown_service..socket_acceptor_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:socket_acceptor_service socket_acceptor_service::socket_acceptor_service]
 
 [indexterm2 socket_acceptor_service..socket_acceptor_service]
@@ -79669,11 +82788,6 @@
   ]
   
   [
- [[link boost_asio.reference.ssl__context_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.ssl__context_service.use_certificate_chain_file [*use_certificate_chain_file]]]
     [Use a certificate chain from a file. ]
   ]
@@ -79917,20 +83031,6 @@
 
 
 
-[section:shutdown_service ssl::context_service::shutdown_service]
-
-[indexterm2 shutdown_service..ssl::context_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:use_certificate_chain_file ssl::context_service::use_certificate_chain_file]
 
 [indexterm2 use_certificate_chain_file..ssl::context_service]
@@ -81419,11 +84519,6 @@
   ]
   
   [
- [[link boost_asio.reference.ssl__stream_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.ssl__stream_service.stream_service [*stream_service]]]
     [Construct a new stream service for the specified io_service. ]
   ]
@@ -81742,20 +84837,6 @@
 
 
 
-[section:shutdown_service ssl::stream_service::shutdown_service]
-
-[indexterm2 shutdown_service..ssl::stream_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:stream_service ssl::stream_service::stream_service]
 
 [indexterm2 stream_service..ssl::stream_service]
@@ -82050,6 +85131,16 @@
   ]
   
   [
+ [[link boost_asio.reference.stream_socket_service.move_assign [*move_assign]]]
+ [Move-assign from another stream socket implementation. ]
+ ]
+
+ [
+ [[link boost_asio.reference.stream_socket_service.move_construct [*move_construct]]]
+ [Move-construct a new stream socket implementation. ]
+ ]
+
+ [
     [[link boost_asio.reference.stream_socket_service.native [*native]]]
     [(Deprecated: Use native_handle().) Get the native socket implementation. ]
   ]
@@ -82104,11 +85195,6 @@
   ]
   
   [
- [[link boost_asio.reference.stream_socket_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.stream_socket_service.stream_socket_service [*stream_socket_service]]]
     [Construct a new stream socket service for the specified io_service. ]
   ]
@@ -82482,6 +85568,39 @@
 
 
 
+[section:move_assign stream_socket_service::move_assign]
+
+[indexterm2 move_assign..stream_socket_service]
+Move-assign from another stream socket implementation.
+
+
+ void move_assign(
+ implementation_type & impl,
+ stream_socket_service & other_service,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:move_construct stream_socket_service::move_construct]
+
+[indexterm2 move_construct..stream_socket_service]
+Move-construct a new stream socket implementation.
+
+
+ void move_construct(
+ implementation_type & impl,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
 [section:native stream_socket_service::native]
 
 [indexterm2 native..stream_socket_service]
@@ -82792,20 +85911,6 @@
 
 
 
-[section:shutdown_service stream_socket_service::shutdown_service]
-
-[indexterm2 shutdown_service..stream_socket_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:stream_socket_service stream_socket_service::stream_socket_service]
 
 [indexterm2 stream_socket_service..stream_socket_service]
@@ -83419,7 +86524,9 @@
     [[link boost_asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
     [Construct a basic_handle without opening it.
 
- Construct a basic_handle on an existing native handle. ]
+ Construct a basic_handle on an existing native handle.
+
+ Move-construct a basic_handle from another. ]
   ]
   
   [
@@ -83459,6 +86566,11 @@
     [Get the native handle representation. ]
   ]
   
+ [
+ [[link boost_asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
+ [Move-assign a basic_handle from another. ]
+ ]
+
 ]
 
 [heading Protected Member Functions]
@@ -83466,6 +86578,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__basic_handle.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -83478,12 +86600,12 @@
 
   [
     [[link boost_asio.reference.windows__basic_handle.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.windows__basic_handle.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -83573,7 +86695,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.windows__basic_handle.basic_handle.overload2 more...]]``
 
 
-[section:overload1 windows::basic_handle::basic_handle (1 of 2 overloads)]
+Move-construct a [link boost_asio.reference.windows__basic_handle `windows::basic_handle`] from another.
+
+
+ ``[link boost_asio.reference.windows__basic_handle.basic_handle.overload3 basic_handle]``(
+ basic_handle && other);
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_handle.basic_handle.overload3 more...]]``
+
+
+[section:overload1 windows::basic_handle::basic_handle (1 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.windows__basic_handle `windows::basic_handle`] without opening it.
@@ -83602,7 +86732,7 @@
 
 
 
-[section:overload2 windows::basic_handle::basic_handle (2 of 2 overloads)]
+[section:overload2 windows::basic_handle::basic_handle (2 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.windows__basic_handle `windows::basic_handle`] on an existing native handle.
@@ -83643,6 +86773,40 @@
 [endsect]
 
 
+
+[section:overload3 windows::basic_handle::basic_handle (3 of 3 overloads)]
+
+
+Move-construct a [link boost_asio.reference.windows__basic_handle `windows::basic_handle`] from another.
+
+
+ basic_handle(
+ basic_handle && other);
+
+
+This constructor moves a handle from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.windows__basic_handle `windows::basic_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_handle(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:cancel windows::basic_handle::cancel]
@@ -83789,6 +86953,54 @@
 
 [endsect]
 
+[section:get_implementation windows::basic_handle::get_implementation]
+
+[indexterm2 get_implementation..windows::basic_handle]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.windows__basic_handle.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_handle.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.windows__basic_handle.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_handle.get_implementation.overload2 more...]]``
+
+
+[section:overload1 windows::basic_handle::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::basic_handle::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service windows::basic_handle::get_io_service]
 
@@ -83815,6 +87027,54 @@
 [endsect]
 
 
+[section:get_service windows::basic_handle::get_service]
+
+[indexterm2 get_service..windows::basic_handle]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.windows__basic_handle.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_handle.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.windows__basic_handle.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_handle.get_service.overload2 more...]]``
+
+
+[section:overload1 windows::basic_handle::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::basic_handle::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation windows::basic_handle::implementation]
 
@@ -83822,7 +87082,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..windows::basic_handle]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -83998,7 +87258,9 @@
     [[link boost_asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
     [Construct a basic_handle without opening it.
 
- Construct a basic_handle on an existing native handle. ]
+ Construct a basic_handle on an existing native handle.
+
+ Move-construct a basic_handle from another. ]
   ]
   
   [
@@ -84038,6 +87300,11 @@
     [Get the native handle representation. ]
   ]
   
+ [
+ [[link boost_asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
+ [Move-assign a basic_handle from another. ]
+ ]
+
 ]
 
 [heading Protected Member Functions]
@@ -84045,6 +87312,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__basic_handle.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -84057,12 +87334,12 @@
 
   [
     [[link boost_asio.reference.windows__basic_handle.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.windows__basic_handle.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -84164,19 +87441,60 @@
 
 
 
+[section:operator_eq_ windows::basic_handle::operator=]
+
+[indexterm2 operator=..windows::basic_handle]
+Move-assign a [link boost_asio.reference.windows__basic_handle `windows::basic_handle`] from another.
+
+
+ basic_handle & operator=(
+ basic_handle && other);
+
+
+This assignment operator moves a handle from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.windows__basic_handle `windows::basic_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_handle(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
+
 [section:service windows::basic_handle::service]
 
 
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..windows::basic_handle]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -84297,7 +87615,9 @@
     [[link boost_asio.reference.windows__basic_random_access_handle.basic_random_access_handle [*basic_random_access_handle]]]
     [Construct a basic_random_access_handle without opening it.
 
- Construct a basic_random_access_handle on an existing native handle. ]
+ Construct a basic_random_access_handle on an existing native handle.
+
+ Move-construct a basic_random_access_handle from another. ]
   ]
   
   [
@@ -84338,6 +87658,11 @@
   ]
   
   [
+ [[link boost_asio.reference.windows__basic_random_access_handle.operator_eq_ [*operator=]]]
+ [Move-assign a basic_random_access_handle from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__basic_random_access_handle.read_some_at [*read_some_at]]]
     [Read some data from the handle at the specified offset. ]
   ]
@@ -84349,18 +87674,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.windows__basic_random_access_handle.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__basic_random_access_handle.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.windows__basic_random_access_handle.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.windows__basic_random_access_handle.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -84576,7 +87917,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload2 more...]]``
 
 
-[section:overload1 windows::basic_random_access_handle::basic_random_access_handle (1 of 2 overloads)]
+Move-construct a [link boost_asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] from another.
+
+
+ ``[link boost_asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload3 basic_random_access_handle]``(
+ basic_random_access_handle && other);
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload3 more...]]``
+
+
+[section:overload1 windows::basic_random_access_handle::basic_random_access_handle (1 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] without opening it.
@@ -84605,7 +87954,7 @@
 
 
 
-[section:overload2 windows::basic_random_access_handle::basic_random_access_handle (2 of 2 overloads)]
+[section:overload2 windows::basic_random_access_handle::basic_random_access_handle (2 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] on an existing native handle.
@@ -84646,6 +87995,40 @@
 [endsect]
 
 
+
+[section:overload3 windows::basic_random_access_handle::basic_random_access_handle (3 of 3 overloads)]
+
+
+Move-construct a [link boost_asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] from another.
+
+
+ basic_random_access_handle(
+ basic_random_access_handle && other);
+
+
+This constructor moves a random-access handle from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_random_access_handle(io_service&)` constructor.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:cancel windows::basic_random_access_handle::cancel]
@@ -84804,6 +88187,54 @@
 
 [endsect]
 
+[section:get_implementation windows::basic_random_access_handle::get_implementation]
+
+[indexterm2 get_implementation..windows::basic_random_access_handle]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.windows__basic_random_access_handle.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_random_access_handle.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.windows__basic_random_access_handle.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_random_access_handle.get_implementation.overload2 more...]]``
+
+
+[section:overload1 windows::basic_random_access_handle::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::basic_random_access_handle::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service windows::basic_random_access_handle::get_io_service]
 
@@ -84830,6 +88261,54 @@
 [endsect]
 
 
+[section:get_service windows::basic_random_access_handle::get_service]
+
+[indexterm2 get_service..windows::basic_random_access_handle]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.windows__basic_random_access_handle.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_random_access_handle.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.windows__basic_random_access_handle.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_random_access_handle.get_service.overload2 more...]]``
+
+
+[section:overload1 windows::basic_random_access_handle::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::basic_random_access_handle::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation windows::basic_random_access_handle::implementation]
 
@@ -84837,7 +88316,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..windows::basic_random_access_handle]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -85025,7 +88504,9 @@
     [[link boost_asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
     [Construct a basic_handle without opening it.
 
- Construct a basic_handle on an existing native handle. ]
+ Construct a basic_handle on an existing native handle.
+
+ Move-construct a basic_handle from another. ]
   ]
   
   [
@@ -85065,6 +88546,11 @@
     [Get the native handle representation. ]
   ]
   
+ [
+ [[link boost_asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
+ [Move-assign a basic_handle from another. ]
+ ]
+
 ]
 
 [heading Protected Member Functions]
@@ -85072,6 +88558,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__basic_handle.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -85084,12 +88580,12 @@
 
   [
     [[link boost_asio.reference.windows__basic_handle.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.windows__basic_handle.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -85196,6 +88692,40 @@
 [endsect]
 
 
+
+[section:operator_eq_ windows::basic_random_access_handle::operator=]
+
+[indexterm2 operator=..windows::basic_random_access_handle]
+Move-assign a [link boost_asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] from another.
+
+
+ basic_random_access_handle & operator=(
+ basic_random_access_handle && other);
+
+
+This assignment operator moves a random-access handle from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_random_access_handle(io_service&)` constructor.
+
+
+
+
+[endsect]
+
+
 [section:read_some_at windows::basic_random_access_handle::read_some_at]
 
 [indexterm2 read_some_at..windows::basic_random_access_handle]
@@ -85337,13 +88867,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..windows::basic_random_access_handle]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -85584,7 +89121,9 @@
     [[link boost_asio.reference.windows__basic_stream_handle.basic_stream_handle [*basic_stream_handle]]]
     [Construct a basic_stream_handle without opening it.
 
- Construct a basic_stream_handle on an existing native handle. ]
+ Construct a basic_stream_handle on an existing native handle.
+
+ Move-construct a basic_stream_handle from another. ]
   ]
   
   [
@@ -85625,6 +89164,11 @@
   ]
   
   [
+ [[link boost_asio.reference.windows__basic_stream_handle.operator_eq_ [*operator=]]]
+ [Move-assign a basic_stream_handle from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__basic_stream_handle.read_some [*read_some]]]
     [Read some data from the handle. ]
   ]
@@ -85636,18 +89180,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.windows__basic_stream_handle.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__basic_stream_handle.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.windows__basic_stream_handle.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.windows__basic_stream_handle.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -85858,7 +89418,15 @@
   `` [''''&raquo;''' [link boost_asio.reference.windows__basic_stream_handle.basic_stream_handle.overload2 more...]]``
 
 
-[section:overload1 windows::basic_stream_handle::basic_stream_handle (1 of 2 overloads)]
+Move-construct a [link boost_asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] from another.
+
+
+ ``[link boost_asio.reference.windows__basic_stream_handle.basic_stream_handle.overload3 basic_stream_handle]``(
+ basic_stream_handle && other);
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_stream_handle.basic_stream_handle.overload3 more...]]``
+
+
+[section:overload1 windows::basic_stream_handle::basic_stream_handle (1 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] without opening it.
@@ -85887,7 +89455,7 @@
 
 
 
-[section:overload2 windows::basic_stream_handle::basic_stream_handle (2 of 2 overloads)]
+[section:overload2 windows::basic_stream_handle::basic_stream_handle (2 of 3 overloads)]
 
 
 Construct a [link boost_asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] on an existing native handle.
@@ -85928,6 +89496,40 @@
 [endsect]
 
 
+
+[section:overload3 windows::basic_stream_handle::basic_stream_handle (3 of 3 overloads)]
+
+
+Move-construct a [link boost_asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] from another.
+
+
+ basic_stream_handle(
+ basic_stream_handle && other);
+
+
+This constructor moves a stream handle from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_handle(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [endsect]
 
 [section:cancel windows::basic_stream_handle::cancel]
@@ -86086,6 +89688,54 @@
 
 [endsect]
 
+[section:get_implementation windows::basic_stream_handle::get_implementation]
+
+[indexterm2 get_implementation..windows::basic_stream_handle]
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & ``[link boost_asio.reference.windows__basic_stream_handle.get_implementation.overload1 get_implementation]``();
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_stream_handle.get_implementation.overload1 more...]]``
+
+ const implementation_type & ``[link boost_asio.reference.windows__basic_stream_handle.get_implementation.overload2 get_implementation]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_stream_handle.get_implementation.overload2 more...]]``
+
+
+[section:overload1 windows::basic_stream_handle::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::basic_stream_handle::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object.
+
+
+ const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:get_io_service windows::basic_stream_handle::get_io_service]
 
@@ -86112,6 +89762,54 @@
 [endsect]
 
 
+[section:get_service windows::basic_stream_handle::get_service]
+
+[indexterm2 get_service..windows::basic_stream_handle]
+Get the service associated with the I/O object.
+
+
+ service_type & ``[link boost_asio.reference.windows__basic_stream_handle.get_service.overload1 get_service]``();
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_stream_handle.get_service.overload1 more...]]``
+
+ const service_type & ``[link boost_asio.reference.windows__basic_stream_handle.get_service.overload2 get_service]``() const;
+ `` [''''&raquo;''' [link boost_asio.reference.windows__basic_stream_handle.get_service.overload2 more...]]``
+
+
+[section:overload1 windows::basic_stream_handle::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::basic_stream_handle::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object.
+
+
+ const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
 
 [section:implementation windows::basic_stream_handle::implementation]
 
@@ -86119,7 +89817,7 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 implementation..windows::basic_stream_handle]
-The underlying implementation of the I/O object.
+(Deprecated: Use `get_implementation()`.) The underlying implementation of the I/O object.
 
 
   implementation_type implementation;
@@ -86307,7 +90005,9 @@
     [[link boost_asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
     [Construct a basic_handle without opening it.
 
- Construct a basic_handle on an existing native handle. ]
+ Construct a basic_handle on an existing native handle.
+
+ Move-construct a basic_handle from another. ]
   ]
   
   [
@@ -86347,6 +90047,11 @@
     [Get the native handle representation. ]
   ]
   
+ [
+ [[link boost_asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
+ [Move-assign a basic_handle from another. ]
+ ]
+
 ]
 
 [heading Protected Member Functions]
@@ -86354,6 +90059,16 @@
   [[Name][Description]]
 
   [
+ [[link boost_asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__basic_handle.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
@@ -86366,12 +90081,12 @@
 
   [
     [[link boost_asio.reference.windows__basic_handle.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.windows__basic_handle.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -86478,6 +90193,40 @@
 [endsect]
 
 
+
+[section:operator_eq_ windows::basic_stream_handle::operator=]
+
+[indexterm2 operator=..windows::basic_stream_handle]
+Move-assign a [link boost_asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] from another.
+
+
+ basic_stream_handle & operator=(
+ basic_stream_handle && other);
+
+
+This assignment operator moves a stream handle from one object to another.
+
+
+[heading Parameters]
+
+
+[variablelist
+
+[[other][The other [link boost_asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+
+Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_handle(io_service&) constructor`.
+
+
+
+
+[endsect]
+
+
 [section:read_some windows::basic_stream_handle::read_some]
 
 [indexterm2 read_some..windows::basic_stream_handle]
@@ -86611,13 +90360,20 @@
 ['Inherited from basic_io_object.]
 
 [indexterm2 service..windows::basic_stream_handle]
-The service associated with the I/O object.
+(Deprecated: Use `get_service()`.) The service associated with the I/O object.
 
 
   service_type & service;
 
 
 
+[heading Remarks]
+
+Available only for services that do not support movability.
+
+
+
+
 [endsect]
 
 
@@ -87112,7 +90868,9 @@
     [[link boost_asio.reference.windows__basic_random_access_handle.basic_random_access_handle [*basic_random_access_handle]]]
     [Construct a basic_random_access_handle without opening it.
 
- Construct a basic_random_access_handle on an existing native handle. ]
+ Construct a basic_random_access_handle on an existing native handle.
+
+ Move-construct a basic_random_access_handle from another. ]
   ]
   
   [
@@ -87153,6 +90911,11 @@
   ]
   
   [
+ [[link boost_asio.reference.windows__basic_random_access_handle.operator_eq_ [*operator=]]]
+ [Move-assign a basic_random_access_handle from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__basic_random_access_handle.read_some_at [*read_some_at]]]
     [Read some data from the handle at the specified offset. ]
   ]
@@ -87164,18 +90927,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.windows__basic_random_access_handle.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__basic_random_access_handle.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.windows__basic_random_access_handle.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.windows__basic_random_access_handle.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -87289,6 +91068,16 @@
   ]
   
   [
+ [[link boost_asio.reference.windows__random_access_handle_service.move_assign [*move_assign]]]
+ [Move-assign from another random-access handle implementation. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__random_access_handle_service.move_construct [*move_construct]]]
+ [Move-construct a new random-access handle implementation. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__random_access_handle_service.native [*native]]]
     [(Deprecated: Use native_handle().) Get the native handle implementation. ]
   ]
@@ -87309,11 +91098,6 @@
   ]
   
   [
- [[link boost_asio.reference.windows__random_access_handle_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.windows__random_access_handle_service.write_some_at [*write_some_at]]]
     [Write the given data at the specified offset. ]
   ]
@@ -87526,6 +91310,39 @@
 
 
 
+[section:move_assign windows::random_access_handle_service::move_assign]
+
+[indexterm2 move_assign..windows::random_access_handle_service]
+Move-assign from another random-access handle implementation.
+
+
+ void move_assign(
+ implementation_type & impl,
+ random_access_handle_service & other_service,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:move_construct windows::random_access_handle_service::move_construct]
+
+[indexterm2 move_construct..windows::random_access_handle_service]
+Move-construct a new random-access handle implementation.
+
+
+ void move_construct(
+ implementation_type & impl,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
 [section:native windows::random_access_handle_service::native]
 
 [indexterm2 native..windows::random_access_handle_service]
@@ -87633,20 +91450,6 @@
 
 
 
-[section:shutdown_service windows::random_access_handle_service::shutdown_service]
-
-[indexterm2 shutdown_service..windows::random_access_handle_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:write_some_at windows::random_access_handle_service::write_some_at]
 
 [indexterm2 write_some_at..windows::random_access_handle_service]
@@ -87743,7 +91546,9 @@
     [[link boost_asio.reference.windows__basic_stream_handle.basic_stream_handle [*basic_stream_handle]]]
     [Construct a basic_stream_handle without opening it.
 
- Construct a basic_stream_handle on an existing native handle. ]
+ Construct a basic_stream_handle on an existing native handle.
+
+ Move-construct a basic_stream_handle from another. ]
   ]
   
   [
@@ -87784,6 +91589,11 @@
   ]
   
   [
+ [[link boost_asio.reference.windows__basic_stream_handle.operator_eq_ [*operator=]]]
+ [Move-assign a basic_stream_handle from another. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__basic_stream_handle.read_some [*read_some]]]
     [Read some data from the handle. ]
   ]
@@ -87795,18 +91605,34 @@
   
 ]
 
+[heading Protected Member Functions]
+[table
+ [[Name][Description]]
+
+ [
+ [[link boost_asio.reference.windows__basic_stream_handle.get_implementation [*get_implementation]]]
+ [Get the underlying implementation of the I/O object. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__basic_stream_handle.get_service [*get_service]]]
+ [Get the service associated with the I/O object. ]
+ ]
+
+]
+
 [heading Protected Data Members]
 [table
   [[Name][Description]]
 
   [
     [[link boost_asio.reference.windows__basic_stream_handle.implementation [*implementation]]]
- [The underlying implementation of the I/O object. ]
+ [(Deprecated: Use get_implementation().) The underlying implementation of the I/O object. ]
   ]
 
   [
     [[link boost_asio.reference.windows__basic_stream_handle.service [*service]]]
- [The service associated with the I/O object. ]
+ [(Deprecated: Use get_service().) The service associated with the I/O object. ]
   ]
 
 ]
@@ -87921,6 +91747,16 @@
   ]
   
   [
+ [[link boost_asio.reference.windows__stream_handle_service.move_assign [*move_assign]]]
+ [Move-assign from another stream handle implementation. ]
+ ]
+
+ [
+ [[link boost_asio.reference.windows__stream_handle_service.move_construct [*move_construct]]]
+ [Move-construct a new stream handle implementation. ]
+ ]
+
+ [
     [[link boost_asio.reference.windows__stream_handle_service.native [*native]]]
     [(Deprecated: Use native_handle().) Get the native handle implementation. ]
   ]
@@ -87936,11 +91772,6 @@
   ]
   
   [
- [[link boost_asio.reference.windows__stream_handle_service.shutdown_service [*shutdown_service]]]
- [Destroy all user-defined handler objects owned by the service. ]
- ]
-
- [
     [[link boost_asio.reference.windows__stream_handle_service.stream_handle_service [*stream_handle_service]]]
     [Construct a new stream handle service for the specified io_service. ]
   ]
@@ -88156,6 +91987,39 @@
 
 
 
+[section:move_assign windows::stream_handle_service::move_assign]
+
+[indexterm2 move_assign..windows::stream_handle_service]
+Move-assign from another stream handle implementation.
+
+
+ void move_assign(
+ implementation_type & impl,
+ stream_handle_service & other_service,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
+[section:move_construct windows::stream_handle_service::move_construct]
+
+[indexterm2 move_construct..windows::stream_handle_service]
+Move-construct a new stream handle implementation.
+
+
+ void move_construct(
+ implementation_type & impl,
+ implementation_type & other_impl);
+
+
+
+[endsect]
+
+
+
 [section:native windows::stream_handle_service::native]
 
 [indexterm2 native..windows::stream_handle_service]
@@ -88247,20 +92111,6 @@
 
 
 
-[section:shutdown_service windows::stream_handle_service::shutdown_service]
-
-[indexterm2 shutdown_service..windows::stream_handle_service]
-Destroy all user-defined handler objects owned by the service.
-
-
- virtual void shutdown_service();
-
-
-
-[endsect]
-
-
-
 [section:stream_handle_service windows::stream_handle_service::stream_handle_service]
 
 [indexterm2 stream_handle_service..windows::stream_handle_service]

Modified: trunk/libs/asio/doc/requirements/DescriptorService.qbk
==============================================================================
--- trunk/libs/asio/doc/requirements/DescriptorService.qbk (original)
+++ trunk/libs/asio/doc/requirements/DescriptorService.qbk 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -8,12 +8,12 @@
 [section:DescriptorService Descriptor service requirements]
 
 A descriptor service must meet the requirements for an [link
-boost_asio.reference.IoObjectService I/O object service], as well as the
-additional requirements listed below.
+boost_asio.reference.IoObjectService I/O object service] with support for movability,
+as well as the additional requirements listed below.
 
-In the table below, `X` denotes a descriptor service class, `a` denotes a value
-of type `X`, `b` denotes a value of type `X::implementation_type`, `n` denotes
-a value of type `X::native_handle_type`, `ec` denotes a value of type
+In the table below, `X` denotes a descriptor service class, `a` and `ao` denote
+values of type `X`, `b` and `c` denote values of type `X::implementation_type`,
+`n` denotes a value of type `X::native_handle_type`, `ec` denotes a value of type
 `error_code`, `i` denotes a value meeting [link boost_asio.reference.IoControlCommand
 `IoControlCommand`] requirements, and `u` and `v` denote identifiers.
 
@@ -48,6 +48,28 @@
   ]
   [
     [``
+ a.move_construct(b, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ The underlying native representation is moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
+ a.move_assign(b, ao, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ Implicitly cancels asynchronous operations associated with `b`, as if by
+ calling `a.close(b, ec)`. Then the underlying native representation is
+ moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
       a.assign(b, n, ec);
     ``]
     [`error_code`]

Modified: trunk/libs/asio/doc/requirements/HandleService.qbk
==============================================================================
--- trunk/libs/asio/doc/requirements/HandleService.qbk (original)
+++ trunk/libs/asio/doc/requirements/HandleService.qbk 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -8,13 +8,13 @@
 [section:HandleService Handle service requirements]
 
 A handle service must meet the requirements for an [link
-boost_asio.reference.IoObjectService I/O object service], as well as the
-additional requirements listed below.
+boost_asio.reference.IoObjectService I/O object service] with support for movability,
+as well as the additional requirements listed below.
 
-In the table below, `X` denotes a handle service class, `a` denotes a value of
-type `X`, `b` denotes a value of type `X::implementation_type`, `n` denotes a
-value of type `X::native_handle_type`, `ec` denotes a value of type
-`error_code`, and `u` and `v` denote identifiers.
+In the table below, `X` denotes a handle service class, `a` and `ao` denote
+values of type `X`, `b` and `c` denote values of type `X::implementation_type`,
+`n` denotes a value of type `X::native_handle_type`, `ec` denotes a value of
+type `error_code`, and `u` and `v` denote identifiers.
 
 [table HandleService requirements
   [[expression] [return type] [assertion/note\npre/post-condition]]
@@ -47,6 +47,28 @@
   ]
   [
     [``
+ a.move_construct(b, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ The underlying native representation is moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
+ a.move_assign(b, ao, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ Implicitly cancels asynchronous operations associated with `b`, as if by
+ calling `a.close(b, ec)`. Then the underlying native representation is
+ moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
       a.assign(b, n, ec);
     ``]
     [`error_code`]

Modified: trunk/libs/asio/doc/requirements/IoObjectService.qbk
==============================================================================
--- trunk/libs/asio/doc/requirements/IoObjectService.qbk (original)
+++ trunk/libs/asio/doc/requirements/IoObjectService.qbk 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -11,9 +11,9 @@
 boost_asio.reference.Service service], as well as the requirements listed
 below.
 
-In the table below, `X` denotes an I/O object service class, `a` denotes a
-value of type `X`, `b` denotes a value of type `X::implementation_type`, and
-`u` denotes an identifier.
+In the table below, `X` denotes an I/O object service class, `a` and `ao` denote
+values of type `X`, `b` and `c` denote values of type `X::implementation_type`,
+and `u` denotes an identifier.
 
 [table IoObjectService requirements
   [[expression] [return type] [assertion/note\npre/post-condition]]
@@ -41,7 +41,21 @@
     ``]
     []
     [note: `destroy()` will only be called on a value that has previously been
- initialised with `construct()`.]
+ initialised with `construct()` or `move_construct()`.]
+ ]
+ [
+ [``
+ a.move_construct(b, c);
+ ``]
+ []
+ [note: only required for I/O objects that support movability.]
+ ]
+ [
+ [``
+ a.move_assign(b, ao, c);
+ ``]
+ []
+ [note: only required for I/O objects that support movability.]
   ]
 ]
 

Modified: trunk/libs/asio/doc/requirements/SerialPortService.qbk
==============================================================================
--- trunk/libs/asio/doc/requirements/SerialPortService.qbk (original)
+++ trunk/libs/asio/doc/requirements/SerialPortService.qbk 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -8,13 +8,13 @@
 [section:SerialPortService Serial port service requirements]
 
 A serial port service must meet the requirements for an [link
-boost_asio.reference.IoObjectService I/O object service], as well as the
-additional requirements listed below.
+boost_asio.reference.IoObjectService I/O object service] with support for movability,
+as well as the additional requirements listed below.
 
-In the table below, `X` denotes a serial port service class, `a` denotes a
-value of type `X`, `d` denotes a serial port device name of type `std::string`,
-`b` denotes a value of type `X::implementation_type`, `n` denotes a value of
-type `X::native_handle_type`, `ec` denotes a value of type `error_code`, `s`
+In the table below, `X` denotes a serial port service class, `a` and `ao` denote
+values of type `X`, `d` denotes a serial port device name of type `std::string`,
+`b` and `c` denote values of type `X::implementation_type`, `n` denotes a value
+of type `X::native_handle_type`, `ec` denotes a value of type `error_code`, `s`
 denotes a value meeting [link boost_asio.reference.SettableSerialPortOption
 `SettableSerialPortOption`] requirements, `g` denotes a value meeting [link
 boost_asio.reference.GettableSerialPortOption `GettableSerialPortOption`]
@@ -57,6 +57,28 @@
   ]
   [
     [``
+ a.move_construct(b, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ The underlying native representation is moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
+ a.move_assign(b, ao, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ Implicitly cancels asynchronous operations associated with `b`, as if by
+ calling `a.close(b, ec)`. Then the underlying native representation is
+ moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
       const std::string& u = d;
       a.open(b, u, ec);
     ``]

Modified: trunk/libs/asio/doc/requirements/SocketAcceptorService.qbk
==============================================================================
--- trunk/libs/asio/doc/requirements/SocketAcceptorService.qbk (original)
+++ trunk/libs/asio/doc/requirements/SocketAcceptorService.qbk 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -12,20 +12,19 @@
 additional requirements listed below.
 
 In the table below, `X` denotes a socket acceptor service class for protocol
-[link boost_asio.reference.Protocol `Protocol`], `a` denotes a value of type
-`X`, `b` denotes a value of type `X::implementation_type`, `p` denotes a value
-of type `Protocol`, `n` denotes a value of type `X::native_handle_type`, `e`
-denotes a value of type `Protocol::endpoint`, `ec` denotes a value of type
+[link boost_asio.reference.Protocol `Protocol`], `a` and `ao` denote values of type
+`X`, `b` and `c` denote values of type `X::implementation_type`, `p` denotes a
+value of type `Protocol`, `n` denotes a value of type `X::native_handle_type`,
+`e` denotes a value of type `Protocol::endpoint`, `ec` denotes a value of type
 `error_code`, `s` denotes a value meeting [link
 boost_asio.reference.SettableSocketOption `SettableSocketOption`] requirements, `g`
 denotes a value meeting [link boost_asio.reference.GettableSocketOption
 `GettableSocketOption`] requirements, `i` denotes a value meeting [link
-boost_asio.reference.IoControlCommand `IoControlCommand`] requirements, `k`
-denotes a value of type `basic_socket<Protocol, SocketService>` where
-`SocketService` is a type meeting [link boost_asio.reference.SocketService
-socket service] requirements, `ah` denotes a value meeting [link
-boost_asio.reference.AcceptHandler `AcceptHandler`] requirements, and `u`
-and `v` denote identifiers.
+boost_asio.reference.IoControlCommand `IoControlCommand`] requirements, `k` denotes a
+value of type `basic_socket<Protocol, SocketService>` where `SocketService` is
+a type meeting [link boost_asio.reference.SocketService socket service] requirements,
+`ah` denotes a value meeting [link boost_asio.reference.AcceptHandler
+`AcceptHandler`] requirements, and `u` and `v` denote identifiers.
 
 [table SocketAcceptorService requirements
   [[expression] [return type] [assertion/note\npre/post-condition]]
@@ -58,6 +57,28 @@
   ]
   [
     [``
+ a.move_construct(b, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ The underlying native representation is moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
+ a.move_assign(b, ao, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ Implicitly cancels asynchronous operations associated with `b`, as if by
+ calling `a.close(b, ec)`. Then the underlying native representation is
+ moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
       a.open(b, p, ec);
     ``]
     [`error_code`]

Modified: trunk/libs/asio/doc/requirements/SocketService.qbk
==============================================================================
--- trunk/libs/asio/doc/requirements/SocketService.qbk (original)
+++ trunk/libs/asio/doc/requirements/SocketService.qbk 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -8,13 +8,13 @@
 [section:SocketService Socket service requirements]
 
 A socket service must meet the requirements for an [link
-boost_asio.reference.IoObjectService I/O object service], as well as the
-additional requirements listed below.
+boost_asio.reference.IoObjectService I/O object service] with support for movability,
+as well as the additional requirements listed below.
 
 In the table below, `X` denotes a socket service class for protocol [link
-boost_asio.reference.Protocol `Protocol`], `a` denotes a value of type `X`,
-`b` denotes a value of type `X::implementation_type`, `p` denotes a value of
-type `Protocol`, `n` denotes a value of type `X::native_handle_type`, `e`
+boost_asio.reference.Protocol `Protocol`], `a` and `ao` denote values of type `X`,
+`b` and `c` denote values of type `X::implementation_type`, `p` denotes a value
+of type `Protocol`, `n` denotes a value of type `X::native_handle_type`, `e`
 denotes a value of type `Protocol::endpoint`, `ec` denotes a value of type
 `error_code`, `s` denotes a value meeting [link
 boost_asio.reference.SettableSocketOption `SettableSocketOption`] requirements, `g`
@@ -56,6 +56,28 @@
   ]
   [
     [``
+ a.move_construct(b, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ The underlying native representation is moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
+ a.move_assign(b, ao, c);
+ ``]
+ []
+ [
+ From [link boost_asio.reference.IoObjectService IoObjectService] requirements.
+ Implicitly cancels asynchronous operations associated with `b`, as if by
+ calling `a.close(b, ec)`. Then the underlying native representation is
+ moved from `c` to `b`.
+ ]
+ ]
+ [
+ [``
       a.open(b, p, ec);
     ``]
     [`error_code`]

Modified: trunk/libs/asio/doc/tutorial.qbk
==============================================================================
--- trunk/libs/asio/doc/tutorial.qbk (original)
+++ trunk/libs/asio/doc/tutorial.qbk 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -634,7 +634,7 @@
 
   ``''''''``#include <iostream>
   ``''''''``#include <boost/asio.hpp>
- ``''''''``#include <boost/thread.hpp>
+ ``''''''``#include <boost/thread/thread.hpp>
   ``''''''``#include <boost/bind.hpp>
   ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>
 
@@ -759,7 +759,7 @@
 
   ``''''''``#include <iostream>
   ``''''''``#include <boost/asio.hpp>
- ``''''''``#include <boost/thread.hpp>
+ ``''''''``#include <boost/thread/thread.hpp>
   ``''''''``#include <boost/bind.hpp>
   ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>
 

Modified: trunk/libs/asio/test/ip/tcp.cpp
==============================================================================
--- trunk/libs/asio/test/ip/tcp.cpp (original)
+++ trunk/libs/asio/test/ip/tcp.cpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -157,7 +157,6 @@
     char mutable_char_buffer[128] = "";
     const char const_char_buffer[128] = "";
     socket_base::message_flags in_flags = 0;
- socket_base::keep_alive socket_option;
     archetypes::settable_socket_option<void> settable_socket_option1;
     archetypes::settable_socket_option<int> settable_socket_option2;
     archetypes::settable_socket_option<double> settable_socket_option3;
@@ -177,6 +176,17 @@
     int native_socket1 = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     ip::tcp::socket socket6(ios, ip::tcp::v4(), native_socket1);
 
+#if defined(BOOST_ASIO_HAS_MOVE)
+ ip::tcp::socket socket7(std::move(socket6));
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+ // basic_stream_socket operators.
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+ socket1 = ip::tcp::socket(ios);
+ socket1 = std::move(socket2);
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
     // basic_io_object functions.
 
     io_service& ios_ref = socket1.get_io_service();
@@ -187,9 +197,9 @@
     ip::tcp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
     (void)lowest_layer;
 
- const ip::tcp::socket& socket7 = socket1;
+ const ip::tcp::socket& socket8 = socket1;
     const ip::tcp::socket::lowest_layer_type& lowest_layer2
- = socket7.lowest_layer();
+ = socket8.lowest_layer();
     (void)lowest_layer2;
 
     socket1.open(ip::tcp::v4());
@@ -504,6 +514,142 @@
 
 //------------------------------------------------------------------------------
 
+// ip_tcp_acceptor_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::tcp::acceptor compile and link correctly. Runtime failures are ignored.
+
+namespace ip_tcp_acceptor_compile {
+
+void accept_handler(const boost::system::error_code&)
+{
+}
+
+void test()
+{
+ using namespace boost::asio;
+ namespace ip = boost::asio::ip;
+
+ try
+ {
+ io_service ios;
+ ip::tcp::socket peer_socket(ios);
+ ip::tcp::endpoint peer_endpoint;
+ archetypes::settable_socket_option<void> settable_socket_option1;
+ archetypes::settable_socket_option<int> settable_socket_option2;
+ archetypes::settable_socket_option<double> settable_socket_option3;
+ archetypes::gettable_socket_option<void> gettable_socket_option1;
+ archetypes::gettable_socket_option<int> gettable_socket_option2;
+ archetypes::gettable_socket_option<double> gettable_socket_option3;
+ archetypes::io_control_command io_control_command;
+ boost::system::error_code ec;
+
+ // basic_socket_acceptor constructors.
+
+ ip::tcp::acceptor acceptor1(ios);
+ ip::tcp::acceptor acceptor2(ios, ip::tcp::v4());
+ ip::tcp::acceptor acceptor3(ios, ip::tcp::v6());
+ ip::tcp::acceptor acceptor4(ios, ip::tcp::endpoint(ip::tcp::v4(), 0));
+ ip::tcp::acceptor acceptor5(ios, ip::tcp::endpoint(ip::tcp::v6(), 0));
+ int native_acceptor1 = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ ip::tcp::acceptor acceptor6(ios, ip::tcp::v4(), native_acceptor1);
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+ ip::tcp::acceptor acceptor7(std::move(acceptor6));
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+ // basic_socket_acceptor operators.
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+ acceptor1 = ip::tcp::acceptor(ios);
+ acceptor1 = std::move(acceptor2);
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+ // basic_io_object functions.
+
+ io_service& ios_ref = acceptor1.get_io_service();
+ (void)ios_ref;
+
+ // basic_socket_acceptor functions.
+
+ acceptor1.open(ip::tcp::v4());
+ acceptor1.open(ip::tcp::v6());
+ acceptor1.open(ip::tcp::v4(), ec);
+ acceptor1.open(ip::tcp::v6(), ec);
+
+ int native_acceptor2 = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ acceptor1.assign(ip::tcp::v4(), native_acceptor2);
+ int native_acceptor3 = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ acceptor1.assign(ip::tcp::v4(), native_acceptor3, ec);
+
+ bool is_open = acceptor1.is_open();
+ (void)is_open;
+
+ acceptor1.close();
+ acceptor1.close(ec);
+
+ ip::tcp::acceptor::native_type native_acceptor4 = acceptor1.native();
+ (void)native_acceptor4;
+
+ ip::tcp::acceptor::native_handle_type native_acceptor5
+ = acceptor1.native_handle();
+ (void)native_acceptor5;
+
+ acceptor1.cancel();
+ acceptor1.cancel(ec);
+
+ acceptor1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0));
+ acceptor1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0));
+ acceptor1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0), ec);
+ acceptor1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0), ec);
+
+ acceptor1.set_option(settable_socket_option1);
+ acceptor1.set_option(settable_socket_option1, ec);
+ acceptor1.set_option(settable_socket_option2);
+ acceptor1.set_option(settable_socket_option2, ec);
+ acceptor1.set_option(settable_socket_option3);
+ acceptor1.set_option(settable_socket_option3, ec);
+
+ acceptor1.get_option(gettable_socket_option1);
+ acceptor1.get_option(gettable_socket_option1, ec);
+ acceptor1.get_option(gettable_socket_option2);
+ acceptor1.get_option(gettable_socket_option2, ec);
+ acceptor1.get_option(gettable_socket_option3);
+ acceptor1.get_option(gettable_socket_option3, ec);
+
+ acceptor1.io_control(io_control_command);
+ acceptor1.io_control(io_control_command, ec);
+
+ bool non_blocking1 = acceptor1.non_blocking();
+ (void)non_blocking1;
+ acceptor1.non_blocking(true);
+ acceptor1.non_blocking(false, ec);
+
+ bool non_blocking2 = acceptor1.native_non_blocking();
+ (void)non_blocking2;
+ acceptor1.native_non_blocking(true);
+ acceptor1.native_non_blocking(false, ec);
+
+ ip::tcp::endpoint endpoint1 = acceptor1.local_endpoint();
+ ip::tcp::endpoint endpoint2 = acceptor1.local_endpoint(ec);
+
+ acceptor1.accept(peer_socket);
+ acceptor1.accept(peer_socket, ec);
+ acceptor1.accept(peer_socket, peer_endpoint);
+ acceptor1.accept(peer_socket, peer_endpoint, ec);
+
+ acceptor1.async_accept(peer_socket, accept_handler);
+ acceptor1.async_accept(peer_socket, peer_endpoint, accept_handler);
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_tcp_acceptor_compile
+
+//------------------------------------------------------------------------------
+
 // ip_tcp_acceptor_runtime test
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // The following test checks the runtime operation of the ip::tcp::acceptor
@@ -653,6 +799,7 @@
   test->add(BOOST_TEST_CASE(&ip_tcp_runtime::test));
   test->add(BOOST_TEST_CASE(&ip_tcp_socket_compile::test));
   test->add(BOOST_TEST_CASE(&ip_tcp_socket_runtime::test));
+ test->add(BOOST_TEST_CASE(&ip_tcp_acceptor_compile::test));
   test->add(BOOST_TEST_CASE(&ip_tcp_acceptor_runtime::test));
   test->add(BOOST_TEST_CASE(&ip_tcp_resolver_compile::test));
   return test;

Modified: trunk/libs/asio/test/ip/udp.cpp
==============================================================================
--- trunk/libs/asio/test/ip/udp.cpp (original)
+++ trunk/libs/asio/test/ip/udp.cpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -76,6 +76,17 @@
     int native_socket1 = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
     ip::udp::socket socket6(ios, ip::udp::v4(), native_socket1);
 
+#if defined(BOOST_ASIO_HAS_MOVE)
+ ip::udp::socket socket7(std::move(socket6));
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+ // basic_datagram_socket operators.
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+ socket1 = ip::udp::socket(ios);
+ socket1 = std::move(socket2);
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
     // basic_io_object functions.
 
     io_service& ios_ref = socket1.get_io_service();
@@ -86,9 +97,9 @@
     ip::udp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
     (void)lowest_layer;
 
- const ip::udp::socket& socket7 = socket1;
+ const ip::udp::socket& socket8 = socket1;
     const ip::udp::socket::lowest_layer_type& lowest_layer2
- = socket7.lowest_layer();
+ = socket8.lowest_layer();
     (void)lowest_layer2;
 
     socket1.open(ip::udp::v4());

Modified: trunk/libs/asio/test/posix/stream_descriptor.cpp
==============================================================================
--- trunk/libs/asio/test/posix/stream_descriptor.cpp (original)
+++ trunk/libs/asio/test/posix/stream_descriptor.cpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -57,6 +57,17 @@
     int native_descriptor1 = -1;
     posix::stream_descriptor descriptor2(ios, native_descriptor1);
 
+#if defined(BOOST_ASIO_HAS_MOVE)
+ posix::stream_descriptor descriptor3(std::move(descriptor3));
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+ // basic_stream_descriptor operators.
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+ descriptor1 = posix::stream_descriptor(ios);
+ descriptor1 = std::move(descriptor2);
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
     // basic_io_object functions.
 
     io_service& ios_ref = descriptor1.get_io_service();
@@ -68,9 +79,9 @@
       = descriptor1.lowest_layer();
     (void)lowest_layer;
 
- const posix::stream_descriptor& descriptor3 = descriptor1;
+ const posix::stream_descriptor& descriptor4 = descriptor1;
     const posix::stream_descriptor::lowest_layer_type& lowest_layer2
- = descriptor3.lowest_layer();
+ = descriptor4.lowest_layer();
     (void)lowest_layer2;
 
     int native_descriptor2 = -1;

Modified: trunk/libs/asio/test/serial_port.cpp
==============================================================================
--- trunk/libs/asio/test/serial_port.cpp (original)
+++ trunk/libs/asio/test/serial_port.cpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -57,6 +57,17 @@
     serial_port::native_handle_type native_port1 = port1.native_handle();
     serial_port port3(ios, native_port1);
 
+#if defined(BOOST_ASIO_HAS_MOVE)
+ serial_port port4(std::move(port3));
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+ // basic_serial_port operators.
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+ port1 = serial_port(ios);
+ port1 = std::move(port2);
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
     // basic_io_object functions.
 
     io_service& ios_ref = port1.get_io_service();
@@ -67,8 +78,8 @@
     serial_port::lowest_layer_type& lowest_layer = port1.lowest_layer();
     (void)lowest_layer;
 
- const serial_port& port4 = port1;
- const serial_port::lowest_layer_type& lowest_layer2 = port4.lowest_layer();
+ const serial_port& port5 = port1;
+ const serial_port::lowest_layer_type& lowest_layer2 = port5.lowest_layer();
     (void)lowest_layer2;
 
     port1.open("null");

Modified: trunk/libs/asio/test/windows/random_access_handle.cpp
==============================================================================
--- trunk/libs/asio/test/windows/random_access_handle.cpp (original)
+++ trunk/libs/asio/test/windows/random_access_handle.cpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -57,6 +57,17 @@
     HANDLE native_handle1 = INVALID_HANDLE_VALUE;
     win::random_access_handle handle2(ios, native_handle1);
 
+#if defined(BOOST_ASIO_HAS_MOVE)
+ win::random_access_handle handle3(std::move(handle2));
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+ // basic_random_access_handle operators.
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+ handle1 = win::random_access_handle(ios);
+ handle1 = std::move(handle2);
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
     // basic_io_object functions.
 
     io_service& ios_ref = handle1.get_io_service();
@@ -68,9 +79,9 @@
       = handle1.lowest_layer();
     (void)lowest_layer;
 
- const win::random_access_handle& handle3 = handle1;
+ const win::random_access_handle& handle4 = handle1;
     const win::random_access_handle::lowest_layer_type& lowest_layer2
- = handle3.lowest_layer();
+ = handle4.lowest_layer();
     (void)lowest_layer2;
 
     HANDLE native_handle2 = INVALID_HANDLE_VALUE;

Modified: trunk/libs/asio/test/windows/stream_handle.cpp
==============================================================================
--- trunk/libs/asio/test/windows/stream_handle.cpp (original)
+++ trunk/libs/asio/test/windows/stream_handle.cpp 2011-03-17 19:35:59 EDT (Thu, 17 Mar 2011)
@@ -56,6 +56,17 @@
     HANDLE native_handle1 = INVALID_HANDLE_VALUE;
     win::stream_handle handle2(ios, native_handle1);
 
+#if defined(BOOST_ASIO_HAS_MOVE)
+ win::stream_handle handle3(std::move(handle2));
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+ // basic_stream_handle operators.
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+ handle1 = win::stream_handle(ios);
+ handle1 = std::move(handle2);
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
     // basic_io_object functions.
 
     io_service& ios_ref = handle1.get_io_service();
@@ -67,9 +78,9 @@
       = handle1.lowest_layer();
     (void)lowest_layer;
 
- const win::stream_handle& handle3 = handle1;
+ const win::stream_handle& handle4 = handle1;
     const win::stream_handle::lowest_layer_type& lowest_layer2
- = handle3.lowest_layer();
+ = handle4.lowest_layer();
     (void)lowest_layer2;
 
     HANDLE native_handle2 = INVALID_HANDLE_VALUE;


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk