From 102fdf630544cc3d28d9db67c13e0c879baaa9d8 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Tue, 6 Jun 2023 13:52:56 -0400 Subject: [PATCH] AK: Override `read_until_filled` in `FixedMemoryStream` This specialized method allow significant performance improvements for the user. --- AK/MemoryStream.cpp | 11 +++++++++++ AK/MemoryStream.h | 1 + 2 files changed, 12 insertions(+) diff --git a/AK/MemoryStream.cpp b/AK/MemoryStream.cpp index 19448bfbbe..1f92e9146d 100644 --- a/AK/MemoryStream.cpp +++ b/AK/MemoryStream.cpp @@ -54,6 +54,17 @@ ErrorOr FixedMemoryStream::read_some(Bytes bytes) return bytes.trim(to_read); } +ErrorOr FixedMemoryStream::read_until_filled(AK::Bytes bytes) +{ + if (remaining() < bytes.size()) + return Error::from_string_view_or_print_error_and_return_errno("Can't read past the end of the stream memory"sv, EINVAL); + + m_bytes.slice(m_offset).copy_trimmed_to(bytes); + m_offset += bytes.size(); + + return {}; +} + ErrorOr FixedMemoryStream::seek(i64 offset, SeekMode seek_mode) { switch (seek_mode) { diff --git a/AK/MemoryStream.h b/AK/MemoryStream.h index f069b222a3..7a9ce7d8ec 100644 --- a/AK/MemoryStream.h +++ b/AK/MemoryStream.h @@ -24,6 +24,7 @@ public: virtual void close() override; virtual ErrorOr truncate(size_t) override; virtual ErrorOr read_some(Bytes bytes) override; + virtual ErrorOr read_until_filled(Bytes bytes) override; virtual ErrorOr seek(i64 offset, SeekMode seek_mode = SeekMode::SetPosition) override;