From d644ec4ab01e6fcede9ed3af37ff0090a19cf857 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Tue, 15 Aug 2023 14:41:30 +0800 Subject: [PATCH] fixed few design bug in LifetimeCallback/Map/ObjectManage/Pool --- inc/hgl/type/LifetimeCallback.h | 4 ++-- inc/hgl/type/Map.cpp | 22 ++++++++++++-------- inc/hgl/type/Map.h | 13 ++++++------ inc/hgl/type/ObjectManage.h | 37 +++++++++++++++++++++++---------- inc/hgl/type/Pool.h | 10 +++++---- 5 files changed, 53 insertions(+), 33 deletions(-) diff --git a/inc/hgl/type/LifetimeCallback.h b/inc/hgl/type/LifetimeCallback.h index c4a162e..007400c 100644 --- a/inc/hgl/type/LifetimeCallback.h +++ b/inc/hgl/type/LifetimeCallback.h @@ -33,7 +33,7 @@ namespace hgl */ template struct ObjectLifetimeCallback:public DataLifetimeCallback { - 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,int count) override @@ -54,6 +54,6 @@ namespace hgl */ template struct DefaultObjectLifetimeCallback:public ObjectLifetimeCallback { - virtual bool Create(T **obj) override {*obj=new T;return(true);} + virtual bool Create(T **obj) override {*obj=new T;return(true);} };//struct DefaultObjectLifetimeCallback }//namespace hgl diff --git a/inc/hgl/type/Map.cpp b/inc/hgl/type/Map.cpp index 08c13fe..981defc 100644 --- a/inc/hgl/type/Map.cpp +++ b/inc/hgl/type/Map.cpp @@ -152,14 +152,14 @@ namespace hgl template KVData *_Map::Add(const K &flag,const V &data) { - KVData *dp; + KVData *dp=new KVData; - if(!data_pool.GetOrCreate(dp)) - return(nullptr); - dp->key=flag; dp->value=data; + if(!data_pool.AppendToActive(dp)) + return(nullptr); + int pos; if(FindPos(flag,pos)) @@ -442,14 +442,18 @@ namespace hgl } else { - if(data_pool.GetOrCreate(dp)) + if(!data_pool.GetOrCreate(dp)) { - dp->key=flag; - dp->value=data; + dp=new KVData; - data_list.Insert(result,dp); - return(true); + data_pool.AppendToActive(dp); } + + dp->key=flag; + dp->value=data; + + data_list.Insert(result,dp); + return(true); } return(false); diff --git a/inc/hgl/type/Map.h b/inc/hgl/type/Map.h index 6c0ef17..9792bbc 100644 --- a/inc/hgl/type/Map.h +++ b/inc/hgl/type/Map.h @@ -167,7 +167,8 @@ namespace hgl typedef _Map SuperClass; - DataLifetimeCallback *olc; + ObjectLifetimeCallback *olc; + ObjectLifetimeCallback default_olc; void DeleteObject(KVData *ds) { @@ -186,7 +187,7 @@ namespace hgl _ObjectMap() { - olc=nullptr; + olc=&default_olc; } virtual ~_ObjectMap() @@ -194,7 +195,7 @@ namespace hgl Clear(); } - virtual void SetDataLifetimeCallback(DataLifetimeCallback *cb) ///<设定数据生命周期回调函数 + virtual void SetDataLifetimeCallback(ObjectLifetimeCallback *cb) ///<设定数据生命周期回调函数 { olc=cb; } @@ -281,10 +282,8 @@ namespace hgl */ void DeleteAll() { - int n=this->data_list.GetCount(); - - while(n--) - DeleteObject(n); + for(auto &it:this->data_list) + DeleteObject(it); SuperClass::Free(); } diff --git a/inc/hgl/type/ObjectManage.h b/inc/hgl/type/ObjectManage.h index 6ed34bf..2981cd9 100644 --- a/inc/hgl/type/ObjectManage.h +++ b/inc/hgl/type/ObjectManage.h @@ -26,32 +26,44 @@ namespace hgl protected: - _Map items; - protected: + ObjectLifetimeCallback *dlc; ///<数据生命周期回调函数 - virtual void Clear(V *obj){delete obj;} ///<对象释放虚拟函数(缺省为直接delete对象) + ObjectLifetimeCallback default_dlc; public: + ObjectManage() + { + dlc=&default_dlc; + } + virtual ~ObjectManage() { Clear(); } + virtual void SetDataLifetimeCallback(ObjectLifetimeCallback *cb) ///<设定数据生命周期回调函数 + { + dlc=cb; + } + virtual void Clear() ///<清除所有对象 { - int n=items.GetCount(); - - while(n--) + if(dlc) { - 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的对象 @@ -64,7 +76,9 @@ namespace hgl if(obj->ref_count<=0) { - Clear(obj->value); + if(dlc) + dlc->Clear(&(obj->value)); + items.DeleteAt(n); } } @@ -167,7 +181,8 @@ namespace hgl if(zero_clear) { - Clear(obj->value); + if(dlc) + dlc->Clear(&(obj->value)); items.DeleteAt(index); } diff --git a/inc/hgl/type/Pool.h b/inc/hgl/type/Pool.h index 27292e4..242ae2a 100644 --- a/inc/hgl/type/Pool.h +++ b/inc/hgl/type/Pool.h @@ -10,7 +10,7 @@ namespace hgl * 默认情部下空闲队列使用Queue模板管理(先入先出,总是使用最早扔进去的数据。可手动换成Stack运行性能更好,但逻辑性能更差。), * 活动队列使用List模板管理(无序)。 */ - template class _Pool ///数据池 + template class _Pool ///数据池 { protected: @@ -30,6 +30,8 @@ namespace hgl DataLifetimeCallback *dlc; ///<数据生命周期回调函数 + DEFAULT_DLC default_dlc; + public: //属性 int GetActiveCount() const{return Active.GetCount();} ///<取得活动数据数量 @@ -55,7 +57,7 @@ namespace hgl { max_active_count=0; history_max=0; - dlc=nullptr; + dlc=&default_dlc; } virtual ~_Pool() @@ -212,6 +214,6 @@ namespace hgl } };//template class _Pool - template using Pool =_Pool, Queue>; ///<数据池模板 - template using ObjectPool =_Pool, ObjectQueue>; ///<对象池 + template using Pool =_Pool, Queue, DataLifetimeCallback>; ///<数据池模板 + template using ObjectPool =_Pool, ObjectQueue, ObjectLifetimeCallback>; ///<对象池 }//namespace hgl