fixed few design bug in LifetimeCallback/Map/ObjectManage/Pool

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-08-15 14:41:30 +08:00
parent 3b71e680cc
commit d644ec4ab0
5 changed files with 53 additions and 33 deletions

View File

@ -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
@ -54,6 +54,6 @@ namespace hgl
*/ */
template<typename T> struct DefaultObjectLifetimeCallback:public ObjectLifetimeCallback<T> template<typename T> struct DefaultObjectLifetimeCallback:public ObjectLifetimeCallback<T>
{ {
virtual bool Create(T **obj) override {*obj=new T;return(true);} virtual bool Create(T **obj) override {*obj=new T;return(true);}
};//struct DefaultObjectLifetimeCallback };//struct DefaultObjectLifetimeCallback
}//namespace hgl }//namespace hgl

View File

@ -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,14 +442,18 @@ namespace hgl
} }
else else
{ {
if(data_pool.GetOrCreate(dp)) if(!data_pool.GetOrCreate(dp))
{ {
dp->key=flag; dp=new KVData;
dp->value=data;
data_list.Insert(result,dp); data_pool.AppendToActive(dp);
return(true);
} }
dp->key=flag;
dp->value=data;
data_list.Insert(result,dp);
return(true);
} }
return(false); return(false);

View File

@ -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();
} }

View File

@ -26,32 +26,44 @@ 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() ///<清除所有对象
{ {
int n=items.GetCount(); if(dlc)
while(n--)
{ {
KVObject *obj=items.GetItem(n); int n=items.GetCount();
Clear(obj->value); while(n--)
{
KVObject *obj=items.GetItem(n);
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);
} }

View File

@ -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