summaryrefslogtreecommitdiff
path: root/ZAPD/Utils/MemoryStream.cpp
diff options
context:
space:
mode:
authorAdam Bird <archez39@me.com>2024-05-03 01:51:24 -0400
committerAdam Bird <archez39@me.com>2024-05-03 01:51:24 -0400
commit4b6efa9c20a448e73949eda87864faa79ebbfb1b (patch)
tree47cc59cfa6ddcd778babb723bdc8d4975ee57145 /ZAPD/Utils/MemoryStream.cpp
parentdcf264b8e8979a21756a13998af78f2d5a9672e1 (diff)
parent97f3ea6a7be5953d3514b7ce347c61cbe9b36d98 (diff)
Merge remote-tracking branch 'upstream/master' into merge-upstream
Diffstat (limited to 'ZAPD/Utils/MemoryStream.cpp')
-rw-r--r--ZAPD/Utils/MemoryStream.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/ZAPD/Utils/MemoryStream.cpp b/ZAPD/Utils/MemoryStream.cpp
new file mode 100644
index 0000000..1c70c00
--- /dev/null
+++ b/ZAPD/Utils/MemoryStream.cpp
@@ -0,0 +1,97 @@
+#include "MemoryStream.h"
+#include <cstring>
+
+#ifndef _MSC_VER
+#define memcpy_s(dest, destSize, source, sourceSize) memcpy(dest, source, destSize)
+#endif
+
+MemoryStream::MemoryStream()
+{
+ buffer = std::vector<char>();
+ //buffer.reserve(1024 * 16);
+ bufferSize = 0;
+ baseAddress = 0;
+}
+
+MemoryStream::MemoryStream(char* nBuffer, size_t nBufferSize) : MemoryStream()
+{
+ buffer = std::vector<char>(nBuffer, nBuffer + nBufferSize);
+ bufferSize = nBufferSize;
+ baseAddress = 0;
+}
+
+MemoryStream::~MemoryStream()
+{
+}
+
+uint64_t MemoryStream::GetLength()
+{
+ return buffer.size();
+}
+
+void MemoryStream::Seek(int32_t offset, SeekOffsetType seekType)
+{
+ if (seekType == SeekOffsetType::Start)
+ baseAddress = offset;
+ else if (seekType == SeekOffsetType::Current)
+ baseAddress += offset;
+ else if (seekType == SeekOffsetType::End)
+ baseAddress = bufferSize - 1 - offset;
+}
+
+std::unique_ptr<char[]> MemoryStream::Read(size_t length)
+{
+ std::unique_ptr<char[]> result = std::make_unique<char[]>(length);
+
+ memcpy_s(result.get(), length, &buffer[baseAddress], length);
+ baseAddress += length;
+
+ return result;
+}
+
+void MemoryStream::Read(const char* dest, size_t length)
+{
+ memcpy_s((void*)dest, length, &buffer[baseAddress], length);
+ baseAddress += length;
+}
+
+int8_t MemoryStream::ReadByte()
+{
+ return buffer[baseAddress++];
+}
+
+void MemoryStream::Write(char* srcBuffer, size_t length)
+{
+ if (baseAddress + length >= buffer.size())
+ {
+ buffer.resize(baseAddress + length);
+ bufferSize += length;
+ }
+
+ memcpy_s(&buffer[baseAddress], length, srcBuffer, length);
+ baseAddress += length;
+}
+
+void MemoryStream::WriteByte(int8_t value)
+{
+ if (baseAddress >= buffer.size())
+ {
+ buffer.resize(baseAddress + 1);
+ bufferSize = baseAddress;
+ }
+
+ buffer[baseAddress++] = value;
+}
+
+std::vector<char> MemoryStream::ToVector()
+{
+ return buffer;
+}
+
+void MemoryStream::Flush()
+{
+}
+
+void MemoryStream::Close()
+{
+} \ No newline at end of file