forked from boostorg/beast
New buffers() replaces to_string() (API Change):
A new function, buffers(), returns an implementation defined object
which wraps a ConstBufferSequence and supports formatting to a
std::ostream.
The function to_string is removed, as the new implementation allows
conversion to string using boost::lexical_cast on the return value
of the call to buffers(). Streaming to an output stream is more
efficient: no dynamic allocations are performed.
Example:
streambuf sb;
std::cout << buffers(sb.data()) << std::endl;
This commit is contained in:
@@ -37,7 +37,6 @@ unit-test core-tests :
|
||||
core/static_string.cpp
|
||||
core/stream_concepts.cpp
|
||||
core/streambuf.cpp
|
||||
core/to_string.cpp
|
||||
core/base64.cpp
|
||||
core/empty_base_optimization.cpp
|
||||
core/get_lowest_layer.cpp
|
||||
|
||||
@@ -30,7 +30,6 @@ add_executable (core-tests
|
||||
static_string.cpp
|
||||
stream_concepts.cpp
|
||||
streambuf.cpp
|
||||
to_string.cpp
|
||||
base64.cpp
|
||||
empty_base_optimization.cpp
|
||||
get_lowest_layer.cpp
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
// Test that header file is self-contained.
|
||||
#include <beast/core/buffers_adapter.hpp>
|
||||
|
||||
#include <beast/core/ostream.hpp>
|
||||
#include <beast/core/streambuf.hpp>
|
||||
#include <beast/unit_test/suite.hpp>
|
||||
#include <boost/asio/buffer.hpp>
|
||||
#include <boost/asio/streambuf.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <iterator>
|
||||
|
||||
namespace beast {
|
||||
@@ -24,14 +26,8 @@ public:
|
||||
std::string
|
||||
to_string(ConstBufferSequence const& bs)
|
||||
{
|
||||
using boost::asio::buffer_cast;
|
||||
using boost::asio::buffer_size;
|
||||
std::string s;
|
||||
s.reserve(buffer_size(bs));
|
||||
for(auto const& b : bs)
|
||||
s.append(buffer_cast<char const*>(b),
|
||||
buffer_size(b));
|
||||
return s;
|
||||
return boost::lexical_cast<
|
||||
std::string>(buffers(bs));
|
||||
}
|
||||
|
||||
void testBuffersAdapter()
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include <beast/core/consuming_buffers.hpp>
|
||||
|
||||
#include "buffer_test.hpp"
|
||||
#include <beast/core/to_string.hpp>
|
||||
#include <beast/core/ostream.hpp>
|
||||
#include <beast/unit_test/suite.hpp>
|
||||
#include <boost/asio/buffer.hpp>
|
||||
#include <string>
|
||||
@@ -19,6 +19,15 @@ namespace beast {
|
||||
class consuming_buffers_test : public beast::unit_test::suite
|
||||
{
|
||||
public:
|
||||
template<class ConstBufferSequence>
|
||||
static
|
||||
std::string
|
||||
to_string(ConstBufferSequence const& bs)
|
||||
{
|
||||
return boost::lexical_cast<
|
||||
std::string>(buffers(bs));
|
||||
}
|
||||
|
||||
template<class BufferSequence>
|
||||
static
|
||||
consuming_buffers<BufferSequence>
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
#include <beast/core/flat_streambuf.hpp>
|
||||
|
||||
#include "buffer_test.hpp"
|
||||
#include <beast/core/to_string.hpp>
|
||||
#include <beast/core/ostream.hpp>
|
||||
#include <beast/test/test_allocator.hpp>
|
||||
#include <beast/unit_test/suite.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <algorithm>
|
||||
|
||||
namespace beast {
|
||||
@@ -22,6 +23,15 @@ static_assert(is_DynamicBuffer<flat_streambuf>::value,
|
||||
class flat_streambuf_test : public beast::unit_test::suite
|
||||
{
|
||||
public:
|
||||
template<class ConstBufferSequence>
|
||||
static
|
||||
std::string
|
||||
to_string(ConstBufferSequence const& bs)
|
||||
{
|
||||
return boost::lexical_cast<
|
||||
std::string>(buffers(bs));
|
||||
}
|
||||
|
||||
template<class Alloc1, class Alloc2>
|
||||
static
|
||||
bool
|
||||
|
||||
@@ -10,10 +10,9 @@
|
||||
|
||||
#include <beast/core/streambuf.hpp>
|
||||
#include <beast/unit_test/suite.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <ostream>
|
||||
|
||||
#include <beast/core/to_string.hpp>
|
||||
|
||||
namespace beast {
|
||||
|
||||
class ostream_test : public beast::unit_test::suite
|
||||
@@ -23,7 +22,8 @@ public:
|
||||
{
|
||||
streambuf sb;
|
||||
ostream(sb) << "Hello, world!\n";
|
||||
BEAST_EXPECT(to_string(sb.data()) == "Hello, world!\n");
|
||||
BEAST_EXPECT(boost::lexical_cast<std::string>(
|
||||
buffers(sb.data())) == "Hello, world!\n");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+10
-1
@@ -10,7 +10,7 @@
|
||||
|
||||
#include "buffer_test.hpp"
|
||||
#include <beast/core/buffer_concepts.hpp>
|
||||
#include <beast/core/to_string.hpp>
|
||||
#include <beast/core/ostream.hpp>
|
||||
#include <beast/test/test_allocator.hpp>
|
||||
#include <beast/unit_test/suite.hpp>
|
||||
#include <boost/asio/buffer.hpp>
|
||||
@@ -26,6 +26,15 @@ static_assert(is_DynamicBuffer<streambuf>::value, "");
|
||||
class basic_streambuf_test : public beast::unit_test::suite
|
||||
{
|
||||
public:
|
||||
template<class ConstBufferSequence>
|
||||
static
|
||||
std::string
|
||||
to_string(ConstBufferSequence const& bs)
|
||||
{
|
||||
return boost::lexical_cast<
|
||||
std::string>(buffers(bs));
|
||||
}
|
||||
|
||||
template<class Alloc1, class Alloc2>
|
||||
static
|
||||
bool
|
||||
|
||||
@@ -1,28 +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)
|
||||
//
|
||||
|
||||
// Test that header file is self-contained.
|
||||
#include <beast/core/to_string.hpp>
|
||||
|
||||
#include <beast/unit_test/suite.hpp>
|
||||
#include <boost/asio/buffer.hpp>
|
||||
|
||||
namespace beast {
|
||||
|
||||
class to_string_test : public beast::unit_test::suite
|
||||
{
|
||||
public:
|
||||
void run()
|
||||
{
|
||||
BEAST_EXPECT(to_string(boost::asio::const_buffers_1("x", 1)) == "x");
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(to_string,core,beast);
|
||||
|
||||
} // beast
|
||||
|
||||
@@ -8,8 +8,9 @@
|
||||
// Test that header file is self-contained.
|
||||
#include <beast/http/chunk_encode.hpp>
|
||||
|
||||
#include <beast/core/to_string.hpp>
|
||||
#include <beast/core/ostream.hpp>
|
||||
#include <beast/unit_test/suite.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
namespace beast {
|
||||
namespace http {
|
||||
@@ -30,6 +31,15 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
static
|
||||
std::string
|
||||
to_string(ConstBufferSequence const& bs)
|
||||
{
|
||||
return boost::lexical_cast<
|
||||
std::string>(buffers(bs));
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
encode1(std::string& s, final_chunk const& fc)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
// Test that header file is self-contained.
|
||||
#include <beast/http/dynamic_body.hpp>
|
||||
|
||||
#include <beast/core/to_string.hpp>
|
||||
#include <beast/core/ostream.hpp>
|
||||
#include <beast/http/fields.hpp>
|
||||
#include <beast/http/message_parser.hpp>
|
||||
#include <beast/http/read.hpp>
|
||||
@@ -25,7 +25,8 @@ class dynamic_body_test : public beast::unit_test::suite
|
||||
boost::asio::io_service ios_;
|
||||
|
||||
public:
|
||||
void run() override
|
||||
void
|
||||
run() override
|
||||
{
|
||||
std::string const s =
|
||||
"HTTP/1.1 200 OK\r\n"
|
||||
@@ -38,7 +39,8 @@ public:
|
||||
streambuf sb;
|
||||
read(ss, sb, p);
|
||||
auto const& m = p.get();
|
||||
BEAST_EXPECT(to_string(m.body.data()) == "xyz");
|
||||
BEAST_EXPECT(boost::lexical_cast<std::string>(
|
||||
buffers(m.body.data())) == "xyz");
|
||||
BEAST_EXPECT(boost::lexical_cast<std::string>(m) == s);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -10,9 +10,10 @@
|
||||
|
||||
#include <beast/http.hpp>
|
||||
#include <beast/core/consuming_buffers.hpp>
|
||||
#include <beast/core/ostream.hpp>
|
||||
#include <beast/core/streambuf.hpp>
|
||||
#include <beast/core/to_string.hpp>
|
||||
#include <beast/unit_test/suite.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <chrono>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
@@ -31,6 +32,15 @@ public:
|
||||
corpus cres_;
|
||||
std::size_t size_ = 0;
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
static
|
||||
std::string
|
||||
to_string(ConstBufferSequence const& bs)
|
||||
{
|
||||
return boost::lexical_cast<
|
||||
std::string>(buffers(bs));
|
||||
}
|
||||
|
||||
parser_bench_test()
|
||||
{
|
||||
creq_ = build_corpus(N/2, std::true_type{});
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <beast/http/write.hpp>
|
||||
#include <beast/core/error.hpp>
|
||||
#include <beast/core/streambuf.hpp>
|
||||
#include <beast/core/to_string.hpp>
|
||||
#include <beast/test/fail_stream.hpp>
|
||||
#include <beast/test/string_ostream.hpp>
|
||||
#include <beast/test/yield_to.hpp>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "websocket_async_ssl_echo_server.hpp"
|
||||
|
||||
#include <beast/websocket/stream.hpp>
|
||||
#include <beast/core/to_string.hpp>
|
||||
#include <beast/core/ostream.hpp>
|
||||
#include <beast/unit_test/suite.hpp>
|
||||
#include <beast/test/yield_to.hpp>
|
||||
#include <boost/asio.hpp>
|
||||
@@ -126,7 +126,7 @@ public:
|
||||
// Secure WebSocket connect and send message using Beast
|
||||
beast::websocket::stream<stream_type&> ws{stream};
|
||||
ws.handshake("localhost", "/");
|
||||
ws.write(boost::asio::buffer("Hello, world!"));
|
||||
ws.write(boost::asio::buffer("Hello, world!", 13));
|
||||
|
||||
// Receive Secure WebSocket message, print and close using Beast
|
||||
beast::streambuf sb;
|
||||
@@ -146,9 +146,8 @@ public:
|
||||
if(se.code() != beast::websocket::error::closed)
|
||||
throw;
|
||||
}
|
||||
log << to_string(sb.data()) << std::endl;
|
||||
|
||||
pass();
|
||||
BEAST_EXPECT(boost::lexical_cast<std::string>(
|
||||
buffers(sb.data())) == "Hello, world!");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
#include "websocket_async_echo_server.hpp"
|
||||
#include "websocket_sync_echo_server.hpp"
|
||||
|
||||
#include <beast/core/ostream.hpp>
|
||||
#include <beast/core/streambuf.hpp>
|
||||
#include <beast/core/to_string.hpp>
|
||||
#include <beast/test/fail_stream.hpp>
|
||||
#include <beast/test/string_istream.hpp>
|
||||
#include <beast/test/string_iostream.hpp>
|
||||
@@ -38,6 +38,15 @@ public:
|
||||
using address_type = boost::asio::ip::address;
|
||||
using socket_type = boost::asio::ip::tcp::socket;
|
||||
|
||||
template<class ConstBufferSequence>
|
||||
static
|
||||
std::string
|
||||
to_string(ConstBufferSequence const& bs)
|
||||
{
|
||||
return boost::lexical_cast<
|
||||
std::string>(buffers(bs));
|
||||
}
|
||||
|
||||
struct con
|
||||
{
|
||||
stream<socket_type> ws;
|
||||
@@ -1169,7 +1178,8 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
void testMask(endpoint_type const& ep,
|
||||
void
|
||||
testMask(endpoint_type const& ep,
|
||||
yield_context do_yield)
|
||||
{
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user