mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
155 lines
No EOL
2.3 KiB
C++
155 lines
No EOL
2.3 KiB
C++
#include "MemStream.h"
|
|
|
|
USING_NS_BF;
|
|
|
|
MemStream* MemStream::CreateWithDuplicate(void* data, int size)
|
|
{
|
|
uint8* newData = new uint8[size];
|
|
memcpy(newData, data, size);
|
|
MemStream* memStream = new MemStream(newData, size, true);
|
|
return memStream;
|
|
}
|
|
|
|
MemStream* MemStream::CreateWithOwnershipTaken(void* data, int size)
|
|
{
|
|
return new MemStream(data, size, true);
|
|
}
|
|
|
|
MemStream* MemStream::CreateWithNoCopy(void* data, int size)
|
|
{
|
|
return new MemStream(data, size, false);
|
|
}
|
|
|
|
MemStream::MemStream(void* data, int size, bool freeMemory)
|
|
{
|
|
mData = (uint8*) data;
|
|
mSize = size;
|
|
mPos = 0;
|
|
mFreeMemory = freeMemory;
|
|
}
|
|
|
|
MemStream::~MemStream()
|
|
{
|
|
if (mFreeMemory)
|
|
delete mData;
|
|
}
|
|
|
|
bool MemStream::Eof()
|
|
{
|
|
return mPos >= mSize;
|
|
}
|
|
|
|
int MemStream::GetSize()
|
|
{
|
|
return mSize;
|
|
}
|
|
|
|
void MemStream::Read(void* ptr, int size)
|
|
{
|
|
memcpy(ptr, mData + mPos, size);
|
|
mPos += size;
|
|
}
|
|
|
|
|
|
void Beefy::MemStream::Write(void* ptr, int size)
|
|
{
|
|
memcpy(mData + mPos, ptr, size);
|
|
mPos += size;
|
|
}
|
|
|
|
int MemStream::GetPos()
|
|
{
|
|
return mPos;
|
|
}
|
|
|
|
void MemStream::Seek(int size)
|
|
{
|
|
mPos += size;
|
|
}
|
|
|
|
void MemStream::SetPos(int pos)
|
|
{
|
|
mPos = pos;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
SafeMemStream::SafeMemStream(void* data, int size, bool freeMemory) : MemStream(data, size, freeMemory)
|
|
{
|
|
mFailed = false;
|
|
}
|
|
|
|
void SafeMemStream::Read(void* ptr, int size)
|
|
{
|
|
if (mPos + size > mSize)
|
|
{
|
|
mFailed = true;
|
|
memset(ptr, 0, size);
|
|
}
|
|
else
|
|
{
|
|
memcpy(ptr, mData + mPos, size);
|
|
}
|
|
mPos += size;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
DynMemStream::DynMemStream()
|
|
{
|
|
mPos = 0;
|
|
}
|
|
|
|
bool DynMemStream::Eof()
|
|
{
|
|
return mPos >= (int)mData.size();
|
|
}
|
|
|
|
int DynMemStream::GetSize()
|
|
{
|
|
return (int)mData.size();
|
|
}
|
|
|
|
void DynMemStream::Read(void* ptr, int size)
|
|
{
|
|
memcpy(ptr, (uint8*)&mData.front() + mPos, size);
|
|
mPos += size;
|
|
}
|
|
|
|
void DynMemStream::Write(void* ptr, int size)
|
|
{
|
|
mData.Insert(mPos, (uint8*)ptr, size);
|
|
mPos += size;
|
|
}
|
|
|
|
void DynMemStream::Write(uint8 val)
|
|
{
|
|
mData.push_back(val);
|
|
mPos++;
|
|
}
|
|
|
|
int DynMemStream::GetPos()
|
|
{
|
|
return mPos;
|
|
}
|
|
|
|
void DynMemStream::Seek(int size)
|
|
{
|
|
mPos += size;
|
|
}
|
|
|
|
void DynMemStream::SetPos(int pos)
|
|
{
|
|
mPos = pos;
|
|
}
|
|
|
|
void DynMemStream::Clear()
|
|
{
|
|
mPos = 0;
|
|
mData.Clear();
|
|
}
|
|
|
|
void* DynMemStream::GetPtr()
|
|
{
|
|
return &mData[0];
|
|
} |