1
Fork 0
moonfall/Buffer.cpp

237 lines
3.9 KiB
C++

/*
Moonfall Copyright (C) 2008 Alex Yatskov
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Pch.h"
#include "Buffer.h"
Buffer::Buffer(const void* data, int size) :
m_data(NULL),
m_maxSize(0),
m_size(0)
{
AddToBack(data, size);
}
Buffer::Buffer(const Buffer& other) :
m_data(NULL),
m_maxSize(0),
m_size(0)
{
*this = other;
}
Buffer::Buffer(int size) :
m_data(NULL),
m_maxSize(0),
m_size(0)
{
Allocate(size);
}
Buffer::~Buffer()
{
if (m_data != NULL)
{
delete[] m_data;
}
}
void Buffer::AddToBack(const void* data, int size)
{
if (size <= 0)
{
return;
}
if (m_size + size > m_maxSize)
{
m_maxSize = (m_size + size) * 2;
byte* temp = new byte[m_maxSize + 1];
if (m_data != NULL)
{
memcpy(temp, m_data, m_size);
delete[] m_data;
}
m_data = temp;
}
memcpy(m_data + m_size, data, size);
m_size += size;
m_data[m_size] = 0;
}
void Buffer::AddToFront(const void* data, int size)
{
if (size <= 0)
{
return;
}
if (m_size + size > m_maxSize)
{
m_maxSize = (m_size + size) * 2;
}
byte* temp = new byte[m_maxSize + 1];
memcpy(temp, data, size);
if (m_data != NULL)
{
memcpy(temp + size, m_data, m_size);
delete[] m_data;
}
m_data = temp;
m_size += size;
m_data[m_size] = 0;
}
int Buffer::RemoveFromFront(void* data, int size)
{
size = MIN(size, m_size);
if (size <= 0)
{
return 0;
}
m_size -= size;
if (data != NULL)
{
memcpy(data, m_data, size);
}
memmove(m_data, m_data + size, m_size);
if (m_size > 0)
{
m_data[m_size] = 0;
}
return size;
}
int Buffer::RemoveFromBack(void* data, int size)
{
size = MIN(size, m_size);
if (size <= 0)
{
return 0;
}
m_size -= size;
if (data != NULL)
{
memcpy(data, m_data + m_size, size);
}
if (m_size > 0)
{
m_data[m_size] = 0;
}
return size;
}
int Buffer::GetSize() const
{
return m_size;
}
void Buffer::Set(const void* data, int size)
{
if (size > m_maxSize)
{
if (m_data != NULL)
{
delete[] m_data;
}
m_maxSize = size * 2;
m_data = new byte[m_maxSize + 1];
}
memcpy(m_data, data, size);
m_size = size;
if (m_size > 0)
{
m_data[m_size] = 0;
}
}
const void* Buffer::Get() const
{
return m_size > 0 ? m_data : NULL;
}
void* Buffer::Get()
{
return m_size > 0 ? m_data : NULL;
}
void* Buffer::Allocate(int size)
{
if (size > m_maxSize)
{
if (m_data != NULL)
{
delete[] m_data;
}
m_maxSize = size * 2;
m_data = new byte[m_maxSize + 1];
}
m_size = size;
if (m_size > 0)
{
m_data[m_size] = 0;
}
return m_data;
}
void Buffer::Clear()
{
m_size = 0;
}
Buffer& Buffer::operator =(const Buffer& other)
{
if (this != &other)
{
Set(other.Get(), other.GetSize());
}
return *this;
}
const byte& Buffer::operator [](int index) const
{
ASSERT(index < m_size);
return m_data[index];
}
byte& Buffer::operator [](int index)
{
ASSERT(index < m_size);
return m_data[index];
}