added ActiveDataManager.h

This commit is contained in:
2023-09-19 18:16:24 +08:00
parent 389abfefd5
commit cf1e0340f4
4 changed files with 176 additions and 19 deletions

View File

@@ -0,0 +1,134 @@
#pragma once
#include<hgl/type/ActiveMemoryBlockManager.h>
namespace hgl
{
/**
* 活动数据管理模板类<br>
* 通过ActiveIDManager管理活跃的数据ID在要使用时通过ID来获取或写入数据。
*/
template<typename T> class ActiveDataManager
{
ActiveIDManager aim;
DataArray<T> data_array;
public:
ActiveDataManager(){}
virtual ~ActiveDataManager()=default;
void Alloc(int c)
{
aim.Alloc(c);
data_array.Alloc(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(const T &d,const int id)
{
return data_array.WriteAt(d,id);
}
int WriteDataArray(const T **da,const int *idp,const int count)
{
int result=0;
for(int i=0;i<count;i++)
{
if(data_array.WriteAt(**da,*idp))
++result;
++da;
++idp;
}
return result;
}
int WriteDataArray(T *da,const int *idp,const int count)const
{
int result=0;
for(int i=0;i<count;i++)
{
if(data_array.WriteAt(*da,*idp))
++result;
++da;
++idp;
}
return result;
}
bool GetData(T &d,const int id)const
{
return data_array.ReadAt(d,id);
}
bool GetData(T **da,const int *idp,const int count)const
{
int result=0;
for(int i=0;i<count;i++)
{
*da=data_array.GetPointer(*idp);
if(*da)++result;
++da;
++idp;
}
return result;
}
bool GetData(T *da,const int *idp,const int count)const
{
int result=0;
for(int i=0;i<count;i++)
{
if(data_array.ReadAt(*da,*idp))
++result;
++da;
++idp;
}
return result;
}
public:
void CreateActive(int *id,const int count=1)
{
aim.CreateActive(id,count);
data_array.AddCount(count);
}
void CreateIdle(int *idp=nullptr,const int count=1)
{
aim.CreateIdle(idp,count);
data_array.AddCount(count);
}
void CreateIdle (const int count=1) {CreateIdle(nullptr,count);}
bool Get (int *id,const int count=1) {return aim.Get(id,count);}
int Release (int *id,const int count=1) {return aim.Release(id,count);}
int ReleaseAllActive() {return aim.ReleaseAllActive();}
};//template<typename T> class ActiveDataManager
}//namespace hgl

View File

@@ -5,6 +5,10 @@
namespace hgl namespace hgl
{ {
/**
* 活跃内存块管理类<br>
* 通过ActiveIDManager管理活跃的数据ID在要使用时通过ID来获取或写入数据。
*/
class ActiveMemoryBlockManager class ActiveMemoryBlockManager
{ {
uint unit_size; ///<单个数据大小 uint unit_size; ///<单个数据大小
@@ -35,12 +39,15 @@ namespace hgl
public: public:
bool WriteData (void *d,const int id); bool WriteData (void *d,const int id);
bool WriteDataArray (void **da,const int *idp,const int count); int WriteDataArray (void **da,const int *idp,const int count);
bool WriteDataArray (void *da,const int *idp,const int count)const; int 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 *,const int id)const;
bool GetData(void **da,const int *idp,const int count)const; ///<根据ID获取数据
bool GetData(void *da,const int *idp,const int count)const; ///<根据ID获取数据并整齐排列到一起 bool GetData(void *da,const int *idp,const int count)const; ///<根据ID获取数据并整齐排列到一起
public:
int CreateActive(int *da,const int count=1); int CreateActive(int *da,const int count=1);
int CreateIdle(int *da,const int count=1); int CreateIdle(int *da,const int count=1);

View File

@@ -24,6 +24,7 @@ SOURCE_GROUP("DataType\\Collection" FILES ${TYPE_INCLUDE_PATH}/Collection.h
SET(ACTIVE_MANAGER_FILES ${TYPE_INCLUDE_PATH}/ActiveIDManager.h SET(ACTIVE_MANAGER_FILES ${TYPE_INCLUDE_PATH}/ActiveIDManager.h
${TYPE_INCLUDE_PATH}/ActiveMemoryBlockManager.h ${TYPE_INCLUDE_PATH}/ActiveMemoryBlockManager.h
${TYPE_INCLUDE_PATH}/ActiveDataManager.h
Type/ActiveIDManager.cpp Type/ActiveIDManager.cpp
Type/ActiveMemoryBlockManager.cpp) Type/ActiveMemoryBlockManager.cpp)
@@ -218,12 +219,13 @@ add_cm_library(CMCore "CM" ${CORE_PLATFORM_HEADER_FILES}
${STRING_HEADER_FILES} ${STRING_HEADER_FILES}
${TEXT_HEADER_FILES} ${TEXT_HEADER_FILES}
${TEXT_SOURCE_FILES} ${TEXT_SOURCE_FILES}
${ACTIVE_MANAGER_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

@@ -42,51 +42,65 @@ namespace hgl
return data_mb->Write(unit_size*id,d,unit_size); return data_mb->Write(unit_size*id,d,unit_size);
} }
bool ActiveMemoryBlockManager::WriteDataArray(void **da,const int *idp,const int count) int ActiveMemoryBlockManager::WriteDataArray(void **da,const int *idp,const int count)
{ {
if(!da||!idp||count<=0)return(false); if(!da||!idp||count<=0)return(0);
uint8 *sp=(uint8 *)(data_mb->Get()); uint8 *sp=(uint8 *)(data_mb->Get());
int result=0;
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {
if(*idp<0||*idp>=aim.GetHistoryMaxId()) if(*idp>=0&&*idp<aim.GetHistoryMaxId())
return(false); {
memcpy(sp+(*idp)*unit_size,*da,unit_size);
memcpy(sp+(*idp)*unit_size,da,unit_size); ++result;
}
++da; ++da;
++idp; ++idp;
} }
return(true); return(result);
} }
bool ActiveMemoryBlockManager::WriteDataArray(void *da,const int *idp,const int count)const int ActiveMemoryBlockManager::WriteDataArray(void *da,const int *idp,const int count)const
{ {
if(!da||!idp||count<=0)return(false); if(!da||!idp||count<=0)return(0);
uint8 *sp=(uint8 *)da; uint8 *sp=(uint8 *)da;
uint8 *tp=(uint8 *)(data_mb->Get()); uint8 *tp=(uint8 *)(data_mb->Get());
int result=0;
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {
if(*idp<0||*idp>=aim.GetHistoryMaxId()) if(*idp>=0&&*idp<aim.GetHistoryMaxId())
return(false); {
memcpy(tp+(*idp)*unit_size,sp,unit_size);
memcpy(tp+(*idp)*unit_size,sp,unit_size); ++result;
}
sp+=unit_size; sp+=unit_size;
++idp; ++idp;
} }
return(result);
}
bool ActiveMemoryBlockManager::GetData(void *da,const int id)const
{
if(!id||id<0||id>=aim.GetHistoryMaxId())
return(false);
memcpy(da,(uint8 *)(data_mb->Get())+id*unit_size,unit_size);
return(true); return(true);
} }
/** /**
* 根据ID获取数据 * 根据ID获取数据
*/ */
bool ActiveMemoryBlockManager::GetDataArrayPointer(void **da,const int *idp,const int count)const bool ActiveMemoryBlockManager::GetData(void **da,const int *idp,const int count)const
{ {
if(!da||!idp||count<=0)return(false); if(!da||!idp||count<=0)return(false);