Add 1-element specialization for buffers_cat

`buffers_cat` now supports 1 or more buffers sequences.

Close #1280

Signed-off-by: Damian Jarek <damian.jarek93@gmail.com>
This commit is contained in:
Damian Jarek
2019-05-19 21:51:02 +02:00
parent 9909fada29
commit 3fa468f840
3 changed files with 36 additions and 6 deletions

View File

@@ -7,6 +7,7 @@ Version 256:
* Expand CI matrix using Azure Pipelines
* Make chat websocket javascript client more user friendly
* `allocator_traits::construct` is used for user-defined types
* Add 1-element specialization for `buffers_cat`
--------------------------------------------------------------------------------

View File

@@ -65,7 +65,8 @@ public:
end() const;
};
/** Concatenate 2 or more buffer sequences.
/** Concatenate 1 or more buffer sequences.
This function returns a constant or mutable buffer sequence which,
when iterated, efficiently concatenates the input buffer sequences.
Copies of the arguments passed will be made; however, the returned
@@ -85,15 +86,15 @@ template<class... BufferSequence>
buffers_cat_view<BufferSequence...>
buffers_cat(BufferSequence const&... buffers)
#else
template<class B1, class B2, class... Bn>
buffers_cat_view<B1, B2, Bn...>
buffers_cat(B1 const& b1, B2 const& b2, Bn const&... bn)
template<class B1, class... Bn>
buffers_cat_view<B1, Bn...>
buffers_cat(B1 const& b1, Bn const&... bn)
#endif
{
static_assert(
is_const_buffer_sequence<B1, B2, Bn...>::value,
is_const_buffer_sequence<B1, Bn...>::value,
"BufferSequence type requirements not met");
return buffers_cat_view<B1, B2, Bn...>{b1, b2, bn...};
return buffers_cat_view<B1, Bn...>{b1, bn...};
}
} // beast

View File

@@ -23,6 +23,34 @@
namespace boost {
namespace beast {
template<class Buffer>
class buffers_cat_view<Buffer>
{
Buffer buffer_;
public:
using value_type = buffers_type<Buffer>;
using const_iterator = buffers_iterator_type<Buffer>;
explicit
buffers_cat_view(Buffer const& buffer)
: buffer_(buffer)
{
}
const_iterator
begin() const
{
return net::buffer_sequence_begin(buffer_);
}
const_iterator
end() const
{
return net::buffer_sequence_end(buffer_);
}
};
#if defined(_MSC_VER) && ! defined(__clang__)
# define BOOST_BEAST_UNREACHABLE() __assume(false)
# define BOOST_BEAST_UNREACHABLE_RETURN(v) __assume(false)