aboutsummaryrefslogtreecommitdiff
path: root/src/base/io/MemoryStream.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2024-10-06 13:57:39 +0800
committercrupest <crupest@outlook.com>2024-10-06 13:57:39 +0800
commitdfe62dcf8bcefc523b466e127c3edc4dc2756629 (patch)
tree1c751a14ba0da07ca2ff805633f97568060aa4c9 /src/base/io/MemoryStream.cpp
parentf51eb955e188858272230a990565931e7403f23b (diff)
downloadcru-dfe62dcf8bcefc523b466e127c3edc4dc2756629.tar.gz
cru-dfe62dcf8bcefc523b466e127c3edc4dc2756629.tar.bz2
cru-dfe62dcf8bcefc523b466e127c3edc4dc2756629.zip
Rename common to base.
Diffstat (limited to 'src/base/io/MemoryStream.cpp')
-rw-r--r--src/base/io/MemoryStream.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/base/io/MemoryStream.cpp b/src/base/io/MemoryStream.cpp
new file mode 100644
index 00000000..4c650f3e
--- /dev/null
+++ b/src/base/io/MemoryStream.cpp
@@ -0,0 +1,74 @@
+#include "cru/base/io/MemoryStream.h"
+
+#include <cstring>
+#include "cru/base/Exception.h"
+#include "cru/base/io/Stream.h"
+
+namespace cru::io {
+MemoryStream::MemoryStream(
+ std::byte* buffer, Index size, bool read_only,
+ std::function<void(std::byte* buffer, Index size)> release_func)
+ : Stream(true, true, !read_only),
+ buffer_(buffer),
+ size_(size),
+ position_(0),
+ release_func_(std::move(release_func)) {
+ if (!buffer) {
+ throw Exception(u"Buffer is nullptr");
+ }
+ if (size <= 0) {
+ throw Exception(u"Size is 0 or negative.");
+ }
+}
+
+MemoryStream::~MemoryStream() {}
+
+void MemoryStream::Close() { DoClose(); }
+
+Index MemoryStream::DoSeek(Index offset, SeekOrigin origin) {
+ switch (origin) {
+ case SeekOrigin::Current:
+ position_ += offset;
+ break;
+ case SeekOrigin::Begin:
+ position_ = offset;
+ break;
+ case SeekOrigin::End:
+ position_ = size_ + offset;
+ break;
+ }
+ return position_;
+}
+
+Index MemoryStream::DoRead(std::byte* buffer, Index offset, Index size) {
+ if (position_ + size > size_) {
+ size = size_ - position_;
+ }
+ if (size <= 0) {
+ return 0;
+ }
+ std::memmove(buffer + offset, buffer_ + position_, size);
+ position_ += size;
+ return size;
+}
+
+Index MemoryStream::DoWrite(const std::byte* buffer, Index offset, Index size) {
+ if (position_ + size > size_) {
+ size = size_ - position_;
+ }
+ if (size <= 0) {
+ return 0;
+ }
+ std::memmove(buffer_ + position_, buffer + offset, size);
+ position_ += size;
+ return size;
+}
+
+void MemoryStream::DoClose() {
+ CRU_STREAM_BEGIN_CLOSE
+ release_func_(buffer_, size_);
+ buffer_ = nullptr;
+ release_func_ = {};
+}
+
+} // namespace cru::io