summaryrefslogtreecommitdiff
path: root/ZAPDUtils/Utils/MemoryStream.cpp
blob: 1c70c007fd8ee798d939ba833be0d4308b18eeda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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()
{
}