aboutsummaryrefslogtreecommitdiff
path: root/ttwhy
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2026-06-17 20:14:45 +0200
committerFelix Morgner <felix.morgner@gmail.com>2026-06-17 20:14:45 +0200
commit6dc9508bf13d78a990a36b2b43e9fa498ddbe228 (patch)
treedbe2d38519a59ce1a4aa42573fa0f73e926ce6a8 /ttwhy
parente515781907e4d6c99a7d71114f39f1e0a1ffa995 (diff)
downloadttwhy-6dc9508bf13d78a990a36b2b43e9fa498ddbe228.tar.xz
ttwhy-6dc9508bf13d78a990a36b2b43e9fa498ddbe228.zip
lib: optimize buffer allocation
Diffstat (limited to 'ttwhy')
-rw-r--r--ttwhy/io.cppm22
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;