#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>
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.
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
#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>
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
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
#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,
{
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>