Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / asio / impl / buffered_read_stream.hpp
index 6a51d8e..c3b8b7a 100644 (file)
@@ -22,6 +22,7 @@
 #include <boost/asio/detail/handler_invoke_helpers.hpp>
 #include <boost/asio/detail/handler_type_requirements.hpp>
 #include <boost/asio/detail/non_const_lvalue.hpp>
+#include <boost/asio/detail/type_traits.hpp>
 
 #include <boost/asio/detail/push_options.hpp>
 
@@ -140,11 +141,26 @@ namespace detail
         function, this_handler->handler_);
   }
 
-  struct initiate_async_buffered_fill
+  template <typename Stream>
+  class initiate_async_buffered_fill
   {
-    template <typename ReadHandler, typename Stream>
+  public:
+    typedef typename remove_reference<
+      Stream>::type::lowest_layer_type::executor_type executor_type;
+
+    explicit initiate_async_buffered_fill(Stream& next_layer)
+      : next_layer_(next_layer)
+    {
+    }
+
+    executor_type get_executor() const BOOST_ASIO_NOEXCEPT
+    {
+      return next_layer_.lowest_layer().get_executor();
+    }
+
+    template <typename ReadHandler>
     void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
-        buffered_stream_storage* storage, Stream* next_layer) const
+        buffered_stream_storage* storage) const
     {
       // If you get an error on the following line it means that your handler
       // does not meet the documented type requirements for a ReadHandler.
@@ -153,13 +169,16 @@ namespace detail
       non_const_lvalue<ReadHandler> handler2(handler);
       std::size_t previous_size = storage->size();
       storage->resize(storage->capacity());
-      next_layer->async_read_some(
+      next_layer_.async_read_some(
           buffer(
             storage->data() + previous_size,
             storage->size() - previous_size),
           buffered_fill_handler<typename decay<ReadHandler>::type>(
             *storage, previous_size, handler2.value));
     }
+
+  private:
+    Stream& next_layer_;
   };
 } // namespace detail
 
@@ -194,15 +213,18 @@ struct associated_executor<
 #endif // !defined(GENERATING_DOCUMENTATION)
 
 template <typename Stream>
-template <typename ReadHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
+template <
+    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
+      std::size_t)) ReadHandler>
+BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
     void (boost::system::error_code, std::size_t))
 buffered_read_stream<Stream>::async_fill(
     BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
 {
   return async_initiate<ReadHandler,
     void (boost::system::error_code, std::size_t)>(
-      detail::initiate_async_buffered_fill(), handler, &storage_, &next_layer_);
+      detail::initiate_async_buffered_fill<Stream>(next_layer_),
+      handler, &storage_);
 }
 
 template <typename Stream>
@@ -336,12 +358,26 @@ namespace detail
         function, this_handler->handler_);
   }
 
-  struct initiate_async_buffered_read_some
+  template <typename Stream>
+  class initiate_async_buffered_read_some
   {
-    template <typename ReadHandler, typename Stream,
-        typename MutableBufferSequence>
+  public:
+    typedef typename remove_reference<
+      Stream>::type::lowest_layer_type::executor_type executor_type;
+
+    explicit initiate_async_buffered_read_some(Stream& next_layer)
+      : next_layer_(next_layer)
+    {
+    }
+
+    executor_type get_executor() const BOOST_ASIO_NOEXCEPT
+    {
+      return next_layer_.lowest_layer().get_executor();
+    }
+
+    template <typename ReadHandler, typename MutableBufferSequence>
     void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
-        buffered_stream_storage* storage, Stream* next_layer,
+        buffered_stream_storage* storage,
         const MutableBufferSequence& buffers) const
     {
       // If you get an error on the following line it means that your handler
@@ -352,20 +388,23 @@ namespace detail
       non_const_lvalue<ReadHandler> handler2(handler);
       if (buffer_size(buffers) == 0 || !storage->empty())
       {
-        next_layer->async_read_some(BOOST_ASIO_MUTABLE_BUFFER(0, 0),
+        next_layer_.async_read_some(BOOST_ASIO_MUTABLE_BUFFER(0, 0),
             buffered_read_some_handler<MutableBufferSequence,
               typename decay<ReadHandler>::type>(
                 *storage, buffers, handler2.value));
       }
       else
       {
-        initiate_async_buffered_fill()(
+        initiate_async_buffered_fill<Stream>(this->next_layer_)(
             buffered_read_some_handler<MutableBufferSequence,
               typename decay<ReadHandler>::type>(
                 *storage, buffers, handler2.value),
-            storage, next_layer);
+            storage);
       }
     }
+
+  private:
+    Stream& next_layer_;
   };
 } // namespace detail
 
@@ -408,8 +447,10 @@ struct associated_executor<
 #endif // !defined(GENERATING_DOCUMENTATION)
 
 template <typename Stream>
-template <typename MutableBufferSequence, typename ReadHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
+template <typename MutableBufferSequence,
+    BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
+      std::size_t)) ReadHandler>
+BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
     void (boost::system::error_code, std::size_t))
 buffered_read_stream<Stream>::async_read_some(
     const MutableBufferSequence& buffers,
@@ -417,8 +458,8 @@ buffered_read_stream<Stream>::async_read_some(
 {
   return async_initiate<ReadHandler,
     void (boost::system::error_code, std::size_t)>(
-      detail::initiate_async_buffered_read_some(),
-      handler, &storage_, &next_layer_, buffers);
+      detail::initiate_async_buffered_read_some<Stream>(next_layer_),
+      handler, &storage_, buffers);
 }
 
 template <typename Stream>