newly DataLifecycleManager in Map/ObjectManage/Queue/Stack

This commit is contained in:
hyzboy 2024-10-31 01:47:36 +08:00
parent 1fe8f51faa
commit bf8be47d3a
5 changed files with 100 additions and 101 deletions

View File

@ -9,7 +9,7 @@ namespace hgl
* @return -1 * @return -1
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
int _Map<K,V,KVData>::Find(const K &flag)const int MapTemplate<K,V,KVData>::Find(const K &flag)const
{ {
int left=0,right=data_list.GetCount()-1; //使用left,right而不使用min,max是为了让代码能够更好的阅读。 int left=0,right=data_list.GetCount()-1; //使用left,right而不使用min,max是为了让代码能够更好的阅读。
int mid; int mid;
@ -42,7 +42,7 @@ namespace hgl
} }
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::FindPos(const K &flag,int &pos)const bool MapTemplate<K,V,KVData>::FindPos(const K &flag,int &pos)const
{ {
int left=0,right=data_list.GetCount()-1; int left=0,right=data_list.GetCount()-1;
int mid; int mid;
@ -125,7 +125,7 @@ namespace hgl
} }
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
int _Map<K,V,KVData>::FindByValue(const V &data)const int MapTemplate<K,V,KVData>::FindByValue(const V &data)const
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
@ -150,7 +150,7 @@ namespace hgl
* @return * @return
*/ */
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 *MapTemplate<K,V,KVData>::Add(const K &flag,const V &data)
{ {
KVData *dp=new KVData; KVData *dp=new KVData;
@ -175,7 +175,7 @@ namespace hgl
* @param obj * @param obj
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::Add(KVData *obj) void MapTemplate<K,V,KVData>::Add(KVData *obj)
{ {
data_list.Insert(FindPos(obj->key),obj); data_list.Insert(FindPos(obj->key),obj);
} }
@ -185,7 +185,7 @@ namespace hgl
* Map<int ID,struct DATA>DATA需要复制会消耗一些时间DATA * * Map<int ID,struct DATA>DATA需要复制会消耗一些时间DATA *
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
V *_Map<K,V,KVData>::GetValuePointer(const K &key)const V *MapTemplate<K,V,KVData>::GetValuePointer(const K &key)const
{ {
int index=Find(key); int index=Find(key);
@ -205,7 +205,7 @@ namespace hgl
* @return ,<0 * @return ,<0
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
int _Map<K,V,KVData>::GetValueAndSerial(const K &flag,V &data) const int MapTemplate<K,V,KVData>::GetValueAndSerial(const K &flag,V &data) const
{ {
int index=Find(flag); int index=Find(flag);
@ -220,7 +220,7 @@ namespace hgl
} }
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::Check(const K &key,const V &value) const bool MapTemplate<K,V,KVData>::Check(const K &key,const V &value) const
{ {
int index=Find(key); int index=Find(key);
@ -240,7 +240,7 @@ namespace hgl
* @return * @return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::GetBySerial(int index,K &f,V &t) const bool MapTemplate<K,V,KVData>::GetBySerial(int index,K &f,V &t) const
{ {
if(index<0||index>=data_list.GetCount())return(false); if(index<0||index>=data_list.GetCount())return(false);
@ -262,7 +262,7 @@ namespace hgl
* @return * @return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::GetKey(int index,K &f) bool MapTemplate<K,V,KVData>::GetKey(int index,K &f)
{ {
if(index<0||index>=data_list.GetCount())return(false); if(index<0||index>=data_list.GetCount())return(false);
@ -283,7 +283,7 @@ namespace hgl
* @return * @return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::GetValue(int index,V &t) bool MapTemplate<K,V,KVData>::GetValue(int index,V &t)
{ {
if(index<0||index>=data_list.GetCount())return(false); if(index<0||index>=data_list.GetCount())return(false);
@ -303,7 +303,7 @@ namespace hgl
* @param t * @param t
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::SetValueBySerial(int index,V &t) bool MapTemplate<K,V,KVData>::SetValueBySerial(int index,V &t)
{ {
if(index<0||index>=data_list.GetCount())return(false); if(index<0||index>=data_list.GetCount())return(false);
@ -319,7 +319,7 @@ namespace hgl
* @return * @return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::Delete(const K &flag,V &data) bool MapTemplate<K,V,KVData>::Delete(const K &flag,V &data)
{ {
int index=Find(flag); int index=Find(flag);
@ -342,7 +342,7 @@ namespace hgl
* @return * @return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::DeleteByKey(const K &flag) bool MapTemplate<K,V,KVData>::DeleteByKey(const K &flag)
{ {
return DeleteAt(Find(flag)); return DeleteAt(Find(flag));
} }
@ -354,7 +354,7 @@ namespace hgl
* @return * @return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
int _Map<K,V,KVData>::DeleteByKey(const K *fp,const int count) int MapTemplate<K,V,KVData>::DeleteByKey(const K *fp,const int count)
{ {
if(!fp||count<=0)return(0); if(!fp||count<=0)return(0);
@ -378,7 +378,7 @@ namespace hgl
* @return * @return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::DeleteByValue(const V &data) bool MapTemplate<K,V,KVData>::DeleteByValue(const V &data)
{ {
return DeleteAt(FindByValue(data)); return DeleteAt(FindByValue(data));
} }
@ -389,7 +389,7 @@ namespace hgl
* @return * @return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::DeleteAt(int index) bool MapTemplate<K,V,KVData>::DeleteAt(int index)
{ {
if(index<0 if(index<0
||index>=data_list.GetCount())return(false); ||index>=data_list.GetCount())return(false);
@ -407,7 +407,7 @@ namespace hgl
* @return * @return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::DeleteAt(int start,int number) bool MapTemplate<K,V,KVData>::DeleteAt(int start,int number)
{ {
KVData **dp=data_list.GetData()+start; KVData **dp=data_list.GetData()+start;
@ -426,7 +426,7 @@ namespace hgl
* @param data * @param data
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::ChangeOrAdd(const K &flag,const V &data) bool MapTemplate<K,V,KVData>::ChangeOrAdd(const K &flag,const V &data)
{ {
int result; int result;
KVData *dp; KVData *dp;
@ -467,7 +467,7 @@ namespace hgl
* @param return * @param return
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::Change(const K &flag,const V &data) bool MapTemplate<K,V,KVData>::Change(const K &flag,const V &data)
{ {
KVData *dp=GetObjectFromList(data_list,Find(flag)); KVData *dp=GetObjectFromList(data_list,Find(flag));
@ -482,7 +482,7 @@ namespace hgl
* *
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::Free() void MapTemplate<K,V,KVData>::Free()
{ {
data_pool.Clear(); data_pool.Clear();
data_list.Free(); data_list.Free();
@ -492,14 +492,14 @@ namespace hgl
* *
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::Clear() void MapTemplate<K,V,KVData>::Clear()
{ {
data_pool.ReleaseActive(); data_pool.ReleaseActive();
data_list.Clear(); data_list.Clear();
} }
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::operator=(const ThisClass &ftd) void MapTemplate<K,V,KVData>::operator=(const ThisClass &ftd)
{ {
Free(); Free();
@ -529,7 +529,7 @@ namespace hgl
} }
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::Enum(void (*enum_func)(const K &,V &)) void MapTemplate<K,V,KVData>::Enum(void (*enum_func)(const K &,V &))
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
@ -547,7 +547,7 @@ namespace hgl
} }
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::EnumKey(void (*enum_func)(const K &)) void MapTemplate<K,V,KVData>::EnumKey(void (*enum_func)(const K &))
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
@ -565,7 +565,7 @@ namespace hgl
} }
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::EnumAllValue(void (*enum_func)(V &)) void MapTemplate<K,V,KVData>::EnumAllValue(void (*enum_func)(V &))
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
@ -583,7 +583,7 @@ namespace hgl
} }
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::EnumValue(bool (*enum_func)(V &)) void MapTemplate<K,V,KVData>::EnumValue(bool (*enum_func)(V &))
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
@ -605,7 +605,7 @@ namespace hgl
* in_list中出现的数据with_list * in_list中出现的数据with_list
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::WithList(_Map<K,V,KVData>::KVDataList &with_list,const List<K> &in_list) void MapTemplate<K,V,KVData>::WithList(MapTemplate<K,V,KVData>::KVDataList &with_list,const List<K> &in_list)
{ {
with_list.Clear(); with_list.Clear();
const int count=this->GetCount(); const int count=this->GetCount();
@ -629,7 +629,7 @@ namespace hgl
* in_list中的数据without_list * in_list中的数据without_list
*/ */
template<typename K,typename V,typename KVData> template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::WithoutList(_Map<K,V,KVData>::KVDataList &without_list,const List<K> &in_list) void MapTemplate<K,V,KVData>::WithoutList(MapTemplate<K,V,KVData>::KVDataList &without_list,const List<K> &in_list)
{ {
without_list.Clear(); without_list.Clear();
const int count=this->GetCount(); const int count=this->GetCount();

View File

@ -1,5 +1,4 @@
#ifndef HGL_MAP_INCLUDE #pragma once
#define HGL_MAP_INCLUDE
#include<hgl/type/List.h> #include<hgl/type/List.h>
#include<hgl/type/Pair.h> #include<hgl/type/Pair.h>
@ -16,11 +15,11 @@ namespace hgl
/** /**
* *
*/ */
template<typename K,typename V,typename KVData> class _Map template<typename K,typename V,typename KVData> class MapTemplate
{ {
protected: protected:
using ThisClass=_Map<K,V,KVData>; using ThisClass=MapTemplate<K,V,KVData>;
using KVDataPool=ObjectPool<KVData>; using KVDataPool=ObjectPool<KVData>;
using KVDataList=List<KVData *>; using KVDataList=List<KVData *>;
@ -35,8 +34,8 @@ namespace hgl
public: //方法 public: //方法
_Map()=default; MapTemplate()=default;
virtual ~_Map()=default; virtual ~MapTemplate()=default;
const int GetCount()const{return data_list.GetCount();} ///<取得数据总量 const int GetCount()const{return data_list.GetCount();} ///<取得数据总量
const bool IsEmpty()const{return data_list.IsEmpty();} ///<是否为空 const bool IsEmpty()const{return data_list.IsEmpty();} ///<是否为空
@ -141,9 +140,9 @@ namespace hgl
void WithList(KVDataList &with_list,const List<K> &in_list); ///<统计出所有在in_list中出现的数据产生的结果写入with_list void WithList(KVDataList &with_list,const List<K> &in_list); ///<统计出所有在in_list中出现的数据产生的结果写入with_list
void WithoutList(KVDataList &without_list,const List<K> &in_list); ///<统计出所有没有出现在in_list中的数据产生的结果写入without_list void WithoutList(KVDataList &without_list,const List<K> &in_list); ///<统计出所有没有出现在in_list中的数据产生的结果写入without_list
};//class _Map };//class MapTemplate
template<typename K,typename V> class Map:public _Map<K,V,KeyValue<K,V> > template<typename K,typename V> class Map:public MapTemplate<K,V,KeyValue<K,V> >
{ {
public: public:
@ -161,21 +160,19 @@ namespace hgl
return result; return result;
} }
template<typename K,typename V,typename KVData> class _ObjectMap:public _Map<K,V *,KVData> template<typename K,typename V,typename KVData> class ObjectMapTemplate:public MapTemplate<K,V *,KVData>
{ {
protected: protected:
typedef _Map<K,V *,KVData> SuperClass; typedef MapTemplate<K,V *,KVData> SuperClass;
ObjectLifecycleManager<V> *olc; ObjectLifecycleManager<V> *olm;
ObjectLifecycleManager<V> default_olc;
void DeleteObject(KVData *ds) void DeleteObject(KVData *ds)
{ {
if(!ds)return; if(!ds)return;
if(olc) olm->Clear(&(ds->value));
olc->Clear(&(ds->value));
} }
void DeleteObject(int index) void DeleteObject(int index)
@ -185,21 +182,16 @@ namespace hgl
public: public:
_ObjectMap() ObjectMapTemplate(ObjectLifecycleManager<V> *_olm)
{ {
olc=&default_olc; olm=_olm;
} }
virtual ~_ObjectMap() virtual ~ObjectMapTemplate()
{ {
Clear(); Clear();
} }
virtual void SetDataLifetimeCallback(ObjectLifecycleManager<V> *cb) ///<设定数据生命周期回调函数
{
olc=cb;
}
/** /**
* *
* @param flag * @param flag
@ -349,9 +341,19 @@ namespace hgl
else else
return nullptr; return nullptr;
}; };
};//class _ObjectMap };//class ObjectMapTemplate
template<typename K,typename V> using ObjectMap=_ObjectMap<K,V,KeyValue<K,V *> >; template<typename K,typename V> class ObjectMap:public ObjectMapTemplate<K,V,KeyValue<K,V *>>
{
protected:
ObjectLifecycleManager<V> DefaultOLM;
public:
ObjectMap():ObjectMapTemplate(&DefaultOLM){};
virtual ~ObjectMap()=default;
};//template<typename K,typename V> class ObjectMap:public ObjectMapTemplate<K,V,KeyValue<K,V *>>
}//namespace hgl }//namespace hgl
#include<hgl/type/Map.cpp> #include<hgl/type/Map.cpp>
#endif//HGL_MAP_INCLUDE

View File

@ -26,7 +26,7 @@ namespace hgl
protected: protected:
_Map<K,V *,KVObject> items; MapTemplate<K,V *,KVObject> items;
ObjectLifecycleManager<V> *olm; ///<数据生命周期回调函数 ObjectLifecycleManager<V> *olm; ///<数据生命周期回调函数

View File

@ -171,11 +171,11 @@ namespace hgl
template<typename T> class ObjectQueue:public QueueTemplate<T *> ///对象队列 template<typename T> class ObjectQueue:public QueueTemplate<T *> ///对象队列
{ {
DefaultObjectLifetimeCallback<T> default_olc; ObjectLifecycleManager<T> DefaultOLM;
public: public:
ObjectQueue():QueueTemplate(&default_olc){} ObjectQueue():QueueTemplate(&DefaultOLM){}
virtual ~ObjectQueue() override { Free(); } virtual ~ObjectQueue() override { Free(); }
virtual bool Push(T *obj) virtual bool Push(T *obj)
@ -192,27 +192,19 @@ namespace hgl
return Queue<T *>::Push(obj_list,count); return Queue<T *>::Push(obj_list,count);
} }
//virtual T *Pop() T *Pop()
//{
// T *obj;
// if(!Queue<T *>::Pop(obj))
// return(nullptr);
// return obj;
//}
void Clear(DataLifecycleManager<T *> *olc=nullptr)
{ {
if(!olc) T *obj;
olc=&default_olc;
Queue<T *>::Clear(olc); if(!Queue<T *>::Pop(obj))
return(nullptr);
return obj;
} }
void Free(DataLifecycleManager<T *> *olc=nullptr) void Free()
{ {
ObjectQueue<T>::Clear(olc); ObjectQueue<T>::Clear();
this->data_array[0].Free(); this->data_array[0].Free();
this->data_array[1].Free(); this->data_array[1].Free();

View File

@ -1,16 +1,18 @@
#pragma once #pragma once
#include<hgl/type/DataArray.h> #include<hgl/type/DataArray.h>
#include<hgl/type/LifetimeCallback.h> #include<hgl/type/LifecycleManager.h>
namespace hgl namespace hgl
{ {
/** /**
* Stack模板类用于保存一个先进后出 * Stack模板类用于保存一个先进后出
*/ */
template<typename T> class Stack ///堆栈顺序数据访问类 template<typename T> class StackTemplate ///堆栈顺序数据访问类
{ {
protected: protected:
DataLifecycleManager<T> *dlm;
DataArray<T> data_array; DataArray<T> data_array;
public: //属性 public: //属性
@ -38,8 +40,8 @@ namespace hgl
public: //方法 public: //方法
Stack()=default; StackTemplate(DataLifecycleManager<T> *_dlm){dlm=_dlm;}
virtual ~Stack()=default; virtual ~StackTemplate()=default;
virtual bool Push(T *data,int count) ///<压入多个数据 virtual bool Push(T *data,int count) ///<压入多个数据
{ {
@ -87,15 +89,14 @@ namespace hgl
public: public:
virtual void Clear (DataLifecycleManager<T> *dlm=nullptr) ///<清除所有数据 virtual void Clear () ///<清除所有数据
{ {
if(dlm)
dlm->Clear(data_array.GetData(),data_array.GetCount()); dlm->Clear(data_array.GetData(),data_array.GetCount());
data_array.Clear(); data_array.Clear();
} }
virtual void Free (DataLifecycleManager<T> *dlm=nullptr) ///<清除所有数据并释放内存 virtual void Free () ///<清除所有数据并释放内存
{ {
Clear(dlm); Clear(dlm);
data_array.Free(); data_array.Free();
@ -109,15 +110,27 @@ namespace hgl
} }
virtual void operator =(const Stack<T> &s){this->operator=(s.data_array);} virtual void operator =(const Stack<T> &s){this->operator=(s.data_array);}
};//template<typename T> class Stack };//template<typename T> class StackTemplate
template<typename T> class ObjectStack:public Stack<T *> ///堆栈对象 template<typename T> class Stack:public StackTemplate<T>
{ {
DefaultObjectLifetimeCallback<T> default_olc; protected:
DataLifecycleManager<T> DefaultDLM;
public: public:
using Stack<T *>::Stack; Stack():StackTemplate(&DefaultDLM){};
virtual ~Stack()=default;
};//template<typename T> class Stack:public StackTemplate<T>
template<typename T> class ObjectStack:public StackTemplate<T *> ///堆栈对象
{
ObjectLifecycleManager<T> DefaultOLM;
public:
ObjectStack():StackTemplate(&DefaultOLM){}
virtual ~ObjectStack() override {Free();} virtual ~ObjectStack() override {Free();}
virtual bool Push(T *obj) virtual bool Push(T *obj)
@ -127,7 +140,7 @@ namespace hgl
return Stack<T *>::Push(obj); return Stack<T *>::Push(obj);
} }
virtual T *Pop() T *Pop()
{ {
T *obj; T *obj;
@ -137,17 +150,9 @@ namespace hgl
return obj; return obj;
} }
void Clear(ObjectLifecycleManager<T> *olc=nullptr) void Free()
{ {
if(!olc) ObjectStack<T>::Clear();
olc=&default_olc;
Stack<T *>::Clear(olc);
}
void Free(ObjectLifecycleManager<T> *olc=nullptr)
{
ObjectStack<T>::Clear(olc);
this->data_array.Free(); this->data_array.Free();
} }