added ActiveMemoryBlockManager.cpp/.h, splited ActiveIDManager.cpp

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-09-18 22:27:23 +08:00
parent 2e14c54ca4
commit 389abfefd5
5 changed files with 386 additions and 123 deletions

View File

@ -18,35 +18,14 @@ namespace hgl
private: private:
bool Create(int *id_list,const int count) bool Create(int *id_list,const int count);
{
if(!id_list||count<=0)return(false);
for(int i=id_count;i<id_count+count;i++)
{
*id_list=i;
++id_list;
}
id_count+=count;
return(true);
}
public: public:
ActiveIDManager() ActiveIDManager(){id_count=0;}
{
id_count=0;
}
~ActiveIDManager()=default; ~ActiveIDManager()=default;
void Alloc(int c) void Alloc(int c);
{
active_list.PreAlloc(c);
idle_list.PreAlloc(c);
}
int GetActiveCount ()const{return active_list.GetCount();} int GetActiveCount ()const{return active_list.GetCount();}
int GetIdleCount ()const{return idle_list.GetCount();} int GetIdleCount ()const{return idle_list.GetCount();}
@ -58,106 +37,14 @@ namespace hgl
public: public:
/** int CreateActive(int *id,const int count=1); ///<创建若干ID并置于活跌ID列表中。(注:不从闲置列表中获取)
* IDID列表中) int CreateIdle (int *idp=nullptr,const int count=1); ///<创建若干ID并置于闲置ID列表中。(注无视闲置列表中已存在的ID)
* @return int CreateIdle (const int count=1); ///<创建若干ID并置于闲置ID列表中。(注无视闲置列表中已存在的ID)
*/
int CreateActive(int *id,const int count=1)
{
if(!id||count<=0)return(0);
if(!Create(id,count))return(0); bool Get (int *id,const int count=1); ///<激活指定量的ID数据(优先从Idle中取,没有不会创建新的。激活后会被放入Active列表)
bool GetOrCreate(int *id,const int count=1); ///<激活指定量的ID数据(优从从Idle中取,如果不够则创建新的。激活后会被放入Active列表)
return active_list.Add(id,count); int Release (int *id,int count=1); ///<释放指定量的ID数据(会从Active列表中取出放入Idle列表中)
} int ReleaseAllActive(); ///<释放所有活跃ID(会从Active列表中取出放入Idle列表中)
/**
* IDID列表中(ID)
* @return
*/
int CreateIdle(const int count=1)
{
if(count<=0)return(0);
const int new_count=idle_list.GetCount()+count;
idle_list.PreAlloc(new_count);
int *end=idle_list.end();
if(!Create(end,count))return(0);
idle_list.SetCount(new_count);
return(count);
}
/**
* ID数据(Idle中取,Active列表)
*/
bool Get(int *id,const int count=1)
{
if(!id||count<=0)return(false);
if(!idle_list.Pop(id,count))
return(false);
active_list.Add(id,count);
return(true);
}
/**
* ID数据(Idle中取Active列表)
*/
bool GetOrCreate(int *id,const int count=1)
{
if(!id||count<=0)return(false);
if(idle_list.GetCount()<count)
CreateIdle(count-idle_list.GetCount());
return Get(id,count);
}
/**
* ID数据(Active列表中取出Idle列表中)
*/
int Release(int *id,int count=1)
{
if(!id||count<=0)return(false);
int result=0;
while(count--)
{
if(active_list.Delete(*id))
{
idle_list.Push(*id);
++result;
}
++id;
}
return result;
}
/**
* ID
*/
int ReleaseAllActive()
{
const int count=active_list.GetCount();
if(count>0)
{
idle_list.Push(active_list.GetData(),count);
active_list.Clear();
}
return count;
}
};//class ActiveIDManager };//class ActiveIDManager
}//namespace hgl }//namespace hgl

View File

@ -0,0 +1,52 @@
#pragma once
#include<hgl/type/ActiveIDManager.h>
#include<hgl/type/MemoryBlock.h>
namespace hgl
{
class ActiveMemoryBlockManager
{
uint unit_size; ///<单个数据大小
MemoryBlock *data_mb; ///<数据内存块
ActiveIDManager aim; ///<活跃ID管理器
private:
void ReallocDataBlock();
public:
ActiveMemoryBlockManager(const uint us,AbstractMemoryAllocator *ma=new MemoryAllocator);
virtual ~ActiveMemoryBlockManager();
bool SetUnitSize(const uint us);
void Alloc(int c);
int GetActiveCount ()const{return aim.GetActiveCount();}
int GetIdleCount ()const{return aim.GetIdleCount();}
int GetTotalCount ()const{return aim.GetTotalCount();}
int GetHistoryMaxId ()const{return aim.GetHistoryMaxId();}
const DataArray<int> &GetActiveArray()const{return aim.GetActiveArray();}
const DataArray<int> &GetIdleArray ()const{return aim.GetIdleArray();}
public:
bool WriteData (void *d,const int id);
bool WriteDataArray (void **da,const int *idp,const int count);
bool WriteDataArray (void *da,const int *idp,const int count)const;
bool GetDataArrayPointer(void **da,const int *idp,const int count)const; ///<根据ID获取数据
bool GetData(void *da,const int *idp,const int count)const; ///<根据ID获取数据并整齐排列到一起
int CreateActive(int *da,const int count=1);
int CreateIdle(int *da,const int count=1);
bool Get(int *da,const int count=1);
int Release(int *id,const int count=1);
int ReleaseAllActive();
};//class ActiveMemoryBlockManager
}//namespace hgl

View File

@ -22,6 +22,13 @@ SET(TYPE_SOURCE_FILES Type/Collection.cpp)
SOURCE_GROUP("DataType\\Collection" FILES ${TYPE_INCLUDE_PATH}/Collection.h SOURCE_GROUP("DataType\\Collection" FILES ${TYPE_INCLUDE_PATH}/Collection.h
${COLLECTION_SOURCE}) ${COLLECTION_SOURCE})
SET(ACTIVE_MANAGER_FILES ${TYPE_INCLUDE_PATH}/ActiveIDManager.h
${TYPE_INCLUDE_PATH}/ActiveMemoryBlockManager.h
Type/ActiveIDManager.cpp
Type/ActiveMemoryBlockManager.cpp)
SOURCE_GROUP("DataType\\ActiveManager" FILES ${ACTIVE_MANAGER_FILES})
SET(SYSTEM_INFO_SOURCE ${CORE_PLATFORM_INCLUDE_PATH}/SystemInfo.h SET(SYSTEM_INFO_SOURCE ${CORE_PLATFORM_INCLUDE_PATH}/SystemInfo.h
SystemInfo.cpp) SystemInfo.cpp)
@ -215,6 +222,8 @@ add_cm_library(CMCore "CM" ${CORE_PLATFORM_HEADER_FILES}
${TYPE_TEMPLATE_HEADER} ${TYPE_TEMPLATE_HEADER}
${TYPE_SOURCE_FILES} ${TYPE_SOURCE_FILES}
${ACTIVE_MANAGER_FILES}
${IO_SOURCE_FILES} ${IO_SOURCE_FILES}
${MATH_HEADER_FILES} ${MATH_HEADER_FILES}

View File

@ -0,0 +1,136 @@
#include<hgl/type/ActiveIDManager.h>
namespace hgl
{
bool ActiveIDManager::Create(int *id_list,const int count)
{
if(!id_list||count<=0)return(false);
for(int i=id_count;i<id_count+count;i++)
{
*id_list=i;
++id_list;
}
id_count+=count;
return(true);
}
void ActiveIDManager::Alloc(int c)
{
active_list.PreAlloc(c);
idle_list.PreAlloc(c);
}
int ActiveIDManager::CreateActive(int *id,const int count)
{
if(!id||count<=0)return(0);
if(!Create(id,count))return(0);
return active_list.Add(id,count);
}
/**
* IDID列表中(ID)
* @return
*/
int ActiveIDManager::CreateIdle(int *idp,const int count)
{
if(count<=0)return(0);
const int new_count=idle_list.GetCount()+count;
idle_list.PreAlloc(new_count);
int *end=idle_list.end();
if(!Create(end,count))return(0);
if(idp)
hgl_cpy(idp,end,count);
idle_list.SetCount(new_count);
return(count);
}
/**
* IDID列表中(ID)
* @return
*/
int ActiveIDManager::CreateIdle(const int count)
{
return CreateIdle(nullptr,count);
}
/**
* ID数据(Idle中取,Active列表)
*/
bool ActiveIDManager::Get(int *id,const int count)
{
if(!id||count<=0)return(false);
if(!idle_list.Pop(id,count))
return(false);
active_list.Add(id,count);
return(true);
}
/**
* ID数据(Idle中取Active列表)
*/
bool ActiveIDManager::GetOrCreate(int *id,const int count)
{
if(!id||count<=0)return(false);
if(idle_list.GetCount()<count)
CreateIdle(count-idle_list.GetCount());
return Get(id,count);
}
/**
* ID数据(Active列表中取出Idle列表中)
*/
int ActiveIDManager::Release(int *id,int count)
{
if(!id||count<=0)return(false);
int result=0;
while(count--)
{
if(active_list.Delete(*id))
{
idle_list.Push(*id);
++result;
}
++id;
}
return result;
}
/**
* ID
*/
int ActiveIDManager::ReleaseAllActive()
{
const int count=active_list.GetCount();
if(count>0)
{
idle_list.Push(active_list.GetData(),count);
active_list.Clear();
}
return count;
}
}//namespace hgl

View File

@ -0,0 +1,179 @@
#include<hgl/type/ActiveMemoryBlockManager.h>
namespace hgl
{
void ActiveMemoryBlockManager::ReallocDataBlock()
{
data_mb->Alloc(aim.GetHistoryMaxId()*unit_size);
}
ActiveMemoryBlockManager::ActiveMemoryBlockManager(const uint us,AbstractMemoryAllocator *ma)
{
unit_size=us;
data_mb=new MemoryBlock(ma);
}
ActiveMemoryBlockManager::~ActiveMemoryBlockManager()
{
delete data_mb;
}
bool ActiveMemoryBlockManager::SetUnitSize(const uint us)
{
if(unit_size>0) //unit_size已经存在
return(unit_size==us);
unit_size=us;
return(true);
}
void ActiveMemoryBlockManager::Alloc(int c)
{
aim.Alloc(c);
data_mb->Alloc(c*unit_size);
}
bool ActiveMemoryBlockManager::WriteData(void *d,const int id)
{
if(!d||id<0||id>=aim.GetHistoryMaxId())
return(false);
return data_mb->Write(unit_size*id,d,unit_size);
}
bool ActiveMemoryBlockManager::WriteDataArray(void **da,const int *idp,const int count)
{
if(!da||!idp||count<=0)return(false);
uint8 *sp=(uint8 *)(data_mb->Get());
for(int i=0;i<count;i++)
{
if(*idp<0||*idp>=aim.GetHistoryMaxId())
return(false);
memcpy(sp+(*idp)*unit_size,da,unit_size);
++da;
++idp;
}
return(true);
}
bool ActiveMemoryBlockManager::WriteDataArray(void *da,const int *idp,const int count)const
{
if(!da||!idp||count<=0)return(false);
uint8 *sp=(uint8 *)da;
uint8 *tp=(uint8 *)(data_mb->Get());
for(int i=0;i<count;i++)
{
if(*idp<0||*idp>=aim.GetHistoryMaxId())
return(false);
memcpy(tp+(*idp)*unit_size,sp,unit_size);
sp+=unit_size;
++idp;
}
return(true);
}
/**
* ID获取数据
*/
bool ActiveMemoryBlockManager::GetDataArrayPointer(void **da,const int *idp,const int count)const
{
if(!da||!idp||count<=0)return(false);
uint8 *sp=(uint8 *)(data_mb->Get());
for(int i=0;i<count;i++)
{
if(*idp<0||*idp>=aim.GetHistoryMaxId())
return(false);
*da=sp+(*idp)*unit_size;
++da;
++idp;
}
return(true);
}
/**
* ID获取数据
*/
bool ActiveMemoryBlockManager::GetData(void *da,const int *idp,const int count)const
{
if(!da||!idp||count<=0)return(false);
uint8 *sp=(uint8 *)(data_mb->Get());
uint8 *tp=(uint8 *)da;
for(int i=0;i<count;i++)
{
if(*idp<0||*idp>=aim.GetHistoryMaxId())
return(false);
memcpy(tp,sp+(*idp)*unit_size,unit_size);
tp+=unit_size;
++idp;
}
return(true);
}
int ActiveMemoryBlockManager::CreateActive(int *da,const int count)
{
if(!da||count<=0)return(-1);
int result=aim.CreateActive(da,count);
if(result!=count)
return(false);
ReallocDataBlock();
return(result);
}
int ActiveMemoryBlockManager::CreateIdle(int *da,const int count)
{
if(count<=0)return 0;
int result=aim.CreateIdle(da,count);
if(result!=count)
return(false);
ReallocDataBlock();
return(result);
}
bool ActiveMemoryBlockManager::Get(int *da,const int count)
{
if(!da||count<=0)return(false);
if(aim.Get(da,count)!=count)
return(false);
ReallocDataBlock();
return(true);
}
int ActiveMemoryBlockManager::Release(int *id,const int count)
{
return aim.Release(id,count);
}
int ActiveMemoryBlockManager::ReleaseAllActive()
{
return aim.ReleaseAllActive();
}
}//namespace hgl