diff options
Diffstat (limited to '3rdparty/asio/src/tests/unit/write.cpp')
-rw-r--r-- | 3rdparty/asio/src/tests/unit/write.cpp | 1194 |
1 files changed, 1052 insertions, 142 deletions
diff --git a/3rdparty/asio/src/tests/unit/write.cpp b/3rdparty/asio/src/tests/unit/write.cpp index a60ee11ae45..470972217c1 100644 --- a/3rdparty/asio/src/tests/unit/write.cpp +++ b/3rdparty/asio/src/tests/unit/write.cpp @@ -2,7 +2,7 @@ // write.cpp // ~~~~~~~~~ // -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff 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) @@ -16,7 +16,9 @@ // Test that header file is self-contained. #include "asio/write.hpp" +#include <array> #include <cstring> +#include <functional> #include <vector> #include "archetypes/async_result.hpp" #include "asio/io_context.hpp" @@ -24,20 +26,10 @@ #include "asio/streambuf.hpp" #include "unit_test.hpp" -#if defined(ASIO_HAS_BOOST_BIND) -# include <boost/bind.hpp> -#else // defined(ASIO_HAS_BOOST_BIND) -# include <functional> -#endif // defined(ASIO_HAS_BOOST_BIND) - #if defined(ASIO_HAS_BOOST_ARRAY) #include <boost/array.hpp> #endif // defined(ASIO_HAS_BOOST_ARRAY) -#if defined(ASIO_HAS_STD_ARRAY) -# include <array> -#endif // defined(ASIO_HAS_STD_ARRAY) - using namespace std; // For memcmp, memcpy and memset. class test_stream @@ -54,7 +46,7 @@ public: memset(data_, 0, max_length); } - executor_type get_executor() ASIO_NOEXCEPT + executor_type get_executor() noexcept { return io_context_.get_executor(); } @@ -120,12 +112,13 @@ public: } template <typename Const_Buffers, typename Handler> - void async_write_some(const Const_Buffers& buffers, Handler handler) + void async_write_some(const Const_Buffers& buffers, + Handler&& handler) { size_t bytes_transferred = write_some(buffers); asio::post(get_executor(), asio::detail::bind_handler( - ASIO_MOVE_CAST(Handler)(handler), + static_cast<Handler&&>(handler), asio::error_code(), bytes_transferred)); } @@ -209,7 +202,8 @@ void test_2_arg_vector_buffers_write() test_stream s(ioc); std::vector<asio::const_buffer> buffers; buffers.push_back(asio::buffer(write_data, 32)); - buffers.push_back(asio::buffer(write_data) + 32); + buffers.push_back(asio::buffer(write_data, 39) + 32); + buffers.push_back(asio::buffer(write_data) + 39); s.reset(); size_t bytes_transferred = asio::write(s, buffers); @@ -229,6 +223,38 @@ void test_2_arg_vector_buffers_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); } +void test_2_arg_dynamic_string_write() +{ + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(write_data)); + asio::const_buffer buffers + = asio::buffer(write_data, sizeof(write_data)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + size_t bytes_transferred = asio::write(s, sb); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); +} + void test_3_arg_nothrow_zero_buffers_write() { asio::io_context ioc; @@ -305,7 +331,8 @@ void test_3_arg_nothrow_vector_buffers_write() test_stream s(ioc); std::vector<asio::const_buffer> buffers; buffers.push_back(asio::buffer(write_data, 32)); - buffers.push_back(asio::buffer(write_data) + 32); + buffers.push_back(asio::buffer(write_data, 39) + 32); + buffers.push_back(asio::buffer(write_data) + 39); s.reset(); asio::error_code error; @@ -329,17 +356,58 @@ void test_3_arg_nothrow_vector_buffers_write() ASIO_CHECK(!error); } +void test_3_arg_nothrow_dynamic_string_write() +{ + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(write_data)); + asio::const_buffer buffers + = asio::buffer(write_data, sizeof(write_data)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + asio::error_code error; + size_t bytes_transferred = asio::write(s, sb, error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); +} + bool old_style_transfer_all(const asio::error_code& ec, size_t /*bytes_transferred*/) { return !!ec; } -size_t short_transfer(const asio::error_code& ec, - size_t /*bytes_transferred*/) +struct short_transfer { - return !!ec ? 0 : 3; -} + short_transfer() {} + short_transfer(short_transfer&&) {} + size_t operator()(const asio::error_code& ec, + size_t /*bytes_transferred*/) + { + return !!ec ? 0 : 3; + } +}; void test_3_arg_const_buffer_write() { @@ -506,19 +574,19 @@ void test_3_arg_const_buffer_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); - bytes_transferred = asio::write(s, buffers, short_transfer); + bytes_transferred = asio::write(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); s.next_write_length(1); - bytes_transferred = asio::write(s, buffers, short_transfer); + bytes_transferred = asio::write(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); s.next_write_length(10); - bytes_transferred = asio::write(s, buffers, short_transfer); + bytes_transferred = asio::write(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); } @@ -688,19 +756,19 @@ void test_3_arg_mutable_buffer_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data))); s.reset(); - bytes_transferred = asio::write(s, buffers, short_transfer); + bytes_transferred = asio::write(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data))); s.reset(); s.next_write_length(1); - bytes_transferred = asio::write(s, buffers, short_transfer); + bytes_transferred = asio::write(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data))); s.reset(); s.next_write_length(10); - bytes_transferred = asio::write(s, buffers, short_transfer); + bytes_transferred = asio::write(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data))); } @@ -711,7 +779,8 @@ void test_3_arg_vector_buffers_write() test_stream s(ioc); std::vector<asio::const_buffer> buffers; buffers.push_back(asio::buffer(write_data, 32)); - buffers.push_back(asio::buffer(write_data) + 32); + buffers.push_back(asio::buffer(write_data, 39) + 32); + buffers.push_back(asio::buffer(write_data) + 39); s.reset(); size_t bytes_transferred = asio::write(s, buffers, @@ -871,19 +940,232 @@ void test_3_arg_vector_buffers_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); - bytes_transferred = asio::write(s, buffers, short_transfer); + bytes_transferred = asio::write(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); s.next_write_length(1); - bytes_transferred = asio::write(s, buffers, short_transfer); + bytes_transferred = asio::write(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); s.next_write_length(10); - bytes_transferred = asio::write(s, buffers, short_transfer); + bytes_transferred = asio::write(s, buffers, short_transfer()); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); +} + +void test_3_arg_dynamic_string_write() +{ + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(write_data)); + asio::const_buffer buffers + = asio::buffer(write_data, sizeof(write_data)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + size_t bytes_transferred = asio::write(s, sb, + asio::transfer_all()); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, + asio::transfer_all()); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, + asio::transfer_all()); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(1)); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(1)); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(s.check_buffers(buffers, 1)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(1)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(10)); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(42)); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(42)); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(s.check_buffers(buffers, 42)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(42)); + ASIO_CHECK(bytes_transferred == 50); + ASIO_CHECK(s.check_buffers(buffers, 50)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(1)); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(s.check_buffers(buffers, 1)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(1)); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(s.check_buffers(buffers, 1)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(1)); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(s.check_buffers(buffers, 1)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(42)); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(s.check_buffers(buffers, 42)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(42)); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(s.check_buffers(buffers, 42)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(42)); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(s.check_buffers(buffers, 42)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, old_style_transfer_all); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, old_style_transfer_all); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, old_style_transfer_all); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, short_transfer()); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + bytes_transferred = asio::write(s, sb, short_transfer()); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + bytes_transferred = asio::write(s, sb, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); } @@ -1103,7 +1385,7 @@ void test_4_arg_const_buffer_write() ASIO_CHECK(!error); s.reset(); - bytes_transferred = asio::write(s, buffers, short_transfer, error); + bytes_transferred = asio::write(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); ASIO_CHECK(!error); @@ -1111,7 +1393,7 @@ void test_4_arg_const_buffer_write() s.reset(); s.next_write_length(1); error = asio::error_code(); - bytes_transferred = asio::write(s, buffers, short_transfer, error); + bytes_transferred = asio::write(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); ASIO_CHECK(!error); @@ -1119,7 +1401,7 @@ void test_4_arg_const_buffer_write() s.reset(); s.next_write_length(10); error = asio::error_code(); - bytes_transferred = asio::write(s, buffers, short_transfer, error); + bytes_transferred = asio::write(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); ASIO_CHECK(!error); @@ -1340,7 +1622,7 @@ void test_4_arg_mutable_buffer_write() ASIO_CHECK(!error); s.reset(); - bytes_transferred = asio::write(s, buffers, short_transfer, error); + bytes_transferred = asio::write(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data))); ASIO_CHECK(!error); @@ -1348,7 +1630,7 @@ void test_4_arg_mutable_buffer_write() s.reset(); s.next_write_length(1); error = asio::error_code(); - bytes_transferred = asio::write(s, buffers, short_transfer, error); + bytes_transferred = asio::write(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data))); ASIO_CHECK(!error); @@ -1356,7 +1638,7 @@ void test_4_arg_mutable_buffer_write() s.reset(); s.next_write_length(10); error = asio::error_code(); - bytes_transferred = asio::write(s, buffers, short_transfer, error); + bytes_transferred = asio::write(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data))); ASIO_CHECK(!error); @@ -1368,7 +1650,8 @@ void test_4_arg_vector_buffers_write() test_stream s(ioc); std::vector<asio::const_buffer> buffers; buffers.push_back(asio::buffer(write_data, 32)); - buffers.push_back(asio::buffer(write_data) + 32); + buffers.push_back(asio::buffer(write_data, 39) + 32); + buffers.push_back(asio::buffer(write_data) + 39); s.reset(); asio::error_code error; @@ -1578,7 +1861,7 @@ void test_4_arg_vector_buffers_write() ASIO_CHECK(!error); s.reset(); - bytes_transferred = asio::write(s, buffers, short_transfer, error); + bytes_transferred = asio::write(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); ASIO_CHECK(!error); @@ -1586,7 +1869,7 @@ void test_4_arg_vector_buffers_write() s.reset(); s.next_write_length(1); error = asio::error_code(); - bytes_transferred = asio::write(s, buffers, short_transfer, error); + bytes_transferred = asio::write(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); ASIO_CHECK(!error); @@ -1594,7 +1877,275 @@ void test_4_arg_vector_buffers_write() s.reset(); s.next_write_length(10); error = asio::error_code(); - bytes_transferred = asio::write(s, buffers, short_transfer, error); + bytes_transferred = asio::write(s, buffers, short_transfer(), error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); +} + +void test_4_arg_dynamic_string_write() +{ + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(write_data)); + asio::const_buffer buffers + = asio::buffer(write_data, sizeof(write_data)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + asio::error_code error; + size_t bytes_transferred = asio::write(s, sb, + asio::transfer_all(), error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_all(), error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_all(), error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(1), error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(1), error); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(s.check_buffers(buffers, 1)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(1), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(10), error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(42), error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(42), error); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(s.check_buffers(buffers, 42)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_at_least(42), error); + ASIO_CHECK(bytes_transferred == 50); + ASIO_CHECK(s.check_buffers(buffers, 50)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(1), error); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(s.check_buffers(buffers, 1)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(1), error); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(s.check_buffers(buffers, 1)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(1), error); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(s.check_buffers(buffers, 1)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(s.check_buffers(buffers, 10)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(42), error); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(s.check_buffers(buffers, 42)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(42), error); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(s.check_buffers(buffers, 42)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + asio::transfer_exactly(42), error); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(s.check_buffers(buffers, 42)); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, + old_style_transfer_all, error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + old_style_transfer_all, error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, + old_style_transfer_all, error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bytes_transferred = asio::write(s, sb, short_transfer(), error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, short_transfer(), error); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + ASIO_CHECK(!error); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + error = asio::error_code(); + bytes_transferred = asio::write(s, sb, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(write_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); ASIO_CHECK(!error); @@ -1610,13 +2161,9 @@ void async_write_handler(const asio::error_code& e, void test_3_arg_const_buffer_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -1665,13 +2212,9 @@ void test_3_arg_const_buffer_async_write() void test_3_arg_mutable_buffer_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -1720,13 +2263,9 @@ void test_3_arg_mutable_buffer_async_write() void test_3_arg_boost_array_buffers_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; #if defined(ASIO_HAS_BOOST_ARRAY) asio::io_context ioc; @@ -1778,15 +2317,10 @@ void test_3_arg_boost_array_buffers_async_write() void test_3_arg_std_array_buffers_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; -#if defined(ASIO_HAS_STD_ARRAY) asio::io_context ioc; test_stream s(ioc); std::array<asio::const_buffer, 2> buffers = { { @@ -1831,24 +2365,20 @@ void test_3_arg_std_array_buffers_async_write() ioc.restart(); ioc.run(); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); -#endif // defined(ASIO_HAS_STD_ARRAY) } void test_3_arg_vector_buffers_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); std::vector<asio::const_buffer> buffers; buffers.push_back(asio::buffer(write_data, 32)); - buffers.push_back(asio::buffer(write_data) + 32); + buffers.push_back(asio::buffer(write_data, 39) + 32); + buffers.push_back(asio::buffer(write_data) + 39); s.reset(); bool called = false; @@ -1890,15 +2420,71 @@ void test_3_arg_vector_buffers_async_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); } +void test_3_arg_dynamic_string_async_write() +{ + namespace bindns = std; + using bindns::placeholders::_1; + using bindns::placeholders::_2; + + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(write_data)); + asio::const_buffer buffers + = asio::buffer(write_data, sizeof(write_data)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bool called = false; + asio::async_write(s, sb, + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + called = false; + asio::async_write(s, sb, + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + called = false; + asio::async_write(s, sb, + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + int i = asio::async_write(s, sb, archetypes::lazy_handler()); + ASIO_CHECK(i == 42); + ioc.restart(); + ioc.run(); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); +} + void test_3_arg_streambuf_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) +#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -1952,17 +2538,14 @@ void test_3_arg_streambuf_async_write() ioc.restart(); ioc.run(); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); +#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1) } void test_4_arg_const_buffer_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -2227,7 +2810,7 @@ void test_4_arg_const_buffer_async_write() s.reset(); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -2238,7 +2821,7 @@ void test_4_arg_const_buffer_async_write() s.reset(); s.next_write_length(1); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -2249,7 +2832,7 @@ void test_4_arg_const_buffer_async_write() s.reset(); s.next_write_length(10); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -2258,7 +2841,7 @@ void test_4_arg_const_buffer_async_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); - int i = asio::async_write(s, buffers, short_transfer, + int i = asio::async_write(s, buffers, short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); @@ -2268,13 +2851,9 @@ void test_4_arg_const_buffer_async_write() void test_4_arg_mutable_buffer_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -2539,7 +3118,7 @@ void test_4_arg_mutable_buffer_async_write() s.reset(); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(mutable_write_data), &called)); ioc.restart(); @@ -2550,7 +3129,7 @@ void test_4_arg_mutable_buffer_async_write() s.reset(); s.next_write_length(1); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(mutable_write_data), &called)); ioc.restart(); @@ -2561,7 +3140,7 @@ void test_4_arg_mutable_buffer_async_write() s.reset(); s.next_write_length(10); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(mutable_write_data), &called)); ioc.restart(); @@ -2570,7 +3149,7 @@ void test_4_arg_mutable_buffer_async_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data))); s.reset(); - int i = asio::async_write(s, buffers, short_transfer, + int i = asio::async_write(s, buffers, short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); @@ -2580,13 +3159,9 @@ void test_4_arg_mutable_buffer_async_write() void test_4_arg_boost_array_buffers_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; #if defined(ASIO_HAS_BOOST_ARRAY) asio::io_context ioc; @@ -2853,7 +3428,7 @@ void test_4_arg_boost_array_buffers_async_write() s.reset(); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -2864,7 +3439,7 @@ void test_4_arg_boost_array_buffers_async_write() s.reset(); s.next_write_length(1); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -2875,7 +3450,7 @@ void test_4_arg_boost_array_buffers_async_write() s.reset(); s.next_write_length(10); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -2884,7 +3459,7 @@ void test_4_arg_boost_array_buffers_async_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); - int i = asio::async_write(s, buffers, short_transfer, + int i = asio::async_write(s, buffers, short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); @@ -2895,15 +3470,10 @@ void test_4_arg_boost_array_buffers_async_write() void test_4_arg_std_array_buffers_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; -#if defined(ASIO_HAS_STD_ARRAY) asio::io_context ioc; test_stream s(ioc); std::array<asio::const_buffer, 2> buffers = { { @@ -3168,7 +3738,7 @@ void test_4_arg_std_array_buffers_async_write() s.reset(); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -3179,7 +3749,7 @@ void test_4_arg_std_array_buffers_async_write() s.reset(); s.next_write_length(1); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -3190,7 +3760,7 @@ void test_4_arg_std_array_buffers_async_write() s.reset(); s.next_write_length(10); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -3199,30 +3769,26 @@ void test_4_arg_std_array_buffers_async_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); - int i = asio::async_write(s, buffers, short_transfer, + int i = asio::async_write(s, buffers, short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); ioc.run(); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); -#endif // defined(ASIO_HAS_STD_ARRAY) } void test_4_arg_vector_buffers_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); std::vector<asio::const_buffer> buffers; buffers.push_back(asio::buffer(write_data, 32)); - buffers.push_back(asio::buffer(write_data) + 32); + buffers.push_back(asio::buffer(write_data, 39) + 32); + buffers.push_back(asio::buffer(write_data) + 39); s.reset(); bool called = false; @@ -3482,7 +4048,344 @@ void test_4_arg_vector_buffers_async_write() s.reset(); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, buffers, short_transfer(), + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + s.next_write_length(1); + called = false; + asio::async_write(s, buffers, short_transfer(), + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + s.next_write_length(10); + called = false; + asio::async_write(s, buffers, short_transfer(), + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + int i = asio::async_write(s, buffers, short_transfer(), + archetypes::lazy_handler()); + ASIO_CHECK(i == 42); + ioc.restart(); + ioc.run(); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); +} + +void test_4_arg_dynamic_string_async_write() +{ + namespace bindns = std; + using bindns::placeholders::_1; + using bindns::placeholders::_2; + + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(write_data)); + asio::const_buffer buffers + = asio::buffer(write_data, sizeof(write_data)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + bool called = false; + asio::async_write(s, sb, asio::transfer_all(), + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + called = false; + asio::async_write(s, sb, asio::transfer_all(), + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + called = false; + asio::async_write(s, sb, asio::transfer_all(), + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + called = false; + asio::async_write(s, sb, asio::transfer_at_least(1), + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + called = false; + asio::async_write(s, sb, asio::transfer_at_least(1), + bindns::bind(async_write_handler, + _1, _2, 1, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 1)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + called = false; + asio::async_write(s, sb, asio::transfer_at_least(1), + bindns::bind(async_write_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + called = false; + asio::async_write(s, sb, asio::transfer_at_least(10), + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + called = false; + asio::async_write(s, sb, asio::transfer_at_least(10), + bindns::bind(async_write_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + called = false; + asio::async_write(s, sb, asio::transfer_at_least(10), + bindns::bind(async_write_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + called = false; + asio::async_write(s, sb, asio::transfer_at_least(42), + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + called = false; + asio::async_write(s, sb, asio::transfer_at_least(42), + bindns::bind(async_write_handler, + _1, _2, 42, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 42)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + called = false; + asio::async_write(s, sb, asio::transfer_at_least(42), + bindns::bind(async_write_handler, + _1, _2, 50, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 50)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + called = false; + asio::async_write(s, sb, asio::transfer_exactly(1), + bindns::bind(async_write_handler, + _1, _2, 1, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 1)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + called = false; + asio::async_write(s, sb, asio::transfer_exactly(1), + bindns::bind(async_write_handler, + _1, _2, 1, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 1)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + called = false; + asio::async_write(s, sb, asio::transfer_exactly(1), + bindns::bind(async_write_handler, + _1, _2, 1, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 1)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + called = false; + asio::async_write(s, sb, asio::transfer_exactly(10), + bindns::bind(async_write_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + called = false; + asio::async_write(s, sb, asio::transfer_exactly(10), + bindns::bind(async_write_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + called = false; + asio::async_write(s, sb, asio::transfer_exactly(10), + bindns::bind(async_write_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 10)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + called = false; + asio::async_write(s, sb, asio::transfer_exactly(42), + bindns::bind(async_write_handler, + _1, _2, 42, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 42)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + called = false; + asio::async_write(s, sb, asio::transfer_exactly(42), + bindns::bind(async_write_handler, + _1, _2, 42, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 42)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + called = false; + asio::async_write(s, sb, asio::transfer_exactly(42), + bindns::bind(async_write_handler, + _1, _2, 42, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, 42)); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + called = false; + asio::async_write(s, sb, old_style_transfer_all, + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(1); + called = false; + asio::async_write(s, sb, old_style_transfer_all, + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + s.next_write_length(10); + called = false; + asio::async_write(s, sb, old_style_transfer_all, + bindns::bind(async_write_handler, + _1, _2, sizeof(write_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); + + s.reset(); + data.assign(write_data, sizeof(write_data)); + called = false; + asio::async_write(s, sb, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -3491,9 +4394,10 @@ void test_4_arg_vector_buffers_async_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); + data.assign(write_data, sizeof(write_data)); s.next_write_length(1); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, sb, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -3502,9 +4406,10 @@ void test_4_arg_vector_buffers_async_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); + data.assign(write_data, sizeof(write_data)); s.next_write_length(10); called = false; - asio::async_write(s, buffers, short_transfer, + asio::async_write(s, sb, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -3513,7 +4418,8 @@ void test_4_arg_vector_buffers_async_write() ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); s.reset(); - int i = asio::async_write(s, buffers, short_transfer, + data.assign(write_data, sizeof(write_data)); + int i = asio::async_write(s, sb, short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); @@ -3523,13 +4429,10 @@ void test_4_arg_vector_buffers_async_write() void test_4_arg_streambuf_async_write() { -#if defined(ASIO_HAS_BOOST_BIND) - namespace bindns = boost; -#else // defined(ASIO_HAS_BOOST_BIND) +#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; -#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -3845,7 +4748,7 @@ void test_4_arg_streambuf_async_write() sb.consume(sb.size()); sb.sputn(write_data, sizeof(write_data)); called = false; - asio::async_write(s, sb, short_transfer, + asio::async_write(s, sb, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -3858,7 +4761,7 @@ void test_4_arg_streambuf_async_write() sb.sputn(write_data, sizeof(write_data)); s.next_write_length(1); called = false; - asio::async_write(s, sb, short_transfer, + asio::async_write(s, sb, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -3871,7 +4774,7 @@ void test_4_arg_streambuf_async_write() sb.sputn(write_data, sizeof(write_data)); s.next_write_length(10); called = false; - asio::async_write(s, sb, short_transfer, + asio::async_write(s, sb, short_transfer(), bindns::bind(async_write_handler, _1, _2, sizeof(write_data), &called)); ioc.restart(); @@ -3882,12 +4785,13 @@ void test_4_arg_streambuf_async_write() s.reset(); sb.consume(sb.size()); sb.sputn(write_data, sizeof(write_data)); - int i = asio::async_write(s, sb, short_transfer, + int i = asio::async_write(s, sb, short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); ioc.run(); ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data))); +#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1) } ASIO_TEST_SUITE @@ -3897,26 +4801,32 @@ ASIO_TEST_SUITE ASIO_TEST_CASE(test_2_arg_const_buffer_write) ASIO_TEST_CASE(test_2_arg_mutable_buffer_write) ASIO_TEST_CASE(test_2_arg_vector_buffers_write) + ASIO_TEST_CASE(test_2_arg_dynamic_string_write) ASIO_TEST_CASE(test_3_arg_nothrow_zero_buffers_write) ASIO_TEST_CASE(test_3_arg_nothrow_const_buffer_write) ASIO_TEST_CASE(test_3_arg_nothrow_mutable_buffer_write) ASIO_TEST_CASE(test_3_arg_nothrow_vector_buffers_write) + ASIO_TEST_CASE(test_3_arg_nothrow_dynamic_string_write) ASIO_TEST_CASE(test_3_arg_const_buffer_write) ASIO_TEST_CASE(test_3_arg_mutable_buffer_write) ASIO_TEST_CASE(test_3_arg_vector_buffers_write) + ASIO_TEST_CASE(test_3_arg_dynamic_string_write) ASIO_TEST_CASE(test_4_arg_const_buffer_write) ASIO_TEST_CASE(test_4_arg_mutable_buffer_write) ASIO_TEST_CASE(test_4_arg_vector_buffers_write) + ASIO_TEST_CASE(test_4_arg_dynamic_string_write) ASIO_TEST_CASE(test_3_arg_const_buffer_async_write) ASIO_TEST_CASE(test_3_arg_mutable_buffer_async_write) ASIO_TEST_CASE(test_3_arg_boost_array_buffers_async_write) ASIO_TEST_CASE(test_3_arg_std_array_buffers_async_write) ASIO_TEST_CASE(test_3_arg_vector_buffers_async_write) + ASIO_TEST_CASE(test_3_arg_dynamic_string_async_write) ASIO_TEST_CASE(test_3_arg_streambuf_async_write) ASIO_TEST_CASE(test_4_arg_const_buffer_async_write) ASIO_TEST_CASE(test_4_arg_mutable_buffer_async_write) ASIO_TEST_CASE(test_4_arg_boost_array_buffers_async_write) ASIO_TEST_CASE(test_4_arg_std_array_buffers_async_write) ASIO_TEST_CASE(test_4_arg_vector_buffers_async_write) + ASIO_TEST_CASE(test_4_arg_dynamic_string_async_write) ASIO_TEST_CASE(test_4_arg_streambuf_async_write) ) |