redefine template Map

This commit is contained in:
hyzboy 2020-07-25 15:14:00 +08:00
parent dcaf7f8960
commit 081c7fd931
2 changed files with 134 additions and 147 deletions

View File

@ -8,8 +8,8 @@ namespace hgl
* @param flag
* @return -1
*/
template<typename F,typename T,typename DataPair>
int _Map<F,T,DataPair>::Find(const F &flag)const
template<typename K,typename V,typename DataPair>
int _Map<K,V,DataPair>::Find(const K &flag)const
{
int left=0,right=data_list.GetCount()-1; //使用left,right而不使用min,max是为了让代码能够更好的阅读。
int mid;
@ -41,8 +41,8 @@ namespace hgl
return(-1);
}
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::FindPos(const F &flag,int &pos)const
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::FindPos(const K &flag,int &pos)const
{
int left=0,right=data_list.GetCount()-1;
int mid;
@ -124,8 +124,8 @@ namespace hgl
return(false);
}
template<typename F,typename T,typename DataPair>
int _Map<F,T,DataPair>::FindByValue(const T &data)const
template<typename K,typename V,typename DataPair>
int _Map<K,V,DataPair>::FindByValue(const V &data)const
{
const int count=data_list.GetCount();
@ -148,51 +148,33 @@ namespace hgl
* @param data
* @return
*/
template<typename F,typename T,typename DataPair>
DataPair *_Map<F,T,DataPair>::Add(const F &flag,const T &data)
template<typename K,typename V,typename DataPair>
DataPair *_Map<K,V,DataPair>::Add(const K &flag,const V &data)
{
DataPair *ds=data_pool.Acquire();
DataPair *dp;
if(!data_pool.Acquire(dp))
return(nullptr);
ds->left=flag;
ds->right=data;
dp->left=flag;
dp->right=data;
int pos;
if(FindPos(flag,pos))
return(nullptr);
data_list.Insert(pos,ds);
data_list.Insert(pos,dp);
return(ds);
}
/**
*
* @param flag
* @return
*/
template<typename F,typename T,typename DataPair>
T &_Map<F,T,DataPair>::Add(const F &flag)
{
DataPair *ds=data_pool.Acquire();
ds->left=flag;
int pos;
FindPos(flag,pos);
data_list.Insert(pos,ds);
return ds->right;
return(dp);
}
/**
*
* @param obj
*/
template<typename F,typename T,typename DataPair>
void _Map<F,T,DataPair>::Add(DataPair *obj)
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::Add(DataPair *obj)
{
data_list.Insert(FindPos(obj->left),obj);
}
@ -203,8 +185,8 @@ namespace hgl
* @param data
* @return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::Get(const F &flag,T &data) const
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::Get(const K &flag,V &data) const
{
int index=Find(flag);
@ -218,8 +200,8 @@ namespace hgl
return(true);
}
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::Check(const F &key,const T &value) const
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::Check(const K &key,const V &value) const
{
int index=Find(key);
@ -238,8 +220,8 @@ namespace hgl
* @param t
* @return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::GetBySerial(int index,F &f,T &t) const
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::GetBySerial(int index,K &f,V &t) const
{
if(index<0||index>=data_list.GetCount())return(false);
@ -257,8 +239,8 @@ namespace hgl
* @param f
* @return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::GetKey(int index,F &f)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::GetKey(int index,K &f)
{
if(index<0||index>=data_list.GetCount())return(false);
@ -275,8 +257,8 @@ namespace hgl
* @param t
* @return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::GetValue(int index,T &t)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::GetValue(int index,V &t)
{
if(index<0||index>=data_list.GetCount())return(false);
@ -294,8 +276,8 @@ namespace hgl
* @param index
* @param t
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::SetValueBySerial(int index,T &t)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::SetValueBySerial(int index,V &t)
{
if(index<0||index>=data_list.GetCount())return(false);
@ -310,8 +292,8 @@ namespace hgl
* @param data
* @return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::Delete(const F &flag,T &data)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::Delete(const K &flag,V &data)
{
int index=Find(flag);
@ -333,8 +315,8 @@ namespace hgl
* @param flag
* @return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::DeleteByKey(const F &flag)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::DeleteByKey(const K &flag)
{
return DeleteBySerial(Find(flag));
}
@ -345,8 +327,8 @@ namespace hgl
* @param count
* @return
*/
template<typename F,typename T,typename DataPair>
int _Map<F,T,DataPair>::DeleteByKey(const F *fp,const int count)
template<typename K,typename V,typename DataPair>
int _Map<K,V,DataPair>::DeleteByKey(const K *fp,const int count)
{
if(!fp||count<=0)return(0);
@ -369,8 +351,8 @@ namespace hgl
* @param data
* @return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::DeleteByValue(const T &data)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::DeleteByValue(const V &data)
{
return DeleteBySerial(FindByValue(data));
}
@ -380,8 +362,8 @@ namespace hgl
* @param index
* @return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::DeleteBySerial(int index)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::DeleteBySerial(int index)
{
if(index<0
||index>=data_list.GetCount())return(false);
@ -398,8 +380,8 @@ namespace hgl
* @param number
* @return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::DeleteBySerial(int start,int number)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::DeleteBySerial(int start,int number)
{
DataPair **dp=data_list.GetData()+start;
@ -417,27 +399,35 @@ namespace hgl
* @param flag
* @param data
*/
template<typename F,typename T,typename DataPair>
void _Map<F,T,DataPair>::Update(const F &flag,const T &data)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::Update(const K &flag,const V &data)
{
int result;
DataPair *dp;
if(FindPos(flag,result))
{
DataPair *dp=GetListObject(data_list,result);
dp=GetListObject(data_list,result);
if(dp)
{
dp->right=data;
return(true);
}
}
else
{
DataPair *ds=data_pool.Acquire();
if(data_pool.Acquire(dp))
{
dp->left=flag;
dp->right=data;
ds->left=flag;
ds->right=data;
data_list.Insert(result,ds);
data_list.Insert(result,dp);
return(true);
}
}
return(false);
}
/**
@ -446,8 +436,8 @@ namespace hgl
* @param data
* @param return
*/
template<typename F,typename T,typename DataPair>
bool _Map<F,T,DataPair>::Change(const F &flag,const T &data)
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::Change(const K &flag,const V &data)
{
DataPair *dp=GetListObject(data_list,Find(flag));
@ -461,8 +451,8 @@ namespace hgl
/**
*
*/
template<typename F,typename T,typename DataPair>
void _Map<F,T,DataPair>::Clear()
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::Clear()
{
data_pool.ClearAll();
data_list.Clear();
@ -471,15 +461,15 @@ namespace hgl
/**
*
*/
template<typename F,typename T,typename DataPair>
void _Map<F,T,DataPair>::ClearData()
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::ClearData()
{
data_pool.ReleaseAll();
data_list.ClearData();
}
template<typename F,typename T,typename DataPair>
void _Map<F,T,DataPair>::operator=(const _Map<F,T,DataPair> &ftd)
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::operator=(const _Map<K,V,DataPair> &ftd)
{
Clear();
@ -491,11 +481,13 @@ namespace hgl
if(count<=0)
return;
IDItem **obj=ftd.data_list.GetData();
DataPair **obj=ftd.data_list.GetData();
DataPair *new_obj;
for(int i=0;i<count;i++)
{
IDItem *new_obj=data_pool.Acquire();
if(!data_pool.Acquire(new_obj))
break;
new_obj->left=(*obj)->left;
new_obj->right=(*obj)->right;
@ -506,15 +498,15 @@ namespace hgl
}
}
template<typename F,typename T,typename DataPair>
void _Map<F,T,DataPair>::Enum(void (*enum_func)(const F &,T))
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::Enum(void (*enum_func)(const K &,V))
{
const int count=data_list.GetCount();
if(count<=0)
return;
IDItem **idp=data_list.GetData();
DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
@ -524,15 +516,15 @@ namespace hgl
}
}
template<typename F,typename T,typename DataPair>
void _Map<F,T,DataPair>::EnumKey(void (*enum_func)(const F &))
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::EnumKey(void (*enum_func)(const K &))
{
const int count=data_list.GetCount();
if(count<=0)
return;
IDItem **idp=data_list.GetData();
DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
@ -542,15 +534,15 @@ namespace hgl
}
}
template<typename F,typename T,typename DataPair>
void _Map<F,T,DataPair>::EnumAllValue(void (*enum_func)(T))
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::EnumAllValue(void (*enum_func)(V))
{
const int count=data_list.GetCount();
if(count<=0)
return;
IDItem **idp=data_list.GetData();
DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
@ -560,15 +552,15 @@ namespace hgl
}
}
template<typename F,typename T,typename DataPair>
void _Map<F,T,DataPair>::EnumValue(bool (*enum_func)(T))
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::EnumValue(bool (*enum_func)(V))
{
const int count=data_list.GetCount();
if(count<=0)
return;
IDItem **idp=data_list.GetData();
DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++)
{

View File

@ -10,18 +10,14 @@ namespace hgl
/**
*
*/
template<typename F,typename T,typename DataPair> class _Map
template<typename K,typename V,typename DataPair> class _Map
{
public:
using IDItem=DataPair;
protected:
ObjectPool<IDItem> data_pool;
List<IDItem *> data_list;
ObjectPool<DataPair> data_pool;
List<DataPair *> data_list;
using this_calss=_Map<F,T,IDItem>;
using this_calss=_Map<K,V,DataPair>;
public: //方法
@ -30,40 +26,39 @@ namespace hgl
const int GetCount()const{return data_list.GetCount();} ///<取得数据总量
IDItem * Add(const F &,const T &); ///<添加一个数据数果索引已存在返回nullptr
T & Add(const F &); ///<添加一个数据
void Add(IDItem *); ///<添加一个数据
bool FindPos(const F &,int &)const; ///<查找数据如果插入后,会所在的位置,返回是否存在这个数据
int FindPos(const F &flag)const{int pos;FindPos(flag,pos);return(pos);} ///<查找数据如果插入后,会所在的位置
int Find(const F &)const; ///<查找数据是否存在,返回-1表示数据不存在
int FindByValue(const T &)const; ///<查找数据是否存在,返回-1表示数据不存在
bool KeyExist(const F &key)const{return(Find(key)!=-1);} ///<确认这个数据是否存在
bool ValueExist(const T &value)const{return(FindByValue(value)!=-1);} ///<确认这个数据是否存在
bool Check(const F &key,const T &value)const; ///<确认数据是否是这个
virtual bool Get(const F &,T &) const; ///<取得数据
virtual bool Delete(const F &,T &); ///<将指定数据从列表中移除,并获得这个数据
virtual bool DeleteByKey(const F &); ///<根据索引将指定数据从列表中移除
virtual int DeleteByKey(const F *,const int); ///<根据索引将指定数据从列表中批量移除
virtual bool DeleteByValue(const T &); ///<根据数据将指定数据从列表中移除
DataPair * Add(const K &,const V &); ///<添加一个数据数果索引已存在返回nullptr
void Add(DataPair *); ///<添加一个数据
bool FindPos(const K &,int &)const; ///<查找数据如果插入后,会所在的位置,返回是否存在这个数据
int FindPos(const K &flag)const{int pos;FindPos(flag,pos);return(pos);} ///<查找数据如果插入后,会所在的位置
int Find(const K &)const; ///<查找数据是否存在,返回-1表示数据不存在
int FindByValue(const V &)const; ///<查找数据是否存在,返回-1表示数据不存在
bool KeyExist(const K &key)const{return(Find(key)!=-1);} ///<确认这个数据是否存在
bool ValueExist(const V &value)const{return(FindByValue(value)!=-1);} ///<确认这个数据是否存在
bool Check(const K &key,const V &value)const; ///<确认数据是否是这个
virtual bool Get(const K &,V &) const; ///<取得数据
virtual bool Delete(const K &,V &); ///<将指定数据从列表中移除,并获得这个数据
virtual bool DeleteByKey(const K &); ///<根据索引将指定数据从列表中移除
virtual int DeleteByKey(const K *,const int); ///<根据索引将指定数据从列表中批量移除
virtual bool DeleteByValue(const V &); ///<根据数据将指定数据从列表中移除
virtual bool DeleteBySerial(int); ///<根据序号将指定数据从列表中移除
virtual bool DeleteBySerial(int,int); ///<根据序号将指定数据从列表中移除
virtual void Update(const F &,const T &); ///<更新一个数据的内容(如不存在则添加)
virtual bool Change(const F &,const T &); ///<更改一个数据的内容(如不存在则更改失效)
virtual bool Update(const K &,const V &); ///<更新一个数据的内容(如不存在则添加)
virtual bool Change(const K &,const V &); ///<更改一个数据的内容(如不存在则更改失效)
virtual void Clear(); ///<清除所有数据
virtual void ClearData(); ///<清除所有数据,但不释放内存
List<IDItem *> &GetList(){return data_list;} ///<取得线性列表
IDItem ** GetDataList()const{return data_list.GetData();} ///<取得纯数据线性列表
List<DataPair *> & GetList(){return data_list;} ///<取得线性列表
DataPair ** GetDataList()const{return data_list.GetData();} ///<取得纯数据线性列表
template<typename IT>
int GetKey(IT &il_list) ///<取得所有索引合集
int GetKey(IT &il_list) ///<取得所有索引合集
{
const int count=data_list.GetCount();
if(count<=0)
return count;
IDItem **idp=data_list.GetData();
DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
@ -82,7 +77,7 @@ namespace hgl
if(count<=0)
return count;
IDItem **idp=data_list.GetData();
DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
@ -93,22 +88,22 @@ namespace hgl
return count;
}
IDItem *GetItem(int n){return GetListObject(data_list,n);} ///<取指定序号的数据
bool GetBySerial(int,F &,T &) const; ///<取指定序号的数据
bool GetKey(int,F &); ///<取指定序号的索引
bool GetValue(int,T &); ///<取指定序号的数据
DataPair * GetItem(int n){return GetListObject(data_list,n);} ///<取指定序号的数据
bool GetBySerial(int,K &,V &) const; ///<取指定序号的数据
bool GetKey(int,K &); ///<取指定序号的索引
bool GetValue(int,V &); ///<取指定序号的数据
bool SetValueBySerial(int,T &); ///<根据序号设置数据
bool SetValueBySerial(int,V &); ///<根据序号设置数据
void operator=(const _Map<F,T,IDItem> &); ///<操作符重载,复制一个列表
void operator=(const _Map<K,V,DataPair> &); ///<操作符重载,复制一个列表
void Enum(void (*enum_func)(const F &,T)); ///<枚举所有数据项
void EnumKey(void (*enum_func)(const F &)); ///<枚举所有索引
void EnumAllValue(void (*enum_func)(T)); ///<枚举所有数值
void EnumValue(bool (*enum_func)(T)); ///<枚举所有数值(返回true/false表示是否继续)
void Enum(void (*enum_func)(const K &,V)); ///<枚举所有数据项
void EnumKey(void (*enum_func)(const K &)); ///<枚举所有索引
void EnumAllValue(void (*enum_func)(V)); ///<枚举所有数值
void EnumValue(bool (*enum_func)(V)); ///<枚举所有数值(返回true/false表示是否继续)
};//class _Map
template<typename F,typename T> class Map:public _Map<F,T,Pair<F,T> >
template<typename K,typename V> class Map:public _Map<K,V,Pair<K,V> >
{
public:
@ -126,13 +121,13 @@ namespace hgl
return result;
}
template<typename F,typename T,typename DataPair> class _MapObject:public _Map<F,T *,DataPair>
template<typename K,typename V,typename DataPair> class _MapObject:public _Map<K,V *,DataPair>
{
protected:
typedef _Map<F,T *,DataPair> SuperClass;
typedef _Map<K,V *,DataPair> SuperClass;
virtual void DeleteObject(const F &,T *)=0; ///<删除一个数据
virtual void DeleteObject(const K &,V *)=0; ///<删除一个数据
void DeleteObject(DataPair *ds)
{
if(!ds)return;
@ -163,7 +158,7 @@ namespace hgl
* @param flag
* @return
*/
bool UnlinkByKey(const F &flag)
bool UnlinkByKey(const K &flag)
{
return UnlinkBySerial(SuperClass::Find(flag));
}
@ -173,7 +168,7 @@ namespace hgl
* @param tp
* @return
*/
bool UnlinkByValue(T *tp)
bool UnlinkByValue(V *tp)
{
return UnlinkBySerial(this->FindByValue(tp));
}
@ -205,7 +200,7 @@ namespace hgl
* @param flag
* @return
*/
bool DeleteByKey(const F &flag)
bool DeleteByKey(const K &flag)
{
return DeleteBySerial(SuperClass::Find(flag));
}
@ -215,7 +210,7 @@ namespace hgl
* @param tp
* @return
*/
bool DeleteByValue(T *tp)
bool DeleteByValue(V *tp)
{
return DeleteBySerial(this->FindByValue(tp));
}
@ -245,7 +240,7 @@ namespace hgl
while(n--)
DeleteObject(n);
_Map<F,T *,DataPair>::Clear();
_Map<K,V *,DataPair>::Clear();
}
/**
@ -253,7 +248,7 @@ namespace hgl
* @param flag
* @param data
*/
void Update(const F &flag,T *data)
void Update(const K &flag,V *data)
{
int index=this->Find(flag);
@ -278,7 +273,7 @@ namespace hgl
* @param data
* @param return
*/
bool Change(const F &flag,T *data)
bool Change(const K &flag,V *data)
{
int index=this->Find(flag);
@ -301,33 +296,33 @@ namespace hgl
void Clear(){DeleteAll();}
};//class _MapObject
template<typename F,typename T,typename DataPair> class CusMapObject:public _MapObject<F,T,DataPair>
template<typename K,typename V,typename DataPair> class CusMapObject:public _MapObject<K,V,DataPair>
{
protected:
//virtual T * CreateObject(const F &){return(new T);} ///<创建一个数据
virtual void DeleteObject(const F &,T *obj){delete obj;} ///<删除一个数据
virtual void DeleteObject(const K &,V *obj){delete obj;} ///<删除一个数据
public:
CusMapObject()=default;
virtual ~CusMapObject()
{
_MapObject<F,T,DataPair>::Clear();
_MapObject<K,V,DataPair>::Clear();
}
};//class CusMapObject
template<typename F,typename T> class MapObject:public CusMapObject<F,T,Pair<F,T *> >
template<typename K,typename V> class MapObject:public CusMapObject<K,V,Pair<K,V *> >
{
public:
MapObject()=default;
virtual ~MapObject()
{
CusMapObject<F,T,Pair<F,T *> >::Clear();
CusMapObject<K,V,Pair<K,V *> >::Clear();
}
T *operator[](const F &index)const
V *operator[](const K &index)const
{
auto *obj=GetListObject(this->data_list,this->Find(index));