forked from boostorg/beast
Harmonize concepts and identifiers with net-ts (API Change):
fix #321 This synchronizes identifier names and some implementation details with the Networking-TS document and reference implementation. The following interfaces have changed: * async_completion * is_buffer_sequence (removed) * is_const_buffer_sequence (was is_ConstBufferSequence) * is_dynamic_buffer (was is_DynamicBuffer) * is_mutable_buffer_sequence (was is_MutableBufferSequence) * async_result (new) * BEAST_HANDLER_TYPE macro (new) * BEAST_INITFN_RESULT_TYPE macro (new) Filename changes: * async_result.hpp (was async_completion.hpp)
This commit is contained in:
@@ -20,6 +20,7 @@ API Changes:
|
||||
* Rename to flat_buffer, basic_flat_buffer
|
||||
* Rename to static_buffer, static_buffer_n
|
||||
* Rename to buffered_read_stream
|
||||
* Harmonize concepts and identifiers with net-ts
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
@@ -152,6 +152,7 @@
|
||||
<bridgehead renderas="sect3">Classes</bridgehead>
|
||||
<simplelist type="vert" columns="1">
|
||||
<member><link linkend="beast.ref.async_completion">async_completion</link></member>
|
||||
<member><link linkend="beast.ref.async_result">async_result</link></member>
|
||||
<member><link linkend="beast.ref.basic_flat_buffer">basic_flat_buffer</link></member>
|
||||
<member><link linkend="beast.ref.basic_multi_buffer">basic_multi_buffer</link></member>
|
||||
<member><link linkend="beast.ref.buffers_adapter">buffers_adapter</link></member>
|
||||
@@ -183,6 +184,11 @@
|
||||
<member><link linkend="beast.ref.prepare_buffers">prepare_buffers</link></member>
|
||||
<member><link linkend="beast.ref.system_category">system_category</link></member>
|
||||
</simplelist>
|
||||
<bridgehead renderas="sect3">Macros</bridgehead>
|
||||
<simplelist type="vert" columns="1">
|
||||
<member><link linkend="beast.ref.BEAST_HANDLER_TYPE">BEAST_HANDLER_TYPE</link></member>
|
||||
<member><link linkend="beast.ref.BEAST_INITFN_RESULT_TYPE">BEAST_INITFN_RESULT_TYPE</link></member>
|
||||
</simplelist>
|
||||
</entry>
|
||||
<entry valign="top">
|
||||
<bridgehead renderas="sect3">Type Traits</bridgehead>
|
||||
@@ -190,11 +196,10 @@
|
||||
<member><link linkend="beast.ref.is_AsyncReadStream">is_AsyncReadStream</link></member>
|
||||
<member><link linkend="beast.ref.is_AsyncWriteStream">is_AsyncWriteStream</link></member>
|
||||
<member><link linkend="beast.ref.is_AsyncStream">is_AsyncStream</link></member>
|
||||
<member><link linkend="beast.ref.is_BufferSequence">is_BufferSequence</link></member>
|
||||
<member><link linkend="beast.ref.is_CompletionHandler">is_CompletionHandler</link></member>
|
||||
<member><link linkend="beast.ref.is_ConstBufferSequence">is_ConstBufferSequence</link></member>
|
||||
<member><link linkend="beast.ref.is_DynamicBuffer">is_DynamicBuffer</link></member>
|
||||
<member><link linkend="beast.ref.is_MutableBufferSequence">is_MutableBufferSequence</link></member>
|
||||
<member><link linkend="beast.ref.is_const_buffer_sequence">is_const_buffer_sequence</link></member>
|
||||
<member><link linkend="beast.ref.is_dynamic_buffer">is_dynamic_buffer</link></member>
|
||||
<member><link linkend="beast.ref.is_mutable_buffer_sequence">is_mutable_buffer_sequence</link></member>
|
||||
<member><link linkend="beast.ref.is_SyncReadStream">is_SyncReadStream</link></member>
|
||||
<member><link linkend="beast.ref.is_SyncStream">is_SyncStream</link></member>
|
||||
<member><link linkend="beast.ref.is_SyncWriteStream">is_SyncWriteStream</link></member>
|
||||
|
@@ -282,7 +282,11 @@ EXPAND_ONLY_PREDEF = YES
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH = ../
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED = BEAST_DOXYGEN
|
||||
|
||||
PREDEFINED = \
|
||||
BEAST_DOXYGEN \
|
||||
BEAST_INITFN_RESULT_TYPE(t,a)=void_or_deduced
|
||||
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#ifndef BEAST_TEST_FAIL_STREAM_HPP
|
||||
#define BEAST_TEST_FAIL_STREAM_HPP
|
||||
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/bind_handler.hpp>
|
||||
#include <beast/core/error.hpp>
|
||||
#include <beast/core/detail/get_lowest_layer.hpp>
|
||||
@@ -103,20 +103,19 @@ public:
|
||||
}
|
||||
|
||||
template<class MutableBufferSequence, class ReadHandler>
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))
|
||||
async_read_some(MutableBufferSequence const& buffers,
|
||||
ReadHandler&& handler)
|
||||
{
|
||||
error_code ec;
|
||||
if(pfc_->fail(ec))
|
||||
{
|
||||
async_completion<
|
||||
ReadHandler, void(error_code, std::size_t)
|
||||
> completion{handler};
|
||||
async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
next_layer_.get_io_service().post(
|
||||
bind_handler(completion.handler, ec, 0));
|
||||
return completion.result.get();
|
||||
bind_handler(init.completion_handler, ec, 0));
|
||||
return init.result.get();
|
||||
}
|
||||
return next_layer_.async_read_some(buffers,
|
||||
std::forward<ReadHandler>(handler));
|
||||
@@ -140,20 +139,19 @@ public:
|
||||
}
|
||||
|
||||
template<class ConstBufferSequence, class WriteHandler>
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code, std::size_t))
|
||||
async_write_some(ConstBufferSequence const& buffers,
|
||||
WriteHandler&& handler)
|
||||
{
|
||||
error_code ec;
|
||||
if(pfc_->fail(ec))
|
||||
{
|
||||
async_completion<
|
||||
WriteHandler, void(error_code, std::size_t)
|
||||
> completion{handler};
|
||||
async_completion<WriteHandler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
next_layer_.get_io_service().post(
|
||||
bind_handler(completion.handler, ec, 0));
|
||||
return completion.result.get();
|
||||
bind_handler(init.completion_handler, ec, 0));
|
||||
return init.result.get();
|
||||
}
|
||||
return next_layer_.async_write_some(buffers,
|
||||
std::forward<WriteHandler>(handler));
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#ifndef BEAST_TEST_STRING_IOSTREAM_HPP
|
||||
#define BEAST_TEST_STRING_IOSTREAM_HPP
|
||||
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/bind_handler.hpp>
|
||||
#include <beast/core/error.hpp>
|
||||
#include <beast/core/prepare_buffer.hpp>
|
||||
@@ -78,8 +78,8 @@ public:
|
||||
}
|
||||
|
||||
template<class MutableBufferSequence, class ReadHandler>
|
||||
typename async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))
|
||||
async_read_some(MutableBufferSequence const& buffers,
|
||||
ReadHandler&& handler)
|
||||
{
|
||||
@@ -91,10 +91,10 @@ public:
|
||||
else
|
||||
ec = boost::asio::error::eof;
|
||||
async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> completion{handler};
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
ios_.post(bind_handler(
|
||||
completion.handler, ec, n));
|
||||
return completion.result.get();
|
||||
init.completion_handler, ec, n));
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
@@ -124,19 +124,18 @@ public:
|
||||
}
|
||||
|
||||
template<class ConstBufferSequence, class WriteHandler>
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code, std::size_t))
|
||||
async_write_some(ConstBufferSequence const& buffers,
|
||||
WriteHandler&& handler)
|
||||
{
|
||||
error_code ec;
|
||||
auto const bytes_transferred = write_some(buffers, ec);
|
||||
async_completion<
|
||||
WriteHandler, void(error_code, std::size_t)
|
||||
> completion{handler};
|
||||
async_completion<WriteHandler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
get_io_service().post(
|
||||
bind_handler(completion.handler, ec, bytes_transferred));
|
||||
return completion.result.get();
|
||||
bind_handler(init.completion_handler, ec, bytes_transferred));
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
friend
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#ifndef BEAST_TEST_STRING_ISTREAM_HPP
|
||||
#define BEAST_TEST_STRING_ISTREAM_HPP
|
||||
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/bind_handler.hpp>
|
||||
#include <beast/core/error.hpp>
|
||||
#include <beast/core/prepare_buffer.hpp>
|
||||
@@ -76,8 +76,8 @@ public:
|
||||
}
|
||||
|
||||
template<class MutableBufferSequence, class ReadHandler>
|
||||
typename async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))
|
||||
async_read_some(MutableBufferSequence const& buffers,
|
||||
ReadHandler&& handler)
|
||||
{
|
||||
@@ -89,10 +89,10 @@ public:
|
||||
else
|
||||
ec = boost::asio::error::eof;
|
||||
async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> completion{handler};
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
ios_.post(bind_handler(
|
||||
completion.handler, ec, n));
|
||||
return completion.result.get();
|
||||
init.completion_handler, ec, n));
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
@@ -115,16 +115,16 @@ public:
|
||||
}
|
||||
|
||||
template<class ConstBuffeSequence, class WriteHandler>
|
||||
typename async_completion<WriteHandler,
|
||||
void(error_code, std::size_t)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code, std::size_t))
|
||||
async_write_some(ConstBuffeSequence const& buffers,
|
||||
WriteHandler&& handler)
|
||||
{
|
||||
async_completion<WriteHandler,
|
||||
void(error_code, std::size_t)> completion{handler};
|
||||
ios_.post(bind_handler(completion.handler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
ios_.post(bind_handler(init.completion_handler,
|
||||
error_code{}, boost::asio::buffer_size(buffers)));
|
||||
return completion.result.get();
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
friend
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#ifndef BEAST_TEST_STRING_OSTREAM_HPP
|
||||
#define BEAST_TEST_STRING_OSTREAM_HPP
|
||||
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/bind_handler.hpp>
|
||||
#include <beast/core/error.hpp>
|
||||
#include <beast/websocket/teardown.hpp>
|
||||
@@ -59,16 +59,16 @@ public:
|
||||
}
|
||||
|
||||
template<class MutableBufferSequence, class ReadHandler>
|
||||
typename async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))
|
||||
async_read_some(MutableBufferSequence const& buffers,
|
||||
ReadHandler&& handler)
|
||||
{
|
||||
async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> completion{handler};
|
||||
ios_.post(bind_handler(completion.handler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
ios_.post(bind_handler(init.completion_handler,
|
||||
boost::asio::error::eof, 0));
|
||||
return completion.result.get();
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
@@ -98,19 +98,18 @@ public:
|
||||
}
|
||||
|
||||
template<class ConstBufferSequence, class WriteHandler>
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code, std::size_t))
|
||||
async_write_some(ConstBufferSequence const& buffers,
|
||||
WriteHandler&& handler)
|
||||
{
|
||||
error_code ec;
|
||||
auto const bytes_transferred = write_some(buffers, ec);
|
||||
async_completion<
|
||||
WriteHandler, void(error_code, std::size_t)
|
||||
> completion{handler};
|
||||
async_completion<WriteHandler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
get_io_service().post(
|
||||
bind_handler(completion.handler, ec, bytes_transferred));
|
||||
return completion.result.get();
|
||||
bind_handler(init.completion_handler, ec, bytes_transferred));
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
friend
|
||||
|
@@ -10,7 +10,7 @@
|
||||
|
||||
#include <beast/config.hpp>
|
||||
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/bind_handler.hpp>
|
||||
#include <beast/core/buffer_cat.hpp>
|
||||
#include <beast/core/buffer_concepts.hpp>
|
||||
|
@@ -1,88 +0,0 @@
|
||||
//
|
||||
// Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
#ifndef BEAST_ASYNC_COMPLETION_HPP
|
||||
#define BEAST_ASYNC_COMPLETION_HPP
|
||||
|
||||
#include <beast/config.hpp>
|
||||
#include <beast/core/handler_concepts.hpp>
|
||||
#include <boost/asio/async_result.hpp>
|
||||
#include <boost/asio/handler_type.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace beast {
|
||||
|
||||
/** Helper for customizing the return type of asynchronous initiation functions.
|
||||
|
||||
This class template is used to transform caller-provided completion
|
||||
handlers in calls to asynchronous initiation functions. The transformation
|
||||
allows customization of the return type of the initiating function, and the
|
||||
function signature of the final handler.
|
||||
|
||||
@tparam CompletionHandler A completion handler, or a user defined type
|
||||
with specializations for customizing the return type (for example,
|
||||
`boost::asio::use_future` or `boost::asio::yield_context`).
|
||||
|
||||
@tparam Signature The callable signature of the final completion handler.
|
||||
|
||||
Example:
|
||||
@code
|
||||
...
|
||||
template<class CompletionHandler>
|
||||
typename async_completion<CompletionHandler,
|
||||
void(error_code)>::result_type
|
||||
async_initfn(..., CompletionHandler&& handler)
|
||||
{
|
||||
async_completion<CompletionHandler,
|
||||
void(error_code)> completion{handler};
|
||||
...
|
||||
return completion.result.get();
|
||||
}
|
||||
@endcode
|
||||
|
||||
@note See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3896.pdf">
|
||||
Library Foundations For Asynchronous Operations</a>
|
||||
*/
|
||||
template<class CompletionHandler, class Signature>
|
||||
struct async_completion
|
||||
{
|
||||
/** The type of the final handler called by the asynchronous initiation function.
|
||||
|
||||
Objects of this type will be callable with the specified signature.
|
||||
*/
|
||||
using handler_type =
|
||||
typename boost::asio::handler_type<
|
||||
CompletionHandler, Signature>::type;
|
||||
|
||||
/// The type of the value returned by the asynchronous initiation function.
|
||||
using result_type = typename
|
||||
boost::asio::async_result<handler_type>::type;
|
||||
|
||||
/** Construct the helper.
|
||||
|
||||
@param token The completion handler. Copies will be made as
|
||||
required. If `CompletionHandler` is movable, it may also be moved.
|
||||
*/
|
||||
async_completion(typename std::remove_reference<CompletionHandler>::type& token)
|
||||
: handler(std::forward<CompletionHandler>(token))
|
||||
, result(handler)
|
||||
{
|
||||
static_assert(is_CompletionHandler<handler_type, Signature>::value,
|
||||
"Handler requirements not met");
|
||||
}
|
||||
|
||||
/// The final completion handler, callable with the specified signature.
|
||||
handler_type handler;
|
||||
|
||||
/// The return value of the asynchronous initiation function.
|
||||
boost::asio::async_result<handler_type> result;
|
||||
};
|
||||
|
||||
} // beast
|
||||
|
||||
#endif
|
188
include/beast/core/async_result.hpp
Normal file
188
include/beast/core/async_result.hpp
Normal file
@@ -0,0 +1,188 @@
|
||||
//
|
||||
// Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
#ifndef BEAST_ASYNC_COMPLETION_HPP
|
||||
#define BEAST_ASYNC_COMPLETION_HPP
|
||||
|
||||
#include <beast/config.hpp>
|
||||
#include <beast/core/handler_concepts.hpp>
|
||||
#include <beast/core/detail/type_traits.hpp>
|
||||
#include <boost/asio/async_result.hpp>
|
||||
#include <boost/asio/handler_type.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace beast {
|
||||
|
||||
/** An interface for customising the behaviour of an initiating function.
|
||||
|
||||
The async_result class is used for determining:
|
||||
|
||||
@li the concrete completion handler type to be called at the end of the
|
||||
asynchronous operation;
|
||||
|
||||
@li the initiating function return type; and
|
||||
|
||||
@li how the return value of the initiating function is obtained.
|
||||
|
||||
The trait allows the handler and return types to be determined at the point
|
||||
where the specific completion handler signature is known.
|
||||
|
||||
This template takes advantage of specializations of both
|
||||
`boost::asio_async_result` and `boost::asio::handler_type` for user-defined
|
||||
completion token types. The primary template assumes that the
|
||||
@b CompletionToken is the completion handler.
|
||||
|
||||
@see @ref BEAST_INITFN_RESULT_TYPE, @ref BEAST_HANDLER_TYPE
|
||||
*/
|
||||
template<class CompletionToken, class Signature>
|
||||
class async_result
|
||||
{
|
||||
static_assert(! std::is_reference<
|
||||
CompletionToken>::value, "");
|
||||
|
||||
boost::asio::async_result<typename
|
||||
boost::asio::handler_type<CompletionToken,
|
||||
Signature>::type> impl_;
|
||||
|
||||
async_result(async_result const&) = delete;
|
||||
async_result& operator=(async_result const&) = delete;
|
||||
|
||||
public:
|
||||
/// The concrete completion handler type for the specific signature.
|
||||
using completion_handler_type =
|
||||
typename boost::asio::handler_type<
|
||||
CompletionToken, Signature>::type;
|
||||
|
||||
/// The return type of the initiating function.
|
||||
using return_type =
|
||||
typename boost::asio::async_result<
|
||||
completion_handler_type>::type;
|
||||
|
||||
/** Construct an async result from a given handler.
|
||||
|
||||
When using a specalised async_result, the constructor has
|
||||
an opportunity to initialise some state associated with the
|
||||
completion handler, which is then returned from the initiating
|
||||
function.
|
||||
*/
|
||||
explicit
|
||||
async_result(completion_handler_type& h)
|
||||
: impl_(h)
|
||||
{
|
||||
}
|
||||
|
||||
/// Obtain the value to be returned from the initiating function.
|
||||
return_type
|
||||
get()
|
||||
{
|
||||
return impl_.get();
|
||||
}
|
||||
};
|
||||
|
||||
/** Helper for customizing the return type of asynchronous initiation functions.
|
||||
|
||||
This class template is used to transform caller-provided completion
|
||||
handlers in calls to asynchronous initiation functions. The transformation
|
||||
allows customization of the return type of the initiating function, and the
|
||||
function signature of the final handler.
|
||||
|
||||
@tparam CompletionToken A completion handler, or a user defined type
|
||||
with specializations for customizing the return type (for example,
|
||||
`boost::asio::use_future` or `boost::asio::yield_context`).
|
||||
|
||||
@tparam Signature The callable signature of the final completion handler.
|
||||
|
||||
Example:
|
||||
@code
|
||||
...
|
||||
template<class CompletionToken>
|
||||
typename async_completion<CompletionToken, void(error_code)>::result_type
|
||||
async_initfn(..., CompletionToken&& handler)
|
||||
{
|
||||
async_completion<CompletionToken, void(error_code)> completion{handler};
|
||||
...
|
||||
return completion.result.get();
|
||||
}
|
||||
@endcode
|
||||
|
||||
@tparam CompletionToken Specifies the model used to obtain the result of
|
||||
the asynchronous operation.
|
||||
|
||||
@tparam Signature The call signature for the completion handler type invoked
|
||||
on completion of the asynchronous operation.
|
||||
|
||||
@note See <a href="http://cplusplus.github.io/networking-ts/draft.pdf">
|
||||
Working Draft, C++ Extensions for Networking</a>
|
||||
*/
|
||||
template<class CompletionToken, class Signature>
|
||||
struct async_completion
|
||||
{
|
||||
/** The type of the final handler called by the asynchronous initiation function.
|
||||
|
||||
Objects of this type will be callable with the specified signature.
|
||||
*/
|
||||
using completion_handler_type = typename async_result<
|
||||
typename std::decay<CompletionToken>::type,
|
||||
Signature>::completion_handler_type;
|
||||
|
||||
/** Constructor
|
||||
|
||||
The constructor creates the concrete completion handler and
|
||||
makes the link between the handler and the asynchronous
|
||||
result.
|
||||
|
||||
@param token The completion token. If this is a regular completion
|
||||
handler, copies may be made as needed. If the handler is movable,
|
||||
it may also be moved.
|
||||
*/
|
||||
explicit
|
||||
async_completion(CompletionToken& token)
|
||||
: completion_handler(static_cast<typename std::conditional<
|
||||
std::is_same<CompletionToken, completion_handler_type>::value,
|
||||
completion_handler_type&, CompletionToken&&>::type>(token))
|
||||
, result(completion_handler)
|
||||
{
|
||||
// CompletionToken is not invokable with the given signature
|
||||
static_assert(is_CompletionHandler<
|
||||
completion_handler_type, Signature>::value,
|
||||
"CompletionToken requirements not met (Signature mismatch)");
|
||||
}
|
||||
|
||||
/// The final completion handler, callable with the specified signature.
|
||||
typename std::conditional<std::is_same<
|
||||
CompletionToken, completion_handler_type>::value,
|
||||
completion_handler_type&,
|
||||
completion_handler_type
|
||||
>::type completion_handler;
|
||||
|
||||
/// The return value of the asynchronous initiation function.
|
||||
async_result<typename std::decay<
|
||||
CompletionToken>::type, Signature> result;
|
||||
};
|
||||
|
||||
/// @file
|
||||
|
||||
/** @def BEAST_INITFN_RESULT_TYPE(ct, sig)
|
||||
|
||||
A macro to customize the return value of asynchronous initiation functions.
|
||||
*/
|
||||
#define BEAST_INITFN_RESULT_TYPE(ct, sig) \
|
||||
typename async_result< \
|
||||
typename std::decay<ct>::type, sig>::return_type
|
||||
|
||||
/** @def BEAST_HANDLER_TYPE(ct, sig)
|
||||
|
||||
A helper macro to convert a completion token to a completion handler type.
|
||||
*/
|
||||
#define BEAST_HANDLER_TYPE(ct, sig) \
|
||||
typename async_result< \
|
||||
typename std::decay<ct>::type, sig>::completion_handler_type
|
||||
|
||||
} // beast
|
||||
|
||||
#endif
|
@@ -15,44 +15,37 @@
|
||||
|
||||
namespace beast {
|
||||
|
||||
/// Determine if `T` meets the requirements of @b `BufferSequence`.
|
||||
template<class T, class BufferType>
|
||||
/// Determine if `T` meets the requirements of @b ConstBufferSequence.
|
||||
template<class T>
|
||||
#if BEAST_DOXYGEN
|
||||
struct is_BufferSequence : std::integral_constant<bool, ...>
|
||||
struct is_const_buffer_sequence : std::integral_constant<bool, ...>
|
||||
#else
|
||||
struct is_BufferSequence : detail::is_BufferSequence<T, BufferType>::type
|
||||
struct is_const_buffer_sequence :
|
||||
detail::is_buffer_sequence<T,
|
||||
boost::asio::const_buffer>::type
|
||||
#endif
|
||||
{
|
||||
};
|
||||
|
||||
/// Determine if `T` meets the requirements of @b `ConstBufferSequence`.
|
||||
/// Determine if `T` meets the requirements of @b DynamicBuffer.
|
||||
template<class T>
|
||||
#if BEAST_DOXYGEN
|
||||
struct is_ConstBufferSequence : std::integral_constant<bool, ...>
|
||||
struct is_dynamic_buffer : std::integral_constant<bool, ...>
|
||||
#else
|
||||
struct is_ConstBufferSequence :
|
||||
is_BufferSequence<T, boost::asio::const_buffer>
|
||||
struct is_dynamic_buffer :
|
||||
detail::is_dynamic_buffer<T>::type
|
||||
#endif
|
||||
{
|
||||
};
|
||||
|
||||
/// Determine if `T` meets the requirements of @b `DynamicBuffer`.
|
||||
/// Determine if `T` meets the requirements of @b MutableBufferSequence.
|
||||
template<class T>
|
||||
#if BEAST_DOXYGEN
|
||||
struct is_DynamicBuffer : std::integral_constant<bool, ...>
|
||||
struct is_mutable_buffer_sequence : std::integral_constant<bool, ...>
|
||||
#else
|
||||
struct is_DynamicBuffer : detail::is_DynamicBuffer<T>::type
|
||||
#endif
|
||||
{
|
||||
};
|
||||
|
||||
/// Determine if `T` meets the requirements of @b `MutableBufferSequence`.
|
||||
template<class T>
|
||||
#if BEAST_DOXYGEN
|
||||
struct is_MutableBufferSequence : std::integral_constant<bool, ...>
|
||||
#else
|
||||
struct is_MutableBufferSequence :
|
||||
is_BufferSequence<T, boost::asio::mutable_buffer>
|
||||
struct is_mutable_buffer_sequence :
|
||||
detail::is_buffer_sequence<T,
|
||||
boost::asio::mutable_buffer>::type
|
||||
#endif
|
||||
{
|
||||
};
|
||||
|
@@ -9,7 +9,7 @@
|
||||
#define BEAST_BUFFERED_READ_STREAM_HPP
|
||||
|
||||
#include <beast/config.hpp>
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/buffer_concepts.hpp>
|
||||
#include <beast/core/error.hpp>
|
||||
#include <beast/core/stream_concepts.hpp>
|
||||
@@ -90,7 +90,7 @@ namespace beast {
|
||||
template<class Stream, class DynamicBuffer>
|
||||
class buffered_read_stream
|
||||
{
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
|
||||
template<class Buffers, class Handler>
|
||||
@@ -272,11 +272,7 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class MutableBufferSequence, class ReadHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<ReadHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(ReadHandler, void(error_code))
|
||||
async_read_some(MutableBufferSequence const& buffers,
|
||||
ReadHandler&& handler);
|
||||
|
||||
@@ -347,11 +343,7 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class ConstBufferSequence, class WriteHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<WriteHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(WriteHandler, void(error_code))
|
||||
async_write_some(ConstBufferSequence const& buffers,
|
||||
WriteHandler&& handler);
|
||||
};
|
||||
|
@@ -32,7 +32,7 @@ namespace beast {
|
||||
template<class MutableBufferSequence>
|
||||
class buffers_adapter
|
||||
{
|
||||
static_assert(is_MutableBufferSequence<MutableBufferSequence>::value,
|
||||
static_assert(is_mutable_buffer_sequence<MutableBufferSequence>::value,
|
||||
"MutableBufferSequence requirements not met");
|
||||
|
||||
using iter_type = typename MutableBufferSequence::const_iterator;
|
||||
|
@@ -9,7 +9,6 @@
|
||||
#define BEAST_CONSUMING_BUFFERS_HPP
|
||||
|
||||
#include <beast/config.hpp>
|
||||
#include <beast/core/buffer_concepts.hpp>
|
||||
#include <boost/asio/buffer.hpp>
|
||||
#include <cstdint>
|
||||
#include <iterator>
|
||||
|
@@ -33,7 +33,7 @@ using MutableBufferSequence =
|
||||
BufferSequence<boost::asio::mutable_buffer>;
|
||||
|
||||
template<class T, class BufferType>
|
||||
class is_BufferSequence
|
||||
class is_buffer_sequence
|
||||
{
|
||||
template<class U, class R = std::is_convertible<
|
||||
typename U::value_type, BufferType> >
|
||||
@@ -88,19 +88,19 @@ public:
|
||||
template<class B1, class... Bn>
|
||||
struct is_all_ConstBufferSequence
|
||||
: std::integral_constant<bool,
|
||||
is_BufferSequence<B1, boost::asio::const_buffer>::type::value &&
|
||||
is_buffer_sequence<B1, boost::asio::const_buffer>::type::value &&
|
||||
is_all_ConstBufferSequence<Bn...>::value>
|
||||
{
|
||||
};
|
||||
|
||||
template<class B1>
|
||||
struct is_all_ConstBufferSequence<B1>
|
||||
: is_BufferSequence<B1, boost::asio::const_buffer>::type
|
||||
: is_buffer_sequence<B1, boost::asio::const_buffer>::type
|
||||
{
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class is_DynamicBuffer
|
||||
class is_dynamic_buffer
|
||||
{
|
||||
// size()
|
||||
template<class U, class R = std::is_convertible<decltype(
|
||||
@@ -128,7 +128,7 @@ class is_DynamicBuffer
|
||||
|
||||
// data()
|
||||
template<class U, class R = std::integral_constant<
|
||||
bool, is_BufferSequence<decltype(
|
||||
bool, is_buffer_sequence<decltype(
|
||||
std::declval<U const>().data()),
|
||||
boost::asio::const_buffer>::type::value>>
|
||||
static R check4(int);
|
||||
@@ -138,7 +138,7 @@ class is_DynamicBuffer
|
||||
|
||||
// prepare()
|
||||
template<class U, class R = std::integral_constant<
|
||||
bool, is_BufferSequence<decltype(
|
||||
bool, is_buffer_sequence<decltype(
|
||||
std::declval<U>().prepare(1)),
|
||||
boost::asio::mutable_buffer>::type::value>>
|
||||
static R check5(int);
|
||||
|
@@ -51,7 +51,7 @@ sync_ostream::
|
||||
write_some(ConstBufferSequence const& buffers)
|
||||
{
|
||||
static_assert(
|
||||
is_ConstBufferSequence<ConstBufferSequence>::value,
|
||||
is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
error_code ec;
|
||||
auto const n = write_some(buffers, ec);
|
||||
@@ -67,7 +67,7 @@ write_some(ConstBufferSequence const& buffers,
|
||||
error_code& ec)
|
||||
{
|
||||
static_assert(
|
||||
is_ConstBufferSequence<ConstBufferSequence>::value,
|
||||
is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
std::size_t n = 0;
|
||||
using boost::asio::buffer_cast;
|
||||
|
@@ -162,12 +162,11 @@ auto
|
||||
buffered_read_stream<Stream, DynamicBuffer>::
|
||||
async_write_some(ConstBufferSequence const& buffers,
|
||||
WriteHandler&& handler) ->
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(WriteHandler, void(error_code))
|
||||
{
|
||||
static_assert(is_AsyncWriteStream<next_layer_type>::value,
|
||||
"AsyncWriteStream requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
static_assert(is_CompletionHandler<WriteHandler,
|
||||
@@ -186,7 +185,7 @@ read_some(
|
||||
{
|
||||
static_assert(is_SyncReadStream<next_layer_type>::value,
|
||||
"SyncReadStream requirements not met");
|
||||
static_assert(is_MutableBufferSequence<
|
||||
static_assert(is_mutable_buffer_sequence<
|
||||
MutableBufferSequence>::value,
|
||||
"MutableBufferSequence requirements not met");
|
||||
error_code ec;
|
||||
@@ -205,7 +204,7 @@ read_some(MutableBufferSequence const& buffers,
|
||||
{
|
||||
static_assert(is_SyncReadStream<next_layer_type>::value,
|
||||
"SyncReadStream requirements not met");
|
||||
static_assert(is_MutableBufferSequence<
|
||||
static_assert(is_mutable_buffer_sequence<
|
||||
MutableBufferSequence>::value,
|
||||
"MutableBufferSequence requirements not met");
|
||||
using boost::asio::buffer_size;
|
||||
@@ -229,24 +228,21 @@ template<class Stream, class DynamicBuffer>
|
||||
template<class MutableBufferSequence, class ReadHandler>
|
||||
auto
|
||||
buffered_read_stream<Stream, DynamicBuffer>::
|
||||
async_read_some(
|
||||
MutableBufferSequence const& buffers,
|
||||
async_read_some(MutableBufferSequence const& buffers,
|
||||
ReadHandler&& handler) ->
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(ReadHandler, void(error_code))
|
||||
{
|
||||
static_assert(is_AsyncReadStream<next_layer_type>::value,
|
||||
"Stream requirements not met");
|
||||
static_assert(is_MutableBufferSequence<
|
||||
static_assert(is_mutable_buffer_sequence<
|
||||
MutableBufferSequence>::value,
|
||||
"MutableBufferSequence requirements not met");
|
||||
beast::async_completion<
|
||||
ReadHandler, void(error_code, std::size_t)
|
||||
> completion{handler};
|
||||
read_some_op<MutableBufferSequence,
|
||||
decltype(completion.handler)>{
|
||||
completion.handler, *this, buffers};
|
||||
return completion.result.get();
|
||||
async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
read_some_op<MutableBufferSequence, BEAST_HANDLER_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))>{
|
||||
init.completion_handler, *this, buffers};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
} // beast
|
||||
|
@@ -9,7 +9,6 @@
|
||||
#define BEAST_IMPL_CONSUMING_BUFFERS_IPP
|
||||
|
||||
#include <beast/core/buffer_concepts.hpp>
|
||||
#include <boost/asio/buffer.hpp>
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
#include <iterator>
|
||||
@@ -163,7 +162,8 @@ consuming_buffers(BufferSequence const& bs)
|
||||
, begin_(bs_.begin())
|
||||
{
|
||||
static_assert(
|
||||
is_BufferSequence<BufferSequence, value_type>::value,
|
||||
is_const_buffer_sequence<BufferSequence>::value||
|
||||
is_mutable_buffer_sequence<BufferSequence>::value,
|
||||
"BufferSequence requirements not met");
|
||||
}
|
||||
|
||||
|
@@ -44,7 +44,7 @@ detail::buffers_helper<ConstBufferSequence>
|
||||
#endif
|
||||
buffers(ConstBufferSequence const& b)
|
||||
{
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence not met");
|
||||
return detail::buffers_helper<
|
||||
@@ -86,7 +86,7 @@ detail::ostream_helper<
|
||||
#endif
|
||||
ostream(DynamicBuffer& buffer)
|
||||
{
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
return detail::ostream_helper<
|
||||
DynamicBuffer, char, std::char_traits<char>,
|
||||
|
@@ -159,7 +159,7 @@ struct is_Reader<T, M, beast::detail::void_t<decltype(
|
||||
std::declval<std::size_t>()),
|
||||
std::declval<T>().finish()
|
||||
)> > : std::integral_constant<bool,
|
||||
is_MutableBufferSequence<
|
||||
is_mutable_buffer_sequence<
|
||||
typename T::mutable_buffers_type>::value &&
|
||||
std::is_convertible<decltype(
|
||||
std::declval<T>().prepare(
|
||||
|
@@ -572,34 +572,34 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Derived,
|
||||
class ReadHandler>
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code, std::size_t)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))
|
||||
async_read_some(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& dynabuf,
|
||||
basic_parser<isRequest, true, Derived>& parser,
|
||||
ReadHandler&& handler)
|
||||
{
|
||||
beast::async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> completion{handler};
|
||||
async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
switch(parser.state())
|
||||
{
|
||||
case parse_state::header:
|
||||
case parse_state::chunk_header:
|
||||
detail::read_some_buffer_op<AsyncReadStream,
|
||||
DynamicBuffer, isRequest, true, Derived,
|
||||
decltype(completion.handler)>{
|
||||
completion.handler, stream, dynabuf, parser};
|
||||
DynamicBuffer, isRequest, true, Derived, BEAST_HANDLER_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))>{
|
||||
init.completion_handler, stream, dynabuf, parser};
|
||||
break;
|
||||
|
||||
default:
|
||||
detail::read_some_body_op<AsyncReadStream,
|
||||
DynamicBuffer, isRequest, Derived,
|
||||
decltype(completion.handler)>{
|
||||
completion.handler, stream, dynabuf, parser};
|
||||
DynamicBuffer, isRequest, Derived, BEAST_HANDLER_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))>{
|
||||
init.completion_handler, stream, dynabuf, parser};
|
||||
break;
|
||||
}
|
||||
return completion.result.get();
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<
|
||||
@@ -608,21 +608,21 @@ template<
|
||||
bool isRequest, class Derived,
|
||||
class ReadHandler>
|
||||
inline
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code, std::size_t)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))
|
||||
async_read_some(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& dynabuf,
|
||||
basic_parser<isRequest, false, Derived>& parser,
|
||||
ReadHandler&& handler)
|
||||
{
|
||||
beast::async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> completion{handler};
|
||||
async_completion<ReadHandler,
|
||||
void(error_code, std::size_t)> init{handler};
|
||||
detail::read_some_buffer_op<AsyncReadStream,
|
||||
DynamicBuffer, isRequest, false, Derived,
|
||||
decltype(completion.handler)>{
|
||||
completion.handler, stream, dynabuf, parser};
|
||||
return completion.result.get();
|
||||
DynamicBuffer, isRequest, false, Derived, BEAST_HANDLER_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))>{
|
||||
init.completion_handler, stream, dynabuf, parser};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
} // detail
|
||||
@@ -634,8 +634,8 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, bool isDirect, class Derived,
|
||||
class ReadHandler>
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code, std::size_t)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))
|
||||
async_read_some(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& dynabuf,
|
||||
@@ -644,7 +644,7 @@ async_read_some(
|
||||
{
|
||||
static_assert(is_AsyncReadStream<AsyncReadStream>::value,
|
||||
"AsyncReadStream requirements not met");
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
BOOST_ASSERT(! parser.is_complete());
|
||||
return detail::async_read_some(stream, dynabuf, parser,
|
||||
@@ -656,8 +656,8 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, bool isDirect, class Derived,
|
||||
class ReadHandler>
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code))
|
||||
async_read(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& dynabuf,
|
||||
@@ -666,15 +666,16 @@ async_read(
|
||||
{
|
||||
static_assert(is_AsyncReadStream<AsyncReadStream>::value,
|
||||
"AsyncReadStream requirements not met");
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
BOOST_ASSERT(! parser.is_complete());
|
||||
beast::async_completion<ReadHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<ReadHandler,
|
||||
void(error_code)> init{handler};
|
||||
detail::parse_op<AsyncReadStream, DynamicBuffer,
|
||||
isRequest, isDirect, Derived, decltype(completion.handler)>{
|
||||
completion.handler, stream, dynabuf, parser};
|
||||
return completion.result.get();
|
||||
isRequest, isDirect, Derived, BEAST_HANDLER_TYPE(
|
||||
ReadHandler, void(error_code))>{
|
||||
init.completion_handler, stream, dynabuf, parser};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<
|
||||
@@ -682,8 +683,8 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Body, class Fields,
|
||||
class ReadHandler>
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code))
|
||||
async_read(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& dynabuf,
|
||||
@@ -692,7 +693,7 @@ async_read(
|
||||
{
|
||||
static_assert(is_AsyncReadStream<AsyncReadStream>::value,
|
||||
"AsyncReadStream requirements not met");
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
static_assert(is_Body<Body>::value,
|
||||
"Body requirements not met");
|
||||
@@ -701,13 +702,13 @@ async_read(
|
||||
static_assert(is_Reader<typename Body::reader,
|
||||
message<isRequest, Body, Fields>>::value,
|
||||
"Reader requirements not met");
|
||||
beast::async_completion<ReadHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<ReadHandler,
|
||||
void(error_code)> init{handler};
|
||||
detail::read_message_op<AsyncReadStream, DynamicBuffer,
|
||||
isRequest, Body, Fields, decltype(
|
||||
completion.handler)>{completion.handler,
|
||||
stream, dynabuf, msg};
|
||||
return completion.result.get();
|
||||
isRequest, Body, Fields, BEAST_HANDLER_TYPE(
|
||||
ReadHandler, void(error_code))>{
|
||||
init.completion_handler, stream, dynabuf, msg};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
} // http
|
||||
|
@@ -71,7 +71,7 @@ basic_parser<isRequest, isDirect, Derived>::
|
||||
write(ConstBufferSequence const& buffers,
|
||||
error_code& ec)
|
||||
{
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
auto const buffer = maybe_flatten(buffers);
|
||||
|
@@ -192,7 +192,7 @@ read_some(
|
||||
{
|
||||
static_assert(is_SyncReadStream<SyncReadStream>::value,
|
||||
"SyncReadStream requirements not met");
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
BOOST_ASSERT(! parser.is_complete());
|
||||
error_code ec;
|
||||
@@ -216,7 +216,7 @@ read_some(
|
||||
{
|
||||
static_assert(is_SyncReadStream<SyncReadStream>::value,
|
||||
"SyncReadStream requirements not met");
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
BOOST_ASSERT(! parser.is_complete());
|
||||
return detail::read_some(stream, dynabuf, parser, ec);
|
||||
@@ -234,7 +234,7 @@ read(
|
||||
{
|
||||
static_assert(is_SyncReadStream<SyncReadStream>::value,
|
||||
"SyncReadStream requirements not met");
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
BOOST_ASSERT(! parser.is_complete());
|
||||
error_code ec;
|
||||
@@ -256,7 +256,7 @@ read(
|
||||
{
|
||||
static_assert(is_SyncReadStream<SyncReadStream>::value,
|
||||
"SyncReadStream requirements not met");
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
BOOST_ASSERT(! parser.is_complete());
|
||||
do
|
||||
@@ -282,7 +282,7 @@ read(
|
||||
{
|
||||
static_assert(is_SyncReadStream<SyncReadStream>::value,
|
||||
"SyncReadStream requirements not met");
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
static_assert(is_Body<Body>::value,
|
||||
"Body requirements not met");
|
||||
@@ -310,7 +310,7 @@ read(
|
||||
{
|
||||
static_assert(is_SyncReadStream<SyncReadStream>::value,
|
||||
"SyncReadStream requirements not met");
|
||||
static_assert(is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
static_assert(is_Body<Body>::value,
|
||||
"Body requirements not met");
|
||||
|
@@ -213,16 +213,16 @@ write(SyncWriteStream& stream,
|
||||
template<class AsyncWriteStream,
|
||||
bool isRequest, class Fields,
|
||||
class WriteHandler>
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
async_write(AsyncWriteStream& stream,
|
||||
header<isRequest, Fields> const& msg,
|
||||
WriteHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncWriteStream<AsyncWriteStream>::value,
|
||||
"AsyncWriteStream requirements not met");
|
||||
beast::async_completion<WriteHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<WriteHandler,
|
||||
void(error_code)> init{handler};
|
||||
multi_buffer b;
|
||||
{
|
||||
auto os = ostream(b);
|
||||
@@ -231,9 +231,9 @@ async_write(AsyncWriteStream& stream,
|
||||
os << "\r\n";
|
||||
}
|
||||
detail::write_streambuf_op<AsyncWriteStream,
|
||||
decltype(completion.handler)>{
|
||||
completion.handler, stream, std::move(b)};
|
||||
return completion.result.get();
|
||||
BEAST_HANDLER_TYPE(WriteHandler, void(error_code))>{
|
||||
init.completion_handler, stream, std::move(b)};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -641,8 +641,8 @@ write(SyncWriteStream& stream,
|
||||
template<class AsyncWriteStream,
|
||||
bool isRequest, class Body, class Fields,
|
||||
class WriteHandler>
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
async_write(AsyncWriteStream& stream,
|
||||
message<isRequest, Body, Fields> const& msg,
|
||||
WriteHandler&& handler)
|
||||
@@ -656,11 +656,12 @@ async_write(AsyncWriteStream& stream,
|
||||
static_assert(is_Writer<typename Body::writer,
|
||||
message<isRequest, Body, Fields>>::value,
|
||||
"Writer requirements not met");
|
||||
beast::async_completion<WriteHandler,
|
||||
void(error_code)> completion{handler};
|
||||
detail::write_op<AsyncWriteStream, decltype(completion.handler),
|
||||
isRequest, Body, Fields>{completion.handler, stream, msg};
|
||||
return completion.result.get();
|
||||
async_completion<WriteHandler,
|
||||
void(error_code)> init{handler};
|
||||
detail::write_op<AsyncWriteStream, BEAST_HANDLER_TYPE(
|
||||
WriteHandler, void(error_code)), isRequest,
|
||||
Body, Fields>{init.completion_handler, stream, msg};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
@@ -9,7 +9,7 @@
|
||||
#define BEAST_HTTP_READ_HPP
|
||||
|
||||
#include <beast/config.hpp>
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/error.hpp>
|
||||
#include <beast/http/basic_parser.hpp>
|
||||
#include <beast/http/message.hpp>
|
||||
@@ -179,12 +179,8 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, bool isDirect, class Derived,
|
||||
class ReadHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code, std::size_t)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code, std::size_t))
|
||||
async_read_some(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& dynabuf,
|
||||
@@ -318,12 +314,8 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, bool isDirect, class Derived,
|
||||
class ReadHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code))
|
||||
async_read(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& dynabuf,
|
||||
@@ -462,12 +454,8 @@ template<
|
||||
class DynamicBuffer,
|
||||
bool isRequest, class Body, class Fields,
|
||||
class ReadHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code))
|
||||
async_read(
|
||||
AsyncReadStream& stream,
|
||||
DynamicBuffer& dynabuf,
|
||||
|
@@ -11,7 +11,7 @@
|
||||
#include <beast/config.hpp>
|
||||
#include <beast/http/message.hpp>
|
||||
#include <beast/core/error.hpp>
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <ostream>
|
||||
#include <type_traits>
|
||||
|
||||
@@ -121,12 +121,8 @@ write(SyncWriteStream& stream,
|
||||
template<class AsyncWriteStream,
|
||||
bool isRequest, class Fields,
|
||||
class WriteHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
async_write(AsyncWriteStream& stream,
|
||||
header<isRequest, Fields> const& msg,
|
||||
WriteHandler&& handler);
|
||||
@@ -240,12 +236,8 @@ write(SyncWriteStream& stream,
|
||||
template<class AsyncWriteStream,
|
||||
bool isRequest, class Body, class Fields,
|
||||
class WriteHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
async_write(AsyncWriteStream& stream,
|
||||
message<isRequest, Body, Fields> const& msg,
|
||||
WriteHandler&& handler);
|
||||
|
@@ -125,7 +125,7 @@ template<class ConstBufferSequence>
|
||||
bool
|
||||
utf8_checker_t<_>::write(ConstBufferSequence const& bs)
|
||||
{
|
||||
static_assert(is_ConstBufferSequence<ConstBufferSequence>::value,
|
||||
static_assert(is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
using boost::asio::buffer_cast;
|
||||
using boost::asio::buffer_size;
|
||||
|
@@ -360,7 +360,7 @@ accept(ConstBufferSequence const& buffers)
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
error_code ec;
|
||||
@@ -379,7 +379,7 @@ accept_ex(ConstBufferSequence const& buffers,
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
static_assert(detail::is_ResponseDecorator<
|
||||
@@ -399,7 +399,7 @@ accept(ConstBufferSequence const& buffers, error_code& ec)
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
reset();
|
||||
@@ -421,10 +421,10 @@ accept_ex(ConstBufferSequence const& buffers,
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
reset();
|
||||
@@ -506,7 +506,7 @@ accept(http::header<true, Fields> const& req,
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
error_code ec;
|
||||
@@ -526,7 +526,7 @@ accept_ex(http::header<true, Fields> const& req,
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
static_assert(detail::is_ResponseDecorator<
|
||||
@@ -547,7 +547,7 @@ accept(http::header<true, Fields> const& req,
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
reset();
|
||||
@@ -571,7 +571,7 @@ accept_ex(http::header<true, Fields> const& req,
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
static_assert(detail::is_ResponseDecorator<
|
||||
@@ -590,26 +590,26 @@ accept_ex(http::header<true, Fields> const& req,
|
||||
|
||||
template<class NextLayer>
|
||||
template<class AcceptHandler>
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_accept(AcceptHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
beast::async_completion<AcceptHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<AcceptHandler,
|
||||
void(error_code)> init{handler};
|
||||
reset();
|
||||
accept_op<decltype(&default_decorate_res),
|
||||
decltype(completion.handler)>{completion.handler,
|
||||
*this, &default_decorate_res};
|
||||
return completion.result.get();
|
||||
BEAST_HANDLER_TYPE(AcceptHandler, void(error_code))>{
|
||||
init.completion_handler, *this, &default_decorate_res};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class ResponseDecorator, class AcceptHandler>
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_accept_ex(ResponseDecorator const& decorator,
|
||||
AcceptHandler&& handler)
|
||||
@@ -619,41 +619,42 @@ async_accept_ex(ResponseDecorator const& decorator,
|
||||
static_assert(detail::is_ResponseDecorator<
|
||||
ResponseDecorator>::value,
|
||||
"ResponseDecorator requirements not met");
|
||||
beast::async_completion<AcceptHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<AcceptHandler,
|
||||
void(error_code)> init{handler};
|
||||
reset();
|
||||
accept_op<ResponseDecorator, decltype(completion.handler)>{
|
||||
completion.handler, *this, decorator};
|
||||
return completion.result.get();
|
||||
accept_op<ResponseDecorator, BEAST_HANDLER_TYPE(
|
||||
AcceptHandler, void(error_code))>{
|
||||
init.completion_handler, *this, decorator};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class ConstBufferSequence, class AcceptHandler>
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_accept(ConstBufferSequence const& buffers,
|
||||
AcceptHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
beast::async_completion<AcceptHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<AcceptHandler,
|
||||
void(error_code)> init{handler};
|
||||
reset();
|
||||
accept_op<decltype(&default_decorate_res),
|
||||
decltype(completion.handler)>{completion.handler,
|
||||
*this, buffers, &default_decorate_res};
|
||||
return completion.result.get();
|
||||
BEAST_HANDLER_TYPE(AcceptHandler, void(error_code))>{
|
||||
init.completion_handler, *this, buffers, &default_decorate_res};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class ConstBufferSequence,
|
||||
class ResponseDecorator, class AcceptHandler>
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_accept_ex(ConstBufferSequence const& buffers,
|
||||
ResponseDecorator const& decorator,
|
||||
@@ -661,45 +662,47 @@ async_accept_ex(ConstBufferSequence const& buffers,
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
static_assert(detail::is_ResponseDecorator<
|
||||
ResponseDecorator>::value,
|
||||
"ResponseDecorator requirements not met");
|
||||
beast::async_completion<AcceptHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<AcceptHandler,
|
||||
void(error_code)> init{handler};
|
||||
reset();
|
||||
accept_op<ResponseDecorator, decltype(completion.handler)>{
|
||||
completion.handler, *this, buffers, decorator};
|
||||
return completion.result.get();
|
||||
accept_op<ResponseDecorator, BEAST_HANDLER_TYPE(
|
||||
AcceptHandler, void(error_code))>{
|
||||
init.completion_handler, *this, buffers, decorator};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class Fields, class AcceptHandler>
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_accept(http::header<true, Fields> const& req,
|
||||
AcceptHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
beast::async_completion<AcceptHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<AcceptHandler,
|
||||
void(error_code)> init{handler};
|
||||
reset();
|
||||
response_op<decltype(completion.handler)>{
|
||||
completion.handler, *this, req,
|
||||
&default_decorate_res, beast_asio_helpers::
|
||||
is_continuation(completion.handler)};
|
||||
return completion.result.get();
|
||||
response_op<BEAST_HANDLER_TYPE(
|
||||
AcceptHandler, void(error_code))>{init.completion_handler,
|
||||
*this, req, &default_decorate_res,
|
||||
beast_asio_helpers::is_continuation(
|
||||
init.completion_handler)};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class Fields,
|
||||
class ResponseDecorator, class AcceptHandler>
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_accept_ex(http::header<true, Fields> const& req,
|
||||
ResponseDecorator const& decorator, AcceptHandler&& handler)
|
||||
@@ -709,21 +712,22 @@ async_accept_ex(http::header<true, Fields> const& req,
|
||||
static_assert(detail::is_ResponseDecorator<
|
||||
ResponseDecorator>::value,
|
||||
"ResponseDecorator requirements not met");
|
||||
beast::async_completion<AcceptHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<AcceptHandler,
|
||||
void(error_code)> init{handler};
|
||||
reset();
|
||||
response_op<decltype(completion.handler)>{
|
||||
completion.handler, *this, req, decorator,
|
||||
response_op<BEAST_HANDLER_TYPE(
|
||||
AcceptHandler, void(error_code))>{
|
||||
init.completion_handler, *this, req, decorator,
|
||||
beast_asio_helpers::is_continuation(
|
||||
completion.handler)};
|
||||
return completion.result.get();
|
||||
init.completion_handler)};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class Fields,
|
||||
class ConstBufferSequence, class AcceptHandler>
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_accept(http::header<true, Fields> const& req,
|
||||
ConstBufferSequence const& buffers,
|
||||
@@ -731,24 +735,25 @@ async_accept(http::header<true, Fields> const& req,
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
beast::async_completion<AcceptHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<AcceptHandler,
|
||||
void(error_code)> init{handler};
|
||||
reset();
|
||||
response_op<decltype(completion.handler)>{
|
||||
completion.handler, *this, req, buffers,
|
||||
response_op<BEAST_HANDLER_TYPE(
|
||||
AcceptHandler, void(error_code))>{
|
||||
init.completion_handler, *this, req, buffers,
|
||||
&default_decorate_res, beast_asio_helpers::
|
||||
is_continuation(completion.handler)};
|
||||
return completion.result.get();
|
||||
is_continuation(init.completion_handler)};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class Fields, class ConstBufferSequence,
|
||||
class ResponseDecorator, class AcceptHandler>
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_accept_ex(http::header<true, Fields> const& req,
|
||||
ConstBufferSequence const& buffers,
|
||||
@@ -757,20 +762,21 @@ async_accept_ex(http::header<true, Fields> const& req,
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
static_assert(is_ConstBufferSequence<
|
||||
static_assert(is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
static_assert(detail::is_ResponseDecorator<
|
||||
ResponseDecorator>::value,
|
||||
"ResponseDecorator requirements not met");
|
||||
beast::async_completion<AcceptHandler,
|
||||
void(error_code)> completion{handler};
|
||||
async_completion<AcceptHandler,
|
||||
void(error_code)> init{handler};
|
||||
reset();
|
||||
response_op<decltype(completion.handler)>{
|
||||
completion.handler, *this, req, buffers, decorator,
|
||||
response_op<BEAST_HANDLER_TYPE(
|
||||
AcceptHandler, void(error_code))>{init.completion_handler,
|
||||
*this, req, buffers, decorator,
|
||||
beast_asio_helpers::is_continuation(
|
||||
completion.handler)};
|
||||
return completion.result.get();
|
||||
init.completion_handler)};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
} // websocket
|
||||
|
@@ -197,19 +197,19 @@ upcall:
|
||||
|
||||
template<class NextLayer>
|
||||
template<class CloseHandler>
|
||||
typename async_completion<
|
||||
CloseHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
CloseHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_close(close_reason const& cr, CloseHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements not met");
|
||||
beast::async_completion<
|
||||
CloseHandler, void(error_code)
|
||||
> completion{handler};
|
||||
close_op<decltype(completion.handler)>{
|
||||
completion.handler, *this, cr};
|
||||
return completion.result.get();
|
||||
async_completion<CloseHandler,
|
||||
void(error_code)> init{handler};
|
||||
close_op<BEAST_HANDLER_TYPE(
|
||||
CloseHandler, void(error_code))>{
|
||||
init.completion_handler, *this, cr};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
|
@@ -160,8 +160,8 @@ operator()(error_code ec, bool again)
|
||||
|
||||
template<class NextLayer>
|
||||
template<class HandshakeHandler>
|
||||
typename async_completion<HandshakeHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
HandshakeHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_handshake(string_view const& host,
|
||||
string_view const& target,
|
||||
@@ -169,18 +169,19 @@ async_handshake(string_view const& host,
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements not met");
|
||||
beast::async_completion<HandshakeHandler,
|
||||
void(error_code)> completion{handler};
|
||||
handshake_op<decltype(completion.handler)>{
|
||||
completion.handler, *this, nullptr,
|
||||
host, target, &default_decorate_req};
|
||||
return completion.result.get();
|
||||
async_completion<HandshakeHandler,
|
||||
void(error_code)> init{handler};
|
||||
handshake_op<BEAST_HANDLER_TYPE(
|
||||
HandshakeHandler, void(error_code))>{
|
||||
init.completion_handler, *this, nullptr, host,
|
||||
target, &default_decorate_req};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class HandshakeHandler>
|
||||
typename async_completion<HandshakeHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
HandshakeHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_handshake(response_type& res,
|
||||
string_view const& host,
|
||||
@@ -189,18 +190,19 @@ async_handshake(response_type& res,
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements not met");
|
||||
beast::async_completion<HandshakeHandler,
|
||||
void(error_code)> completion{handler};
|
||||
handshake_op<decltype(completion.handler)>{
|
||||
completion.handler, *this, &res,
|
||||
host, target, &default_decorate_req};
|
||||
return completion.result.get();
|
||||
async_completion<HandshakeHandler,
|
||||
void(error_code)> init{handler};
|
||||
handshake_op<BEAST_HANDLER_TYPE(
|
||||
HandshakeHandler, void(error_code))>{
|
||||
init.completion_handler, *this, &res, host,
|
||||
target, &default_decorate_req};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class RequestDecorator, class HandshakeHandler>
|
||||
typename async_completion<HandshakeHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
HandshakeHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_handshake_ex(string_view const& host,
|
||||
string_view const& target,
|
||||
@@ -212,18 +214,19 @@ async_handshake_ex(string_view const& host,
|
||||
static_assert(detail::is_RequestDecorator<
|
||||
RequestDecorator>::value,
|
||||
"RequestDecorator requirements not met");
|
||||
beast::async_completion<HandshakeHandler,
|
||||
void(error_code)> completion{handler};
|
||||
handshake_op<decltype(completion.handler)>{
|
||||
completion.handler, *this, nullptr,
|
||||
host, target, decorator};
|
||||
return completion.result.get();
|
||||
async_completion<HandshakeHandler,
|
||||
void(error_code)> init{handler};
|
||||
handshake_op<BEAST_HANDLER_TYPE(
|
||||
HandshakeHandler, void(error_code))>{
|
||||
init.completion_handler, *this, nullptr, host,
|
||||
target, decorator};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class RequestDecorator, class HandshakeHandler>
|
||||
typename async_completion<HandshakeHandler,
|
||||
void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
HandshakeHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_handshake_ex(response_type& res,
|
||||
string_view const& host,
|
||||
@@ -236,12 +239,13 @@ async_handshake_ex(response_type& res,
|
||||
static_assert(detail::is_RequestDecorator<
|
||||
RequestDecorator>::value,
|
||||
"RequestDecorator requirements not met");
|
||||
beast::async_completion<HandshakeHandler,
|
||||
void(error_code)> completion{handler};
|
||||
handshake_op<decltype(completion.handler)>{
|
||||
completion.handler, *this, &res,
|
||||
host, target, decorator};
|
||||
return completion.result.get();
|
||||
async_completion<HandshakeHandler,
|
||||
void(error_code)> init{handler};
|
||||
handshake_op<BEAST_HANDLER_TYPE(
|
||||
HandshakeHandler, void(error_code))>{
|
||||
init.completion_handler, *this, &res, host,
|
||||
target, decorator};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
|
@@ -195,38 +195,36 @@ upcall:
|
||||
|
||||
template<class NextLayer>
|
||||
template<class WriteHandler>
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_ping(ping_data const& payload, WriteHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
beast::async_completion<
|
||||
WriteHandler, void(error_code)
|
||||
> completion{handler};
|
||||
ping_op<decltype(completion.handler)>{
|
||||
completion.handler, *this,
|
||||
opcode::ping, payload};
|
||||
return completion.result.get();
|
||||
async_completion<WriteHandler,
|
||||
void(error_code)> init{handler};
|
||||
ping_op<BEAST_HANDLER_TYPE(
|
||||
WriteHandler, void(error_code))>{
|
||||
init.completion_handler, *this, opcode::ping, payload};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
template<class WriteHandler>
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_pong(ping_data const& payload, WriteHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
beast::async_completion<
|
||||
WriteHandler, void(error_code)
|
||||
> completion{handler};
|
||||
ping_op<decltype(completion.handler)>{
|
||||
completion.handler, *this,
|
||||
opcode::pong, payload};
|
||||
return completion.result.get();
|
||||
async_completion<WriteHandler,
|
||||
void(error_code)> init{handler};
|
||||
ping_op<BEAST_HANDLER_TYPE(
|
||||
WriteHandler, void(error_code))>{
|
||||
init.completion_handler, *this, opcode::pong, payload};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
|
@@ -686,21 +686,22 @@ upcall:
|
||||
|
||||
template<class NextLayer>
|
||||
template<class DynamicBuffer, class ReadHandler>
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_read_frame(frame_info& fi,
|
||||
DynamicBuffer& dynabuf, ReadHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
static_assert(beast::is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(beast::is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
beast::async_completion<
|
||||
ReadHandler, void(error_code)> completion{handler};
|
||||
read_frame_op<DynamicBuffer, decltype(completion.handler)>{
|
||||
completion.handler, *this, fi, dynabuf};
|
||||
return completion.result.get();
|
||||
async_completion<ReadHandler,
|
||||
void(error_code)> init{handler};
|
||||
read_frame_op<DynamicBuffer, BEAST_HANDLER_TYPE(
|
||||
ReadHandler, void(error_code))>{init.completion_handler,
|
||||
*this, fi, dynabuf};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
@@ -711,7 +712,7 @@ read_frame(frame_info& fi, DynamicBuffer& dynabuf)
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(beast::is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(beast::is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
error_code ec;
|
||||
read_frame(fi, dynabuf, ec);
|
||||
@@ -727,7 +728,7 @@ read_frame(frame_info& fi, DynamicBuffer& dynabuf, error_code& ec)
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(beast::is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(beast::is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
using beast::detail::clamp;
|
||||
using boost::asio::buffer;
|
||||
@@ -1097,22 +1098,22 @@ upcall:
|
||||
|
||||
template<class NextLayer>
|
||||
template<class DynamicBuffer, class ReadHandler>
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_read(opcode& op,
|
||||
DynamicBuffer& dynabuf, ReadHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements requirements not met");
|
||||
static_assert(beast::is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(beast::is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
beast::async_completion<
|
||||
ReadHandler, void(error_code)
|
||||
> completion{handler};
|
||||
read_op<DynamicBuffer, decltype(completion.handler)>{
|
||||
completion.handler, *this, op, dynabuf};
|
||||
return completion.result.get();
|
||||
async_completion<ReadHandler,
|
||||
void(error_code)> init{handler};
|
||||
read_op<DynamicBuffer, BEAST_HANDLER_TYPE(
|
||||
ReadHandler, void(error_code))>{init.completion_handler,
|
||||
*this, op, dynabuf};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
@@ -1123,7 +1124,7 @@ read(opcode& op, DynamicBuffer& dynabuf)
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(beast::is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(beast::is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
error_code ec;
|
||||
read(op, dynabuf, ec);
|
||||
@@ -1139,7 +1140,7 @@ read(opcode& op, DynamicBuffer& dynabuf, error_code& ec)
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(beast::is_DynamicBuffer<DynamicBuffer>::value,
|
||||
static_assert(beast::is_dynamic_buffer<DynamicBuffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
frame_info fi;
|
||||
for(;;)
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#ifndef BEAST_WEBSOCKET_IMPL_SSL_IPP_INCLUDED
|
||||
#define BEAST_WEBSOCKET_IMPL_SSL_IPP_INCLUDED
|
||||
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/handler_helpers.hpp>
|
||||
#include <beast/core/handler_concepts.hpp>
|
||||
#include <beast/core/handler_ptr.hpp>
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#ifndef BEAST_WEBSOCKET_IMPL_TEARDOWN_IPP
|
||||
#define BEAST_WEBSOCKET_IMPL_TEARDOWN_IPP
|
||||
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/handler_concepts.hpp>
|
||||
#include <beast/core/handler_helpers.hpp>
|
||||
#include <beast/core/handler_ptr.hpp>
|
||||
|
@@ -545,24 +545,23 @@ upcall:
|
||||
|
||||
template<class NextLayer>
|
||||
template<class ConstBufferSequence, class WriteHandler>
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_write_frame(bool fin,
|
||||
ConstBufferSequence const& bs, WriteHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements not met");
|
||||
static_assert(beast::is_ConstBufferSequence<
|
||||
static_assert(beast::is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
beast::async_completion<
|
||||
WriteHandler, void(error_code)
|
||||
> completion{handler};
|
||||
write_frame_op<ConstBufferSequence, decltype(
|
||||
completion.handler)>{completion.handler,
|
||||
async_completion<WriteHandler,
|
||||
void(error_code)> init{handler};
|
||||
write_frame_op<ConstBufferSequence, BEAST_HANDLER_TYPE(
|
||||
WriteHandler, void(error_code))>{init.completion_handler,
|
||||
*this, fin, bs};
|
||||
return completion.result.get();
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
@@ -573,7 +572,7 @@ write_frame(bool fin, ConstBufferSequence const& buffers)
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(beast::is_ConstBufferSequence<
|
||||
static_assert(beast::is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
error_code ec;
|
||||
@@ -591,7 +590,7 @@ write_frame(bool fin,
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(beast::is_ConstBufferSequence<
|
||||
static_assert(beast::is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
using beast::detail::clamp;
|
||||
@@ -896,21 +895,22 @@ operator()(error_code ec, bool again)
|
||||
|
||||
template<class NextLayer>
|
||||
template<class ConstBufferSequence, class WriteHandler>
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
stream<NextLayer>::
|
||||
async_write(ConstBufferSequence const& bs, WriteHandler&& handler)
|
||||
{
|
||||
static_assert(is_AsyncStream<next_layer_type>::value,
|
||||
"AsyncStream requirements not met");
|
||||
static_assert(beast::is_ConstBufferSequence<
|
||||
static_assert(beast::is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
beast::async_completion<
|
||||
WriteHandler, void(error_code)> completion{handler};
|
||||
write_op<ConstBufferSequence, decltype(completion.handler)>{
|
||||
completion.handler, *this, bs};
|
||||
return completion.result.get();
|
||||
async_completion<WriteHandler,
|
||||
void(error_code)> init{handler};
|
||||
write_op<ConstBufferSequence, BEAST_HANDLER_TYPE(
|
||||
WriteHandler, void(error_code))>{
|
||||
init.completion_handler, *this, bs};
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
template<class NextLayer>
|
||||
@@ -921,7 +921,7 @@ write(ConstBufferSequence const& buffers)
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(beast::is_ConstBufferSequence<
|
||||
static_assert(beast::is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
error_code ec;
|
||||
@@ -938,7 +938,7 @@ write(ConstBufferSequence const& buffers, error_code& ec)
|
||||
{
|
||||
static_assert(is_SyncStream<next_layer_type>::value,
|
||||
"SyncStream requirements not met");
|
||||
static_assert(beast::is_ConstBufferSequence<
|
||||
static_assert(beast::is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
write_frame(true, buffers, ec);
|
||||
|
@@ -14,7 +14,7 @@
|
||||
#include <beast/websocket/detail/stream_base.hpp>
|
||||
#include <beast/http/message.hpp>
|
||||
#include <beast/http/string_body.hpp>
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
||||
#include <beast/core/buffered_read_stream.hpp>
|
||||
#include <beast/core/string_view.hpp>
|
||||
#include <beast/core/detail/get_lowest_layer.hpp>
|
||||
@@ -970,12 +970,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class AcceptHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
AcceptHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
async_accept(AcceptHandler&& handler);
|
||||
|
||||
/** Start reading and responding to a WebSocket HTTP Upgrade request.
|
||||
@@ -1029,12 +1025,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class ResponseDecorator, class AcceptHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
AcceptHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
async_accept_ex(ResponseDecorator const& decorator,
|
||||
AcceptHandler&& handler);
|
||||
|
||||
@@ -1087,12 +1079,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class ConstBufferSequence, class AcceptHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
async_accept(ConstBufferSequence const& buffers,
|
||||
AcceptHandler&& handler);
|
||||
|
||||
@@ -1155,12 +1143,8 @@ public:
|
||||
*/
|
||||
template<class ConstBufferSequence,
|
||||
class ResponseDecorator, class AcceptHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
async_accept_ex(ConstBufferSequence const& buffers,
|
||||
ResponseDecorator const& decorator,
|
||||
AcceptHandler&& handler);
|
||||
@@ -1211,12 +1195,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class Fields, class AcceptHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
async_accept(http::header<true, Fields> const& req,
|
||||
AcceptHandler&& handler);
|
||||
|
||||
@@ -1276,12 +1256,8 @@ public:
|
||||
*/
|
||||
template<class Fields,
|
||||
class ResponseDecorator, class AcceptHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
async_accept_ex(http::header<true, Fields> const& req,
|
||||
ResponseDecorator const& decorator,
|
||||
AcceptHandler&& handler);
|
||||
@@ -1340,12 +1316,8 @@ public:
|
||||
*/
|
||||
template<class Fields,
|
||||
class ConstBufferSequence, class AcceptHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
async_accept(http::header<true, Fields> const& req,
|
||||
ConstBufferSequence const& buffers,
|
||||
AcceptHandler&& handler);
|
||||
@@ -1413,12 +1385,8 @@ public:
|
||||
*/
|
||||
template<class Fields, class ConstBufferSequence,
|
||||
class ResponseDecorator, class AcceptHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<AcceptHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
AcceptHandler, void(error_code))
|
||||
async_accept_ex(http::header<true, Fields> const& req,
|
||||
ConstBufferSequence const& buffers,
|
||||
ResponseDecorator const& decorator,
|
||||
@@ -1895,12 +1863,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class HandshakeHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<HandshakeHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
HandshakeHandler, void(error_code))
|
||||
async_handshake(string_view const& host,
|
||||
string_view const& target,
|
||||
HandshakeHandler&& handler);
|
||||
@@ -1951,12 +1915,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class HandshakeHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<HandshakeHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
HandshakeHandler, void(error_code))
|
||||
async_handshake(response_type& res,
|
||||
string_view const& host,
|
||||
string_view const& target,
|
||||
@@ -2013,12 +1973,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class RequestDecorator, class HandshakeHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<HandshakeHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
HandshakeHandler, void(error_code))
|
||||
async_handshake_ex(string_view const& host,
|
||||
string_view const& target,
|
||||
RequestDecorator const& decorator,
|
||||
@@ -2079,12 +2035,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class RequestDecorator, class HandshakeHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<HandshakeHandler,
|
||||
void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
HandshakeHandler, void(error_code))
|
||||
async_handshake_ex(response_type& res,
|
||||
string_view const& host,
|
||||
string_view const& target,
|
||||
@@ -2193,12 +2145,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class CloseHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
CloseHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
CloseHandler, void(error_code))
|
||||
async_close(close_reason const& cr, CloseHandler&& handler);
|
||||
|
||||
/** Send a WebSocket ping frame.
|
||||
@@ -2275,12 +2223,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class WriteHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
async_ping(ping_data const& payload, WriteHandler&& handler);
|
||||
|
||||
/** Send a WebSocket pong frame.
|
||||
@@ -2372,12 +2316,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class WriteHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
async_pong(ping_data const& payload, WriteHandler&& handler);
|
||||
|
||||
/** Read a message from the stream.
|
||||
@@ -2520,12 +2460,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class DynamicBuffer, class ReadHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code))
|
||||
async_read(opcode& op, DynamicBuffer& dynabuf, ReadHandler&& handler);
|
||||
|
||||
/** Read a message frame from the stream.
|
||||
@@ -2678,12 +2614,8 @@ public:
|
||||
manner equivalent to using boost::asio::io_service::post().
|
||||
*/
|
||||
template<class DynamicBuffer, class ReadHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
ReadHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
ReadHandler, void(error_code))
|
||||
async_read_frame(frame_info& fi,
|
||||
DynamicBuffer& dynabuf, ReadHandler&& handler);
|
||||
|
||||
@@ -2804,12 +2736,8 @@ public:
|
||||
manner equivalent to using `boost::asio::io_service::post`.
|
||||
*/
|
||||
template<class ConstBufferSequence, class WriteHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
async_write(ConstBufferSequence const& buffers,
|
||||
WriteHandler&& handler);
|
||||
|
||||
@@ -2920,12 +2848,8 @@ public:
|
||||
); @endcode
|
||||
*/
|
||||
template<class ConstBufferSequence, class WriteHandler>
|
||||
#if BEAST_DOXYGEN
|
||||
void_or_deduced
|
||||
#else
|
||||
typename async_completion<
|
||||
WriteHandler, void(error_code)>::result_type
|
||||
#endif
|
||||
BEAST_INITFN_RESULT_TYPE(
|
||||
WriteHandler, void(error_code))
|
||||
async_write_frame(bool fin,
|
||||
ConstBufferSequence const& buffers, WriteHandler&& handler);
|
||||
|
||||
|
@@ -16,7 +16,7 @@ compile zlib.cpp : : ;
|
||||
|
||||
unit-test core-tests :
|
||||
../extras/beast/unit_test/main.cpp
|
||||
core/async_completion.cpp
|
||||
core/async_result.cpp
|
||||
core/bind_handler.cpp
|
||||
core/buffer_cat.cpp
|
||||
core/buffer_concepts.cpp
|
||||
|
@@ -9,7 +9,7 @@ add_executable (core-tests
|
||||
${EXTRAS_INCLUDES}
|
||||
../../extras/beast/unit_test/main.cpp
|
||||
buffer_test.hpp
|
||||
async_completion.cpp
|
||||
async_result.cpp
|
||||
bind_handler.cpp
|
||||
buffer_cat.cpp
|
||||
buffer_concepts.cpp
|
||||
|
@@ -6,4 +6,4 @@
|
||||
//
|
||||
|
||||
// Test that header file is self-contained.
|
||||
#include <beast/core/async_completion.hpp>
|
||||
#include <beast/core/async_result.hpp>
|
@@ -16,10 +16,10 @@ struct T
|
||||
};
|
||||
}
|
||||
|
||||
static_assert(is_ConstBufferSequence<detail::ConstBufferSequence>::value, "");
|
||||
static_assert(! is_ConstBufferSequence<T>::value, "");
|
||||
static_assert(is_const_buffer_sequence<detail::ConstBufferSequence>::value, "");
|
||||
static_assert(! is_const_buffer_sequence<T>::value, "");
|
||||
|
||||
static_assert(is_MutableBufferSequence<detail::MutableBufferSequence>::value, "");
|
||||
static_assert(! is_MutableBufferSequence<T>::value, "");
|
||||
static_assert(is_mutable_buffer_sequence<detail::MutableBufferSequence>::value, "");
|
||||
static_assert(! is_mutable_buffer_sequence<T>::value, "");
|
||||
|
||||
} // beast
|
||||
|
@@ -18,7 +18,7 @@ namespace test {
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
typename std::enable_if<
|
||||
is_ConstBufferSequence<ConstBufferSequence>::value,
|
||||
is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||
std::size_t>::type
|
||||
buffer_count(ConstBufferSequence const& buffers)
|
||||
{
|
||||
@@ -27,7 +27,7 @@ buffer_count(ConstBufferSequence const& buffers)
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
typename std::enable_if<
|
||||
is_ConstBufferSequence<ConstBufferSequence>::value,
|
||||
is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||
std::size_t>::type
|
||||
size_pre(ConstBufferSequence const& buffers)
|
||||
{
|
||||
@@ -46,7 +46,7 @@ size_pre(ConstBufferSequence const& buffers)
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
typename std::enable_if<
|
||||
is_ConstBufferSequence<ConstBufferSequence>::value,
|
||||
is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||
std::size_t>::type
|
||||
size_post(ConstBufferSequence const& buffers)
|
||||
{
|
||||
@@ -58,7 +58,7 @@ size_post(ConstBufferSequence const& buffers)
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
typename std::enable_if<
|
||||
is_ConstBufferSequence<ConstBufferSequence>::value,
|
||||
is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||
std::size_t>::type
|
||||
size_rev_pre(ConstBufferSequence const& buffers)
|
||||
{
|
||||
@@ -70,7 +70,7 @@ size_rev_pre(ConstBufferSequence const& buffers)
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
typename std::enable_if<
|
||||
is_ConstBufferSequence<ConstBufferSequence>::value,
|
||||
is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||
std::size_t>::type
|
||||
size_rev_post(ConstBufferSequence const& buffers)
|
||||
{
|
||||
|
@@ -17,7 +17,7 @@
|
||||
|
||||
namespace beast {
|
||||
|
||||
static_assert(is_DynamicBuffer<flat_buffer>::value,
|
||||
static_assert(is_dynamic_buffer<flat_buffer>::value,
|
||||
"DynamicBuffer requirements not met");
|
||||
|
||||
class flat_buffer_test : public beast::unit_test::suite
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
namespace beast {
|
||||
|
||||
static_assert(is_DynamicBuffer<multi_buffer>::value, "");
|
||||
static_assert(is_dynamic_buffer<multi_buffer>::value, "");
|
||||
|
||||
class multi_buffer_test : public beast::unit_test::suite
|
||||
{
|
||||
|
@@ -482,7 +482,7 @@ std::size_t
|
||||
nodejs_basic_parser<Derived>::write(
|
||||
ConstBufferSequence const& buffers, error_code& ec)
|
||||
{
|
||||
static_assert(beast::is_ConstBufferSequence<
|
||||
static_assert(beast::is_const_buffer_sequence<
|
||||
ConstBufferSequence>::value,
|
||||
"ConstBufferSequence requirements not met");
|
||||
using boost::asio::buffer_cast;
|
||||
|
Reference in New Issue
Block a user