#include "StdAfx.h"
#include "UTF8StringMemoryPool.h"

//!	グローバル
CUTF8StringMemoryPool g_utf8StringMemoryPool;

CUTF8StringMemoryPool::CUTF8StringMemoryPool(void)
{
	m_enable = 0;
	m_stringCount = 0;
}

CUTF8StringMemoryPool::~CUTF8StringMemoryPool(void)
{
	m_enable = 0;

	//	未開放チェック
	ASSERT(m_stringCount == 0);
}


/*!
	有効にする
*/
void CUTF8StringMemoryPool::EnableMemoryPool()
{
	CRITICAL_SECTION_SCOPE();

	//	有効化済み
	if(m_enable)
		return;

	//	メモリプール初期化
	m_memoryPool.Init(UTF8STRING_POOL_BLOCK_SIZE, UTF8STRING_CHUNK_SIZE);
	m_memoryPool.PreCharge();
}


/*!
	確保する
*/
unsigned char *CUTF8StringMemoryPool::Alloc(int size)
{
	CRITICAL_SECTION_SCOPE();
	m_stringCount++;

	//	有効化済み?
	if(!m_enable)
		return new unsigned char[size];

	//	プールから確保
	return((unsigned char *)m_memoryPool.Alloc(size));
}

/*!
	解放する
*/
void CUTF8StringMemoryPool::Free(unsigned char *block)
{
	CRITICAL_SECTION_SCOPE();
	m_stringCount--;
	ASSERT(m_stringCount >= 0); //	解放しすぎ

	//	有効化済み?
	if(!m_enable)
	{
		delete block;
		return;
	}

	//	プールから解放を試みる
	if(m_memoryPool.TryFree(block))
		delete block;
}


/*!
	文字列数取得
*/
int CUTF8StringMemoryPool::GetAllocedCount()
{
	CRITICAL_SECTION_SCOPE();

	return(m_stringCount);
}


/*!
	プールサイズ取得
*/
int CUTF8StringMemoryPool::GetPoolSize()
{
	CRITICAL_SECTION_SCOPE();

	//	有効化済み?
	if(!m_enable)
		return(0);

	return(m_memoryPool.GetChunkCount() * UTF8STRING_POOL_BLOCK_SIZE * UTF8STRING_CHUNK_SIZE);
}

