diff options
| author | briaguya <70942617+briaguya-ai@users.noreply.github.com> | 2024-05-01 22:25:33 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-01 22:25:33 -0400 |
| commit | 222cb8a23bd0fa8b901b1654ac5d6cc2ecb25a2e (patch) | |
| tree | 41d4324876aa3c0c296a83a5a87910220919b0a9 /ZAPD/Utils/MemoryStream.cpp | |
| parent | 9f9d0be3c914354ecabab3695581f1123c13ac20 (diff) | |
detangle utils (#21)
Diffstat (limited to 'ZAPD/Utils/MemoryStream.cpp')
| -rw-r--r-- | ZAPD/Utils/MemoryStream.cpp | 97 |
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 |
