From b05c7d76dcfef6d882bc01fea4663a4c2fcdcdf2 Mon Sep 17 00:00:00 2001 From: crupest Date: Sun, 12 May 2024 00:19:16 +0800 Subject: feat: completed BufferStream. NEED TEST: BufferStream. --- include/cru/common/Buffer.h | 3 +++ include/cru/common/io/BufferStream.h | 20 +++++++++----------- 2 files changed, 12 insertions(+), 11 deletions(-) (limited to 'include') diff --git a/include/cru/common/Buffer.h b/include/cru/common/Buffer.h index 69c47aff..5c1f7ba3 100644 --- a/include/cru/common/Buffer.h +++ b/include/cru/common/Buffer.h @@ -23,6 +23,9 @@ class Buffer final { bool IsNull() const { return ptr_ == nullptr; } bool IsUsedReachEnd() const { return used_end_ == size_; } + Index GetFrontFree() const { return used_begin_; } + Index GetBackFree() const { return size_ - used_end_; } + Index GetUsedBegin() const { return used_begin_; } Index GetUsedEnd() const { return used_end_; } diff --git a/include/cru/common/io/BufferStream.h b/include/cru/common/io/BufferStream.h index a95b3487..b3a5e9d1 100644 --- a/include/cru/common/io/BufferStream.h +++ b/include/cru/common/io/BufferStream.h @@ -31,13 +31,18 @@ struct BufferStreamOptions { * @brief Total size limit of saved data in buffer. Use default value if < 0. * No limit if == 0. * - * The size will be ceil(total_size_limit / block_size). When the buffer is + * The size will be floor(total_size_limit / block_size). When the buffer is * filled, it will block and wait for user to read to get free space of buffer * to continue read. */ Index total_size_limit = 0; }; +/** + * @brief SPSC (Single Producer Single Consumer) buffer stream. + * + * If used by multiple producer or multiple consumer, the behavior is undefined. + */ class BufferStream : public Stream { public: /** @@ -50,7 +55,7 @@ class BufferStream : public Stream { * Actually I have no ideas about the best value for this. May change it later * when I get some ideas. */ - constexpr static Index kDefaultTotalSizeLimit = 1024; + constexpr static Index kDefaultTotalSizeLimit = 1024 * 1024; public: BufferStream(const BufferStreamOptions& options); @@ -63,18 +68,11 @@ class BufferStream : public Stream { bool CanRead() override; Index Read(std::byte* buffer, Index offset, Index size) override; - bool CanWrite() = 0; - Index Write(const std::byte* buffer, Index offset, Index size) = 0; - - virtual void Flush(); - - virtual void Close(); + bool CanWrite() override; + Index Write(const std::byte* buffer, Index offset, Index size) override; void SetEof(); - private: - bool CheckClosed(); - private: Index block_size_; Index total_size_limit_; -- cgit v1.2.3