Files
Sun1602/Server/GameServer/GameShop.BitBlockContainer.cpp
T
2022-10-26 12:25:11 +08:00

203 lines
5.1 KiB
C++

#include "stdafx.h"
#include "./GameShop.BitBlockContainer.h"
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
#ifdef _NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
namespace GameShop
{
//===============================================================================================
//
// class BitBlockContainer::MemoryAllocator
//
//===============================================================================================
BitBlockContainer::MemoryAllocator::MemoryAllocator()
: total_instanced_(0)
{
}
BitBlockContainer::MemoryAllocator::~MemoryAllocator()
{
}
void BitBlockContainer::MemoryAllocator::Initialize(uint bit_block_count, uint bit_count)
{
__UNUSED((bit_block_count, bit_count));
//uint base_count = sizeof(uchar) * 8; // 1byte = 8bit, 1 bit °¡ 1°³ÀÇ flag ÀÌ´Ù.
//uint need_byte = (bit_count / base_count) + ((bit_count % base_count) ? 1 : 0);
//allocate_size_ = bit_block_count * need_byte;
//block_size_ = need_byte;
}
void BitBlockContainer::MemoryAllocator::Release()
{
UsedBitsBlockQueue::const_iterator it = block_memory_pool_.begin(),
end = block_memory_pool_.end();
for (; it != end; ++it)
{
UsedBitsBlock* used_bits_block = *it;
TAllocDelete(UsedBitsBlock, used_bits_block);
};
block_memory_pool_.clear();
}
uint8_t* BitBlockContainer::MemoryAllocator::new_memory()
{
UsedBitsBlock* used_bits_block = NULL;
if (block_memory_pool_.empty()) {
used_bits_block = TAllocNew(UsedBitsBlock);
}
else {
used_bits_block = block_memory_pool_.back();
block_memory_pool_.pop_back();
};
ZeroMemory(used_bits_block, sizeof(*used_bits_block));
return used_bits_block->stream;
}
void BitBlockContainer::MemoryAllocator::delete_memory(uint8_t* pointer)
{
UsedBitsBlock* used_bits_block = reinterpret_cast<UsedBitsBlock*>(pointer);
block_memory_pool_.push_back(used_bits_block);
}
//===============================================================================================
//
// class BitBlockContainer::BitBlock
//
//===============================================================================================
BitBlockContainer::BitBlock::BitBlock()
{
}
BitBlockContainer::BitBlock::~BitBlock()
{
}
void BitBlockContainer::BitBlock::Initialize(BitBlockContainer::MemoryAllocator* memory_allocator)
{
memory_allocator_ = memory_allocator;
memory_point_hashmap_.clear();
}
void BitBlockContainer::BitBlock::Release()
{
STLX_HASH_MAP<uint, uchar*>::iterator iter = memory_point_hashmap_.begin();
for ( ; iter != memory_point_hashmap_.end() ; ++iter)
memory_allocator_->delete_memory(iter->second);
memory_point_hashmap_.clear();
}
const BitBlockContainer::BitBlock::Extraction& BitBlockContainer::BitBlock::extract(uint index)
{
static Extraction result;
uint count = sizeof(uchar) * 8;
uint start_key = index / count;
uchar* pointer = NULL;
STLX_HASH_MAP<uint, uchar*>::iterator iter = memory_point_hashmap_.find(start_key);
if (iter != memory_point_hashmap_.end())
{
pointer = iter->second;
}
else
{
pointer = memory_allocator_->new_memory();
memory_point_hashmap_[start_key] = pointer;
}
result.pointer = pointer;
result.position = (uchar)(((count - 1) - (index % count)));
return result;
}
//===============================================================================================
//
// class BitBlockContainer
//
//===============================================================================================
BitBlockContainer::BitBlockContainer()
{
}
BitBlockContainer::~BitBlockContainer()
{
}
void BitBlockContainer::Initialize(uint bit_block_count, uint bit_count)
{
memory_allocator_.Initialize(bit_block_count, bit_count);
bit_block_pool_.Initialize(bit_block_count, bit_count/2);
bitblock_hashmap_.clear();
}
void BitBlockContainer::Release()
{
bit_block_pool_.Release();
memory_allocator_.Release();
bitblock_hashmap_.clear();
}
BitBlockContainer::BitBlock* BitBlockContainer::new_bit_block(uint key)
{
BitBlockHashMap::iterator iter = bitblock_hashmap_.find(key);
if (iter != bitblock_hashmap_.end())
{
BitBlock* bit_block = iter->second;
bit_block->Release();
return bit_block;
}
BitBlock* bit_block = (BitBlock*)bit_block_pool_.Alloc();
bit_block->Initialize(&memory_allocator_);
bitblock_hashmap_[key] = bit_block;
return bit_block;
}
void BitBlockContainer::delete_bit_block(uint key)
{
BitBlockHashMap::iterator iter = bitblock_hashmap_.find(key);
if (iter != bitblock_hashmap_.end())
{
BitBlock* bit_block = iter->second;
bit_block->Release();
bit_block_pool_.Free(bit_block);
bitblock_hashmap_.erase(iter);
}
}
BitBlockContainer::BitBlock* BitBlockContainer::find_bit_block(uint key)
{
BitBlockHashMap::iterator iter = bitblock_hashmap_.find(key);
if (iter != bitblock_hashmap_.end())
{
return iter->second;
}
return NULL;
}
} // namespace GameShop
#endif // _NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL