aboutsummaryrefslogtreecommitdiff
path: root/src/common/Buffer.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2024-05-12 00:19:16 +0800
committercrupest <crupest@outlook.com>2024-05-12 00:19:16 +0800
commitd861d799d2f614a6b58a8f0c0bc6a8911ad0dcfd (patch)
treeadfe4096c07d7bf039b52d3d21d8ef742c8da837 /src/common/Buffer.cpp
parentdd62b63e1c577abe53d0f9cabe8e9a635c4c8fcf (diff)
downloadcru-d861d799d2f614a6b58a8f0c0bc6a8911ad0dcfd.tar.gz
cru-d861d799d2f614a6b58a8f0c0bc6a8911ad0dcfd.tar.bz2
cru-d861d799d2f614a6b58a8f0c0bc6a8911ad0dcfd.zip
WORKING: fix Buffer and implement BufferStream::Read.
Diffstat (limited to 'src/common/Buffer.cpp')
-rw-r--r--src/common/Buffer.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/common/Buffer.cpp b/src/common/Buffer.cpp
index 00bbd166..67e67735 100644
--- a/src/common/Buffer.cpp
+++ b/src/common/Buffer.cpp
@@ -76,7 +76,8 @@ void Buffer::ResizeBuffer(Index new_size, bool preserve_used) {
}
}
-Index Buffer::PushFront(std::byte* other, Index other_size, bool use_memmove) {
+Index Buffer::PushFront(const std::byte* other, Index other_size,
+ bool use_memmove) {
auto copy_size = std::min(used_begin_, other_size);
if (copy_size) {
@@ -88,7 +89,8 @@ Index Buffer::PushFront(std::byte* other, Index other_size, bool use_memmove) {
return copy_size;
}
-Index Buffer::PushBack(std::byte* other, Index other_size, bool use_memmove) {
+Index Buffer::PushBack(const std::byte* other, Index other_size,
+ bool use_memmove) {
auto copy_size = std::min(size_ - used_end_, other_size);
if (copy_size) {
@@ -106,12 +108,36 @@ Index Buffer::PopFront(Index size) {
return move;
}
+Index Buffer::PopFront(std::byte* buffer, Index size, bool use_memmove) {
+ auto pop_size = std::min(GetUsedSize(), size);
+
+ if (pop_size) {
+ used_begin_ += pop_size;
+ (use_memmove ? std::memmove : std::memcpy)(
+ buffer, GetUsedBeginPtr() - pop_size, pop_size);
+ }
+
+ return pop_size;
+}
+
Index Buffer::PopEnd(Index size) {
auto move = std::min(size_ - used_end_, size);
used_end_ += move;
return move;
}
+Index Buffer::PopEnd(std::byte* buffer, Index size, bool use_memmove) {
+ auto pop_size = std::min(GetUsedSize(), size);
+
+ if (pop_size) {
+ used_end_ -= pop_size;
+ (use_memmove ? std::memmove : std::memcpy)(buffer, GetUsedEndPtr(),
+ pop_size);
+ }
+
+ return pop_size;
+}
+
void Buffer::Copy_(const Buffer& other) {
if (other.ptr_ == nullptr) {
ptr_ = nullptr;