2015-08-08 17:21:50 +02:00
|
|
|
/*
|
|
|
|
* CMemoryBuffer.cpp, part of VCMI engine
|
|
|
|
*
|
|
|
|
* Authors: listed in file AUTHORS in main folder
|
|
|
|
*
|
|
|
|
* License: GNU General Public License v2.0 or later
|
|
|
|
* Full text of license available in license.txt file, in main folder
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "StdInc.h"
|
|
|
|
#include "CMemoryBuffer.h"
|
|
|
|
|
2022-07-26 15:07:42 +02:00
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
|
2015-08-08 17:21:50 +02:00
|
|
|
///CMemoryBuffer
|
|
|
|
CMemoryBuffer::CMemoryBuffer():
|
|
|
|
position(0)
|
|
|
|
{
|
2015-08-13 23:16:31 +02:00
|
|
|
buffer.reserve(4096);
|
2015-08-08 17:21:50 +02:00
|
|
|
}
|
|
|
|
|
2015-08-11 13:44:47 +02:00
|
|
|
si64 CMemoryBuffer::write(const ui8 * data, si64 size)
|
2015-08-08 17:21:50 +02:00
|
|
|
{
|
2015-08-12 02:31:06 +02:00
|
|
|
//do not shrink
|
|
|
|
const si64 newSize = tell()+size;
|
|
|
|
if(newSize>getSize())
|
|
|
|
buffer.resize(newSize);
|
2015-08-08 17:21:50 +02:00
|
|
|
|
|
|
|
std::copy(data, data + size, buffer.data() + position);
|
|
|
|
position += size;
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
|
|
|
si64 CMemoryBuffer::read(ui8 * data, si64 size)
|
|
|
|
{
|
|
|
|
si64 toRead = std::min(getSize() - tell(), size);
|
|
|
|
|
2015-08-12 02:31:06 +02:00
|
|
|
if(toRead > 0)
|
|
|
|
{
|
|
|
|
std::copy(buffer.data() + position, buffer.data() + position + toRead, data);
|
|
|
|
position += toRead;
|
|
|
|
}
|
|
|
|
|
2015-08-08 17:21:50 +02:00
|
|
|
|
|
|
|
return toRead;
|
|
|
|
}
|
|
|
|
|
|
|
|
si64 CMemoryBuffer::seek(si64 position)
|
|
|
|
{
|
|
|
|
this->position = position;
|
2015-08-13 23:16:31 +02:00
|
|
|
if (this->position >getSize())
|
2015-08-12 02:31:06 +02:00
|
|
|
this->position = getSize();
|
2015-08-08 17:21:50 +02:00
|
|
|
return this->position;
|
|
|
|
}
|
|
|
|
|
|
|
|
si64 CMemoryBuffer::tell()
|
|
|
|
{
|
|
|
|
return position;
|
|
|
|
}
|
|
|
|
|
|
|
|
si64 CMemoryBuffer::skip(si64 delta)
|
|
|
|
{
|
|
|
|
auto old_position = tell();
|
|
|
|
|
|
|
|
return seek(old_position + delta) - old_position;
|
|
|
|
}
|
|
|
|
|
|
|
|
si64 CMemoryBuffer::getSize()
|
|
|
|
{
|
|
|
|
return buffer.size();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-07-26 15:07:42 +02:00
|
|
|
|
|
|
|
VCMI_LIB_NAMESPACE_END
|