mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-06-05 22:23:34 +00:00
156 lines
2.7 KiB
C++
156 lines
2.7 KiB
C++
#include "CVectorOutStream.h"
|
|
|
|
CVectorOutStream::CVectorOutStream()
|
|
{
|
|
mDataEndianness = IOUtil::eBigEndian;
|
|
mpVector = new std::vector<char>;
|
|
mOwnsVector = true;
|
|
mPos = 0;
|
|
mUsed = 0;
|
|
}
|
|
|
|
CVectorOutStream::CVectorOutStream(IOUtil::EEndianness DataEndianness)
|
|
{
|
|
mDataEndianness = DataEndianness;
|
|
mpVector = new std::vector<char>;
|
|
mOwnsVector = true;
|
|
mPos = 0;
|
|
mUsed = 0;
|
|
}
|
|
|
|
CVectorOutStream::CVectorOutStream(unsigned long InitialSize, IOUtil::EEndianness DataEndianness)
|
|
{
|
|
mDataEndianness = DataEndianness;
|
|
mpVector = new std::vector<char>(InitialSize);
|
|
mOwnsVector = true;
|
|
mPos = 0;
|
|
mUsed = 0;
|
|
}
|
|
|
|
CVectorOutStream::CVectorOutStream(std::vector<char> *pVector, IOUtil::EEndianness DataEndianness)
|
|
{
|
|
mDataEndianness = DataEndianness;
|
|
mpVector = pVector;
|
|
mOwnsVector = false;
|
|
mPos = 0;
|
|
mUsed = 0;
|
|
}
|
|
|
|
CVectorOutStream::~CVectorOutStream()
|
|
{
|
|
if (mOwnsVector) delete mpVector;
|
|
}
|
|
|
|
void CVectorOutStream::WriteBytes(void *pSrc, unsigned long Count)
|
|
{
|
|
if (!IsValid()) return;
|
|
|
|
if ((mPos + Count) > mpVector->size())
|
|
mpVector->resize(mPos + Count);
|
|
|
|
memcpy(mpVector->data() + mPos, pSrc, Count);
|
|
mPos += Count;
|
|
if (mPos > mUsed) mUsed = mPos;
|
|
}
|
|
|
|
bool CVectorOutStream::Seek(long Offset, long Origin)
|
|
{
|
|
if (!IsValid()) return false;
|
|
|
|
switch (Origin)
|
|
{
|
|
case SEEK_SET:
|
|
mPos = Offset;
|
|
break;
|
|
|
|
case SEEK_CUR:
|
|
mPos += Offset;
|
|
break;
|
|
|
|
case SEEK_END:
|
|
mPos = mUsed - Offset;
|
|
break;
|
|
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
if (mPos < 0) {
|
|
mPos = 0;
|
|
return false;
|
|
}
|
|
|
|
if (mPos > mUsed)
|
|
mUsed = mPos;
|
|
|
|
if (mPos > (signed long) mpVector->size())
|
|
mpVector->resize(mPos);
|
|
|
|
return true;
|
|
}
|
|
|
|
long CVectorOutStream::Tell() const
|
|
{
|
|
return mPos;
|
|
}
|
|
|
|
bool CVectorOutStream::EoF() const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool CVectorOutStream::IsValid() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
long CVectorOutStream::Size() const
|
|
{
|
|
return mUsed;
|
|
}
|
|
|
|
long CVectorOutStream::SizeRemaining() const
|
|
{
|
|
return mpVector->size() - mPos;
|
|
}
|
|
|
|
void CVectorOutStream::SetVector(std::vector<char> *pVector)
|
|
{
|
|
if (mOwnsVector) delete mpVector;
|
|
mpVector = pVector;
|
|
mPos = 0;
|
|
mUsed = 0;
|
|
}
|
|
|
|
void* CVectorOutStream::Data()
|
|
{
|
|
return mpVector->data();
|
|
}
|
|
|
|
void* CVectorOutStream::DataAtPosition()
|
|
{
|
|
return mpVector->data() + mPos;
|
|
}
|
|
|
|
void CVectorOutStream::Expand(unsigned long Amount)
|
|
{
|
|
mpVector->resize(mpVector->size() + Amount);
|
|
}
|
|
|
|
void CVectorOutStream::Shrink()
|
|
{
|
|
mpVector->resize(mUsed);
|
|
}
|
|
|
|
void CVectorOutStream::Reset()
|
|
{
|
|
mPos = 0;
|
|
mUsed = 0;
|
|
}
|
|
|
|
void CVectorOutStream::Clear()
|
|
{
|
|
mpVector->clear();
|
|
Reset();
|
|
}
|