diff options
Diffstat (limited to 'include/cru/common')
-rw-r--r-- | include/cru/common/Buffer.h | 89 |
1 files changed, 76 insertions, 13 deletions
diff --git a/include/cru/common/Buffer.h b/include/cru/common/Buffer.h index 5390ebb4..1fc894ae 100644 --- a/include/cru/common/Buffer.h +++ b/include/cru/common/Buffer.h @@ -2,8 +2,10 @@ #include "Base.h" +#include <list> + namespace cru { -class Buffer { +class Buffer final { public: explicit Buffer(Index size); @@ -16,22 +18,74 @@ class Buffer { ~Buffer(); private: - Index GetSize() const; - Index GetUsedSize() const; - bool IsFull() const { return GetSize() == GetUsedSize(); } - bool IsNotFull() const { return !IsFull(); } + Index GetBufferSize() const { return size_; } + Index GetUsedSize() const { return used_size_; } + Index GetRestSize() const { return GetBufferSize() - GetUsedSize(); } + bool IsNull() const { return ptr_ == nullptr; } + bool IsFull() const { return GetBufferSize() == GetUsedSize(); } + + std::byte* GetPtr() { return GetPtrAt(0); } + const std::byte* GetPtr() const { return GetPtrAt(0); } + + std::byte* GetPtrAt(Index index) { return ptr_ + index; } + const std::byte* GetPtrAt(Index index) const { return ptr_ + index; } + + std::byte& GetRefAt(Index index) { return *GetPtrAt(index); } + const std::byte& GetRefAt(Index index) const { return *GetPtrAt(index); } + + std::byte* GetUsedEndPtr() { return GetPtrAt(GetUsedSize()); } + const std::byte* GetUsedEndPtr() const { return GetPtrAt(GetUsedSize()); } + + std::byte GetByteAt(Index index) const { return ptr_[index]; } + void SetByteAt(Index index, std::byte value) { ptr_[index] = value; } + + void AssignBytes(std::byte* src, Index src_size) { + return AssignBytes(0, src, 0, src_size); + } + void AssignBytes(Index dst_offset, std::byte* src, Index src_size) { + return AssignBytes(dst_offset, src, 0, src_size); + } + void AssignBytes(Index dst_offset, std::byte* src, Index src_offset, + Index src_size); + + void SetUsedSize(Index new_size); - std::byte& GetAt(Index index); - std::byte GetAt(Index index) const; + /** + * @brief Change the size of the buffer. + * + * Unless new size is the same as current size, the buffer is always released + * and a new one is allocated. If preserve_used is true, the used size and old + * data is copied to the new buffer. If new size is smaller than old used + * size, then exceeded data will be lost. + */ + void ResizeBuffer(Index new_size, bool preserve_used); + /** + * @brief Append data to the back of used bytes and increase used size. + * @return The actual size of data saved. + * + * If there is no enough space left for new data, the rest space will be + * written and the size of it will be returned, leaving exceeded data not + * saved. + */ Index PushEnd(std::byte* other, Index other_size); + + /** + * @brief Decrease used data size. + * @return The actual size decreased. + * + * If given size is bigger than current used size, the used size will be + * returned and set to 0. + */ Index PopEnd(Index size); - std::byte* Data(); - const std::byte* Data() const; + operator std::byte*() { return GetPtr(); } + operator const std::byte*() const { return GetPtr(); } - operator std::byte*() { return Data(); } - operator const std::byte*() const { return Data(); } + private: + void Copy_(const Buffer& other); + void Move_(Buffer&& other) noexcept; + void Delete_() noexcept; private: std::byte* ptr_; @@ -42,9 +96,18 @@ class Buffer { void swap(Buffer& left, Buffer& right); class BufferList { - public: + public: explicit BufferList(Index buffer_size); - private: + BufferList(const BufferList& other); + BufferList(BufferList&& other); + + BufferList& operator=(const BufferList& other); + BufferList& operator=(BufferList&& other); + + ~BufferList(); + + private: + std::list<Buffer> buffers_; }; } // namespace cru |