summaryrefslogtreecommitdiff
path: root/ZAPD/Utils/MemoryStream.cpp
diff options
context:
space:
mode:
authorbriaguya <70942617+briaguya-ai@users.noreply.github.com>2024-05-01 22:25:33 -0400
committerGitHub <noreply@github.com>2024-05-01 22:25:33 -0400
commit222cb8a23bd0fa8b901b1654ac5d6cc2ecb25a2e (patch)
tree41d4324876aa3c0c296a83a5a87910220919b0a9 /ZAPD/Utils/MemoryStream.cpp
parent9f9d0be3c914354ecabab3695581f1123c13ac20 (diff)
detangle utils (#21)
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