fixed few design bug in LifetimeCallback/Map/ObjectManage/Pool
This commit is contained in:
parent
3b71e680cc
commit
d644ec4ab0
@ -33,7 +33,7 @@ namespace hgl
|
|||||||
*/
|
*/
|
||||||
template<typename T> struct ObjectLifetimeCallback:public DataLifetimeCallback<T *>
|
template<typename T> struct ObjectLifetimeCallback:public DataLifetimeCallback<T *>
|
||||||
{
|
{
|
||||||
virtual bool Create(T **) override=0;
|
virtual bool Create(T **) override {return false;}
|
||||||
virtual void Clear(T **obj) override {if(obj&&*obj)delete *obj;}
|
virtual void Clear(T **obj) override {if(obj&&*obj)delete *obj;}
|
||||||
|
|
||||||
virtual void Clear(T **obj,int count) override
|
virtual void Clear(T **obj,int count) override
|
||||||
|
@ -152,14 +152,14 @@ namespace hgl
|
|||||||
template<typename K,typename V,typename KVData>
|
template<typename K,typename V,typename KVData>
|
||||||
KVData *_Map<K,V,KVData>::Add(const K &flag,const V &data)
|
KVData *_Map<K,V,KVData>::Add(const K &flag,const V &data)
|
||||||
{
|
{
|
||||||
KVData *dp;
|
KVData *dp=new KVData;
|
||||||
|
|
||||||
if(!data_pool.GetOrCreate(dp))
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
dp->key=flag;
|
dp->key=flag;
|
||||||
dp->value=data;
|
dp->value=data;
|
||||||
|
|
||||||
|
if(!data_pool.AppendToActive(dp))
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
int pos;
|
int pos;
|
||||||
|
|
||||||
if(FindPos(flag,pos))
|
if(FindPos(flag,pos))
|
||||||
@ -442,15 +442,19 @@ namespace hgl
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(data_pool.GetOrCreate(dp))
|
if(!data_pool.GetOrCreate(dp))
|
||||||
{
|
{
|
||||||
|
dp=new KVData;
|
||||||
|
|
||||||
|
data_pool.AppendToActive(dp);
|
||||||
|
}
|
||||||
|
|
||||||
dp->key=flag;
|
dp->key=flag;
|
||||||
dp->value=data;
|
dp->value=data;
|
||||||
|
|
||||||
data_list.Insert(result,dp);
|
data_list.Insert(result,dp);
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,8 @@ namespace hgl
|
|||||||
|
|
||||||
typedef _Map<K,V *,KVData> SuperClass;
|
typedef _Map<K,V *,KVData> SuperClass;
|
||||||
|
|
||||||
DataLifetimeCallback<V *> *olc;
|
ObjectLifetimeCallback<V> *olc;
|
||||||
|
ObjectLifetimeCallback<V> default_olc;
|
||||||
|
|
||||||
void DeleteObject(KVData *ds)
|
void DeleteObject(KVData *ds)
|
||||||
{
|
{
|
||||||
@ -186,7 +187,7 @@ namespace hgl
|
|||||||
|
|
||||||
_ObjectMap()
|
_ObjectMap()
|
||||||
{
|
{
|
||||||
olc=nullptr;
|
olc=&default_olc;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~_ObjectMap()
|
virtual ~_ObjectMap()
|
||||||
@ -194,7 +195,7 @@ namespace hgl
|
|||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void SetDataLifetimeCallback(DataLifetimeCallback<V *> *cb) ///<设定数据生命周期回调函数
|
virtual void SetDataLifetimeCallback(ObjectLifetimeCallback<V> *cb) ///<设定数据生命周期回调函数
|
||||||
{
|
{
|
||||||
olc=cb;
|
olc=cb;
|
||||||
}
|
}
|
||||||
@ -281,10 +282,8 @@ namespace hgl
|
|||||||
*/
|
*/
|
||||||
void DeleteAll()
|
void DeleteAll()
|
||||||
{
|
{
|
||||||
int n=this->data_list.GetCount();
|
for(auto &it:this->data_list)
|
||||||
|
DeleteObject(it);
|
||||||
while(n--)
|
|
||||||
DeleteObject(n);
|
|
||||||
|
|
||||||
SuperClass::Free();
|
SuperClass::Free();
|
||||||
}
|
}
|
||||||
|
@ -26,21 +26,32 @@ namespace hgl
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
||||||
_Map<K,V *,KVObject> items;
|
_Map<K,V *,KVObject> items;
|
||||||
|
|
||||||
protected:
|
ObjectLifetimeCallback<V> *dlc; ///<数据生命周期回调函数
|
||||||
|
|
||||||
virtual void Clear(V *obj){delete obj;} ///<对象释放虚拟函数(缺省为直接delete对象)
|
ObjectLifetimeCallback<V> default_dlc;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
ObjectManage()
|
||||||
|
{
|
||||||
|
dlc=&default_dlc;
|
||||||
|
}
|
||||||
|
|
||||||
virtual ~ObjectManage()
|
virtual ~ObjectManage()
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void SetDataLifetimeCallback(ObjectLifetimeCallback<V> *cb) ///<设定数据生命周期回调函数
|
||||||
|
{
|
||||||
|
dlc=cb;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void Clear() ///<清除所有对象
|
virtual void Clear() ///<清除所有对象
|
||||||
|
{
|
||||||
|
if(dlc)
|
||||||
{
|
{
|
||||||
int n=items.GetCount();
|
int n=items.GetCount();
|
||||||
|
|
||||||
@ -48,10 +59,11 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
KVObject *obj=items.GetItem(n);
|
KVObject *obj=items.GetItem(n);
|
||||||
|
|
||||||
Clear(obj->value);
|
dlc->Clear(&(obj->value));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
items.Free();
|
items.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void ClearFree() ///<清除所有引用计数为0的对象
|
virtual void ClearFree() ///<清除所有引用计数为0的对象
|
||||||
@ -64,7 +76,9 @@ namespace hgl
|
|||||||
|
|
||||||
if(obj->ref_count<=0)
|
if(obj->ref_count<=0)
|
||||||
{
|
{
|
||||||
Clear(obj->value);
|
if(dlc)
|
||||||
|
dlc->Clear(&(obj->value));
|
||||||
|
|
||||||
items.DeleteAt(n);
|
items.DeleteAt(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -167,7 +181,8 @@ namespace hgl
|
|||||||
|
|
||||||
if(zero_clear)
|
if(zero_clear)
|
||||||
{
|
{
|
||||||
Clear(obj->value);
|
if(dlc)
|
||||||
|
dlc->Clear(&(obj->value));
|
||||||
|
|
||||||
items.DeleteAt(index);
|
items.DeleteAt(index);
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ namespace hgl
|
|||||||
* 默认情部下空闲队列使用Queue模板管理(先入先出,总是使用最早扔进去的数据。可手动换成Stack运行性能更好,但逻辑性能更差。),
|
* 默认情部下空闲队列使用Queue模板管理(先入先出,总是使用最早扔进去的数据。可手动换成Stack运行性能更好,但逻辑性能更差。),
|
||||||
* 活动队列使用List模板管理(无序)。
|
* 活动队列使用List模板管理(无序)。
|
||||||
*/
|
*/
|
||||||
template<typename T,typename AT,typename IT> class _Pool ///数据池
|
template<typename T,typename AT,typename IT,typename DEFAULT_DLC> class _Pool ///数据池
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
@ -30,6 +30,8 @@ namespace hgl
|
|||||||
|
|
||||||
DataLifetimeCallback<T> *dlc; ///<数据生命周期回调函数
|
DataLifetimeCallback<T> *dlc; ///<数据生命周期回调函数
|
||||||
|
|
||||||
|
DEFAULT_DLC default_dlc;
|
||||||
|
|
||||||
public: //属性
|
public: //属性
|
||||||
|
|
||||||
int GetActiveCount() const{return Active.GetCount();} ///<取得活动数据数量
|
int GetActiveCount() const{return Active.GetCount();} ///<取得活动数据数量
|
||||||
@ -55,7 +57,7 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
max_active_count=0;
|
max_active_count=0;
|
||||||
history_max=0;
|
history_max=0;
|
||||||
dlc=nullptr;
|
dlc=&default_dlc;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~_Pool()
|
virtual ~_Pool()
|
||||||
@ -212,6 +214,6 @@ namespace hgl
|
|||||||
}
|
}
|
||||||
};//template<typename T,typename AT,typename IT> class _Pool
|
};//template<typename T,typename AT,typename IT> class _Pool
|
||||||
|
|
||||||
template<typename T> using Pool =_Pool<T, List<T>, Queue<T>>; ///<数据池模板
|
template<typename T> using Pool =_Pool<T, List<T>, Queue<T>, DataLifetimeCallback<T>>; ///<数据池模板
|
||||||
template<typename T> using ObjectPool =_Pool<T *, List<T *>, ObjectQueue<T>>; ///<对象池
|
template<typename T> using ObjectPool =_Pool<T *, List<T *>, ObjectQueue<T>, ObjectLifetimeCallback<T>>; ///<对象池
|
||||||
}//namespace hgl
|
}//namespace hgl
|
||||||
|
Loading…
x
Reference in New Issue
Block a user