Files
FC1/Editor/Util/MemoryBlock.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

169 lines
4.1 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: memoryblock.cpp
// Version: v1.00
// Created: 10/10/2002 by Timur.
// Compilers: Visual Studio.NET
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "MemoryBlock.h"
#include "..\zlib\zlib.h"
//////////////////////////////////////////////////////////////////////////
CMemoryBlock::CMemoryBlock()
{
m_buffer = 0;
m_size = 0;
m_uncompressedSize = 0;
m_owns = false;
}
//////////////////////////////////////////////////////////////////////////
CMemoryBlock::CMemoryBlock( const CMemoryBlock &mem )
{
// Invoke operator=.
*this = mem;
}
//////////////////////////////////////////////////////////////////////////
CMemoryBlock::~CMemoryBlock()
{
Free();
}
//////////////////////////////////////////////////////////////////////////
CMemoryBlock& CMemoryBlock::operator=( const CMemoryBlock &mem )
{
if (mem.GetSize() > 0)
{
// Do not reallocate.
if (mem.GetSize() > GetSize())
{
if (!Allocate(mem.GetSize()))
return *this;
}
Copy( mem.GetBuffer(),mem.GetSize() );
}
m_uncompressedSize = mem.m_uncompressedSize;
return *this;
}
//////////////////////////////////////////////////////////////////////////
bool CMemoryBlock::Allocate( int size,int uncompressedSize )
{
assert( size > 0 );
if (m_buffer)
{
m_buffer = realloc(m_buffer,size);
}
else
{
m_buffer = malloc(size);
}
if (!m_buffer)
{
Warning( "Warning CMemoryBlock::Allocate failed to allocate %dMb of Memory",size/(1024*1024) );
}
m_owns = true;
m_size = size;
m_uncompressedSize = uncompressedSize;
// Check if allocation failed.
if (m_buffer == 0)
return false;
return true;
}
//////////////////////////////////////////////////////////////////////////
void CMemoryBlock::Free()
{
if (m_buffer && m_owns)
free( m_buffer );
m_buffer = 0;
m_owns = false;
m_size = 0;
m_uncompressedSize = 0;
}
//////////////////////////////////////////////////////////////////////////
void CMemoryBlock::Copy( void *src,int size )
{
assert( size <= m_size );
memcpy( m_buffer,src,size );
}
//////////////////////////////////////////////////////////////////////////
void CMemoryBlock::Attach( void *buffer,int size,int uncompressedSize )
{
Free();
m_owns = false;
m_buffer = buffer;
m_size = size;
m_uncompressedSize = uncompressedSize;
}
//////////////////////////////////////////////////////////////////////////
void CMemoryBlock::Detach()
{
Free();
}
//////////////////////////////////////////////////////////////////////////
void CMemoryBlock::Compress( CMemoryBlock &toBlock ) const
{
// Cannot compress to itself.
assert( this != &toBlock );
unsigned long destSize = m_size*2+128;
CMemoryBlock temp;
temp.Allocate( destSize );
compress( (unsigned char*)temp.GetBuffer(),&destSize,(unsigned char*)GetBuffer(),m_size );
toBlock.Allocate( destSize );
toBlock.Copy( temp.GetBuffer(),destSize );
toBlock.m_uncompressedSize = GetSize();
}
//////////////////////////////////////////////////////////////////////////
void CMemoryBlock::Uncompress( CMemoryBlock &toBlock ) const
{
assert( this != &toBlock );
toBlock.Allocate( m_uncompressedSize );
toBlock.m_uncompressedSize = 0;
unsigned long destSize = m_uncompressedSize;
int result = uncompress( (unsigned char*)toBlock.GetBuffer(),&destSize,(unsigned char*)GetBuffer(),GetSize() );
assert( result == Z_OK );
assert( destSize == m_uncompressedSize );
}
//////////////////////////////////////////////////////////////////////////
void CMemoryBlock::Serialize( CArchive &ar )
{
if (ar.IsLoading())
{
int size;
// Loading.
ar >> size;
if (size != m_size)
Allocate( size );
m_size = size;
ar >> m_uncompressedSize;
ar.Read( m_buffer,m_size );
}
else
{
// Saving.
ar << m_size;
ar << m_uncompressedSize;
ar.Write( m_buffer,m_size );
}
}