diff --git a/CHANGELOG.md b/CHANGELOG.md index deebdcd5..455d5fcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +Version 49 + +-------------------------------------------------------------------------------- + Version 48 * Make buffer_prefix_view public diff --git a/doc/0_main.qbk b/doc/0_main.qbk index a1425c0a..372aa1e1 100644 --- a/doc/0_main.qbk +++ b/doc/0_main.qbk @@ -79,6 +79,11 @@ asynchronous model of __Asio__. ][ An explanation of requirements, audience, features, and credits. ]] + [[ + [link beast.example Examples] + ][ + Examples that illustrate usage for typical scenarios. + ]] [[ [link beast.core Core Concepts] ][ @@ -94,11 +99,6 @@ asynchronous model of __Asio__. ][ How to use the WebSocket interfaces in your applications. ]] - [[ - [link beast.example Examples] - ][ - Examples that illustrate usage for typical scenarios. - ]] [[ [link beast.design Design] ][ @@ -117,10 +117,10 @@ asynchronous model of __Asio__. ] [include 1_overview.qbk] -[include 2_0_core.qbk] -[include 3_0_http.qbk] -[include 4_0_websocket.qbk] -[include 5_examples.qbk] +[include 2_examples.qbk] +[include 3_0_core.qbk] +[include 4_0_http.qbk] +[include 5_0_websocket.qbk] [include 6_0_design.qbk] [section:ref Reference] diff --git a/doc/5_examples.qbk b/doc/2_examples.qbk similarity index 100% rename from doc/5_examples.qbk rename to doc/2_examples.qbk diff --git a/doc/2_0_core.qbk b/doc/3_0_core.qbk similarity index 93% rename from doc/2_0_core.qbk rename to doc/3_0_core.qbk index cc0a773a..e4ee13b3 100644 --- a/doc/2_0_core.qbk +++ b/doc/3_0_core.qbk @@ -44,10 +44,10 @@ lists these facilities by group, with descriptions. ``` ] -[include 2_1_asio.qbk] -[include 2_2_streams.qbk] -[include 2_3_buffers.qbk] -[include 2_4_async.qbk] -[include 2_5_tutorial.qbk] +[include 3_1_asio.qbk] +[include 3_2_streams.qbk] +[include 3_3_buffers.qbk] +[include 3_4_async.qbk] +[include 3_5_tutorial.qbk] [endsect] diff --git a/doc/2_1_asio.qbk b/doc/3_1_asio.qbk similarity index 100% rename from doc/2_1_asio.qbk rename to doc/3_1_asio.qbk diff --git a/doc/2_2_streams.qbk b/doc/3_2_streams.qbk similarity index 100% rename from doc/2_2_streams.qbk rename to doc/3_2_streams.qbk diff --git a/doc/2_3_buffers.qbk b/doc/3_3_buffers.qbk similarity index 100% rename from doc/2_3_buffers.qbk rename to doc/3_3_buffers.qbk diff --git a/doc/2_4_async.qbk b/doc/3_4_async.qbk similarity index 100% rename from doc/2_4_async.qbk rename to doc/3_4_async.qbk diff --git a/doc/2_5_tutorial.qbk b/doc/3_5_tutorial.qbk similarity index 100% rename from doc/2_5_tutorial.qbk rename to doc/3_5_tutorial.qbk diff --git a/doc/3_0_http.qbk b/doc/4_0_http.qbk similarity index 92% rename from doc/3_0_http.qbk rename to doc/4_0_http.qbk index cc42f23f..ed41e4e7 100644 --- a/doc/3_0_http.qbk +++ b/doc/4_0_http.qbk @@ -86,14 +86,14 @@ format using __Asio__. Specifically, the library provides: ``` ] -[include 3_1_primer.qbk] -[include 3_2_message.qbk] -[include 3_3_streams.qbk] -[include 3_4_serializer_streams.qbk] -[include 3_5_parser_streams.qbk] -[include 3_6_serializer_buffers.qbk] -[include 3_7_parser_buffers.qbk] -[include 3_8_custom_parsers.qbk] -[include 3_9_custom_body.qbk] +[include 4_1_primer.qbk] +[include 4_2_message.qbk] +[include 4_3_streams.qbk] +[include 4_4_serializer_streams.qbk] +[include 4_5_parser_streams.qbk] +[include 4_6_serializer_buffers.qbk] +[include 4_7_parser_buffers.qbk] +[include 4_8_custom_parsers.qbk] +[include 4_9_custom_body.qbk] [endsect] diff --git a/doc/3_1_primer.qbk b/doc/4_1_primer.qbk similarity index 100% rename from doc/3_1_primer.qbk rename to doc/4_1_primer.qbk diff --git a/doc/3_2_message.qbk b/doc/4_2_message.qbk similarity index 100% rename from doc/3_2_message.qbk rename to doc/4_2_message.qbk diff --git a/doc/3_3_streams.qbk b/doc/4_3_streams.qbk similarity index 100% rename from doc/3_3_streams.qbk rename to doc/4_3_streams.qbk diff --git a/doc/3_4_serializer_streams.qbk b/doc/4_4_serializer_streams.qbk similarity index 100% rename from doc/3_4_serializer_streams.qbk rename to doc/4_4_serializer_streams.qbk diff --git a/doc/3_5_parser_streams.qbk b/doc/4_5_parser_streams.qbk similarity index 100% rename from doc/3_5_parser_streams.qbk rename to doc/4_5_parser_streams.qbk diff --git a/doc/3_6_serializer_buffers.qbk b/doc/4_6_serializer_buffers.qbk similarity index 100% rename from doc/3_6_serializer_buffers.qbk rename to doc/4_6_serializer_buffers.qbk diff --git a/doc/3_7_parser_buffers.qbk b/doc/4_7_parser_buffers.qbk similarity index 100% rename from doc/3_7_parser_buffers.qbk rename to doc/4_7_parser_buffers.qbk diff --git a/doc/3_8_custom_parsers.qbk b/doc/4_8_custom_parsers.qbk similarity index 100% rename from doc/3_8_custom_parsers.qbk rename to doc/4_8_custom_parsers.qbk diff --git a/doc/3_9_custom_body.qbk b/doc/4_9_custom_body.qbk similarity index 100% rename from doc/3_9_custom_body.qbk rename to doc/4_9_custom_body.qbk diff --git a/doc/4_0_websocket.qbk b/doc/5_0_websocket.qbk similarity index 91% rename from doc/4_0_websocket.qbk rename to doc/5_0_websocket.qbk index a56560bd..9df67ff5 100644 --- a/doc/4_0_websocket.qbk +++ b/doc/5_0_websocket.qbk @@ -39,12 +39,12 @@ Boost.Asio with a consistent asynchronous model using a modern C++ approach. ``` ] -[include 4_1_streams.qbk] -[include 4_2_connect.qbk] -[include 4_3_client.qbk] -[include 4_4_server.qbk] -[include 4_5_messages.qbk] -[include 4_6_control.qbk] -[include 4_7_notes.qbk] +[include 5_1_streams.qbk] +[include 5_2_connect.qbk] +[include 5_3_client.qbk] +[include 5_4_server.qbk] +[include 5_5_messages.qbk] +[include 5_6_control.qbk] +[include 5_7_notes.qbk] [endsect] diff --git a/doc/4_1_streams.qbk b/doc/5_1_streams.qbk similarity index 100% rename from doc/4_1_streams.qbk rename to doc/5_1_streams.qbk diff --git a/doc/4_2_connect.qbk b/doc/5_2_connect.qbk similarity index 100% rename from doc/4_2_connect.qbk rename to doc/5_2_connect.qbk diff --git a/doc/4_3_client.qbk b/doc/5_3_client.qbk similarity index 100% rename from doc/4_3_client.qbk rename to doc/5_3_client.qbk diff --git a/doc/4_4_server.qbk b/doc/5_4_server.qbk similarity index 100% rename from doc/4_4_server.qbk rename to doc/5_4_server.qbk diff --git a/doc/4_5_messages.qbk b/doc/5_5_messages.qbk similarity index 100% rename from doc/4_5_messages.qbk rename to doc/5_5_messages.qbk diff --git a/doc/4_6_control.qbk b/doc/5_6_control.qbk similarity index 100% rename from doc/4_6_control.qbk rename to doc/5_6_control.qbk diff --git a/doc/4_7_notes.qbk b/doc/5_7_notes.qbk similarity index 100% rename from doc/4_7_notes.qbk rename to doc/5_7_notes.qbk diff --git a/include/beast/core/type_traits.hpp b/include/beast/core/type_traits.hpp index 4596c260..beebe9b8 100644 --- a/include/beast/core/type_traits.hpp +++ b/include/beast/core/type_traits.hpp @@ -23,22 +23,29 @@ namespace beast { /** Determine if `T` meets the requirements of @b ConstBufferSequence. + Metafunctions are used to perform compile time checking of template + types. This type will be `std::true_type` if `T` meets the requirements, + else the type will be `std::false_type`. + @par Example + Use with `static_assert`: + @code - template - void f(ConstBufferSequence const& buffers) - { - static_assert(is_const_buffer_sequence::value, - "ConstBufferSequence requirements not met"); - ... - } + template + void f(ConstBufferSequence const& buffers) + { + static_assert(is_const_buffer_sequence::value, + "ConstBufferSequence requirements not met"); + ... @endcode - Use with `std::enable_if` + + Use with `std::enable_if` (SFINAE): + @code - template - typename std::enable_if::value>::type - f(ConstBufferSequence const& buffers); + template + typename std::enable_if::value>::type + f(ConstBufferSequence const& buffers); @endcode */ template @@ -53,22 +60,29 @@ struct is_const_buffer_sequence : /** Determine if `T` meets the requirements of @b MutableBufferSequence. + Metafunctions are used to perform compile time checking of template + types. This type will be `std::true_type` if `T` meets the requirements, + else the type will be `std::false_type`. + @par Example + Use with `static_assert`: + @code - template - void f(MutableBufferSequence const& buffers) - { - static_assert(is_const_buffer_sequence::value, - "MutableBufferSequence requirements not met"); - ... - } + template + void f(MutableBufferSequence const& buffers) + { + static_assert(is_const_buffer_sequence::value, + "MutableBufferSequence requirements not met"); + ... @endcode - Use with `std::enable_if` + + Use with `std::enable_if` (SFINAE): + @code - template - typename std::enable_if::value>::type - f(MutableBufferSequence const& buffers); + template + typename std::enable_if::value>::type + f(MutableBufferSequence const& buffers); @endcode */ template @@ -83,22 +97,29 @@ struct is_mutable_buffer_sequence : /** Determine if `T` meets the requirements of @b DynamicBuffer. + Metafunctions are used to perform compile time checking of template + types. This type will be `std::true_type` if `T` meets the requirements, + else the type will be `std::false_type`. + @par Example + Use with `static_assert`: + @code - template - void f(DynamicBuffer& buffer) - { - static_assert(is_dynamic_buffer::value, - "DynamicBuffer requirements not met"); - ... - } + template + void f(DynamicBuffer& buffer) + { + static_assert(is_dynamic_buffer::value, + "DynamicBuffer requirements not met"); + ... @endcode - Use with `std::enable_if` + + Use with `std::enable_if` (SFINAE): + @code - template - typename std::enable_if::value>::type - f(DynamicBuffer const& buffer); + template + typename std::enable_if::value>::type + f(DynamicBuffer const& buffer); @endcode */ #if BEAST_DOXYGEN @@ -149,11 +170,16 @@ struct is_dynamic_buffer< /** Determine if `T` meets the requirements of @b CompletionHandler. - This metafunction will be equivalent to `std::true_type` if `T` - meets the requirements for a completion handler callable with - the given signature. + This trait checks whether a type meets the requirements for a completion + handler, and is also callable with the specified signature. + Metafunctions are used to perform compile time checking of template + types. This type will be `std::true_type` if `T` meets the requirements, + else the type will be `std::false_type`. @par Example + + Use with `static_assert`: + @code struct handler { @@ -181,7 +207,36 @@ using is_completion_handler = std::integral_constant + void maybe_hello(T& t, std::true_type) + { + t.get_io_service().post([]{ std::cout << "Hello, world!" << std::endl; }); + } + + template + void maybe_hello(T&, std::false_type) + { + // T does not have get_io_service + } + + template + void maybe_hello(T& t) + { + maybe_hello(t, has_get_io_service{}); + } + @endcode + + Use with `static_assert`: + @code struct stream { @@ -208,7 +263,13 @@ struct has_get_io_service struct stream_wrapper @@ -217,6 +278,15 @@ struct has_get_io_service::type; }; @endcode + + Defining a metafunction: + + @code + /// Alias for `std::true_type` if `T` wraps another stream + template + using is_stream_wrapper : std::integral_constant::type>::value> {}; + @endcode */ #if BEAST_DOXYGEN template @@ -238,18 +308,25 @@ struct get_lowest_layer - void f(AsyncReadStream& stream) - { - static_assert(is_async_read_stream::value, - "AsyncReadStream requirements not met"); - ... - } + template + void f(AsyncReadStream& stream) + { + static_assert(is_async_read_stream::value, + "AsyncReadStream requirements not met"); + ... @endcode - Use with `std::enable_if` + + Use with `std::enable_if` (SFINAE): + @code template typename std::enable_if::value>::type @@ -275,22 +352,29 @@ struct is_async_read_stream - void f(AsyncWriteStream& stream) - { - static_assert(is_async_write_stream::value, - "AsyncWriteStream requirements not met"); - ... - } + template + void f(AsyncWriteStream& stream) + { + static_assert(is_async_write_stream::value, + "AsyncWriteStream requirements not met"); + ... @endcode - Use with `std::enable_if` + + Use with `std::enable_if` (SFINAE): + @code - template - typename std::enable_if::value>::type - f(AsyncWriteStream& stream); + template + typename std::enable_if::value>::type + f(AsyncWriteStream& stream); @endcode */ #if BEAST_DOXYGEN @@ -312,22 +396,29 @@ struct is_async_write_stream - void f(SyncReadStream& stream) - { - static_assert(is_sync_read_stream::value, - "SyncReadStream requirements not met"); - ... - } + template + void f(SyncReadStream& stream) + { + static_assert(is_sync_read_stream::value, + "SyncReadStream requirements not met"); + ... @endcode - Use with `std::enable_if` + + Use with `std::enable_if` (SFINAE): + @code - template - typename std::enable_if::value>::type - f(SyncReadStream& stream); + template + typename std::enable_if::value>::type + f(SyncReadStream& stream); @endcode */ #if BEAST_DOXYGEN @@ -351,22 +442,29 @@ struct is_sync_read_stream - void f(SyncReadStream& stream) - { - static_assert(is_sync_read_stream::value, - "SyncReadStream requirements not met"); - ... - } + template + void f(SyncReadStream& stream) + { + static_assert(is_sync_read_stream::value, + "SyncReadStream requirements not met"); + ... @endcode - Use with `std::enable_if` + + Use with `std::enable_if` (SFINAE): + @code - template - typename std::enable_if::value>::type - f(SyncReadStream& stream); + template + typename std::enable_if::value>::type + f(SyncReadStream& stream); @endcode */ #if BEAST_DOXYGEN @@ -390,22 +488,29 @@ struct is_sync_write_stream - void f(AsyncStream& stream) - { - static_assert(is_async_stream::value, - "AsyncStream requirements not met"); - ... - } + template + void f(AsyncStream& stream) + { + static_assert(is_async_stream::value, + "AsyncStream requirements not met"); + ... @endcode - Use with `std::enable_if` + + Use with `std::enable_if` (SFINAE): + @code - template - typename std::enable_if::value>::type - f(AsyncStream& stream); + template + typename std::enable_if::value>::type + f(AsyncStream& stream); @endcode */ #if BEAST_DOXYGEN @@ -419,23 +524,29 @@ using is_async_stream = std::integral_constant - void f(SyncStream& stream) - { - static_assert(is_sync_stream::value, - "SyncStream requirements not met"); - ... - } + template + void f(SyncStream& stream) + { + static_assert(is_sync_stream::value, + "SyncStream requirements not met"); + ... @endcode - Use with `std::enable_if` + + Use with `std::enable_if` (SFINAE): + @code - template - typename std::enable_if::value>::type - f(SyncStream& stream); + template + typename std::enable_if::value>::type + f(SyncStream& stream); @endcode */ #if BEAST_DOXYGEN