diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-06-17 20:14:45 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-06-17 20:14:45 +0200 |
| commit | 6dc9508bf13d78a990a36b2b43e9fa498ddbe228 (patch) | |
| tree | dbe2d38519a59ce1a4aa42573fa0f73e926ce6a8 | |
| parent | e515781907e4d6c99a7d71114f39f1e0a1ffa995 (diff) | |
| download | ttwhy-6dc9508bf13d78a990a36b2b43e9fa498ddbe228.tar.xz ttwhy-6dc9508bf13d78a990a36b2b43e9fa498ddbe228.zip | |
lib: optimize buffer allocation
| -rw-r--r-- | ttwhy/io.cppm | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/ttwhy/io.cppm b/ttwhy/io.cppm index cbd3902..353bdfa 100644 --- a/ttwhy/io.cppm +++ b/ttwhy/io.cppm @@ -27,11 +27,9 @@ namespace ttwhy::io } export template<typename InputStream, typename ErrorStream> - auto read(InputStream & input_stream, ErrorStream & error_stream) - -> asio::awaitable<std::expected<std::string, asio::error_code>> + auto read(std::span<char> data, InputStream & input_stream, ErrorStream & error_stream) + -> asio::awaitable<std::expected<std::size_t, asio::error_code>> { - auto data = std::string{15, '\0'}; - auto [error, read] = co_await input_stream.async_read_some(asio::buffer(data), asio::as_tuple(asio::use_awaitable)); if (error) @@ -41,12 +39,11 @@ namespace ttwhy::io co_return std::unexpected{error}; } - data.resize(read); - co_return data; + co_return read; } export template<typename OutputStream, typename ErrorStream> - auto write(std::string const & string, OutputStream & output_stream, ErrorStream & error_stream) + auto write(std::span<char const> string, OutputStream & output_stream, ErrorStream & error_stream) -> asio::awaitable<asio::error_code> { auto [error, written] = @@ -65,15 +62,18 @@ namespace ttwhy::io auto echo(InputStream & input_stream, OutputStream & output_stream, ErrorStream & error_stream) -> asio::awaitable<asio::error_code> { + auto input = std::array<char, 16>{}; + while (true) { - auto input = co_await read(input_stream, error_stream); - if (!input.has_value()) + auto read_result = co_await read(input, input_stream, error_stream); + if (!read_result.has_value()) { - co_return input.error(); + co_return read_result.error(); } - auto write_error = co_await write(input.value(), output_stream, error_stream); + auto to_write = std::span{input.data(), read_result.value()}; + auto write_error = co_await write(to_write, output_stream, error_stream); if (write_error) { co_return write_error; |
