used the KeyValue instead Pair

This commit is contained in:
2023-04-20 21:26:46 +08:00
parent aebc004e2c
commit a377fe8d05
4 changed files with 165 additions and 159 deletions

View File

@@ -8,24 +8,24 @@ namespace hgl
* @param flag 数据标识
* @return 数据所在索引,-1表示不存在
*/
template<typename K,typename V,typename DataPair>
int _Map<K,V,DataPair>::Find(const K &flag)const
template<typename K,typename V,typename KVData>
int _Map<K,V,KVData>::Find(const K &flag)const
{
int left=0,right=data_list.GetCount()-1; //使用left,right而不使用min,max是为了让代码能够更好的阅读。
int mid;
DataPair **data_array=data_list.GetData();
KVData **data_array=data_list.GetData();
while(left<=right)
{
if(data_array[left ]->left==flag)return(left);
if(data_array[right]->left==flag)return(right);
if(data_array[left ]->key==flag)return(left);
if(data_array[right]->key==flag)return(right);
mid=(right+left)>>1;
if(data_array[mid]->left==flag)return(mid);
if(data_array[mid]->key==flag)return(mid);
if(data_array[mid]->left>flag)
if(data_array[mid]->key>flag)
{
++left;
right=mid-1;
@@ -41,35 +41,35 @@ namespace hgl
return(-1);
}
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::FindPos(const K &flag,int &pos)const
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::FindPos(const K &flag,int &pos)const
{
int left=0,right=data_list.GetCount()-1;
int mid;
DataPair **data_array=data_list.GetData();
KVData **data_array=data_list.GetData();
while(left<=right)
{
if(data_array[left ]->left>flag)
if(data_array[left ]->key>flag)
{
pos=left;
return(false);
}
else
if(data_array[left ]->left==flag)
if(data_array[left ]->key==flag)
{
pos=left;
return(true);
}
if(data_array[right]->left<flag)
if(data_array[right]->key<flag)
{
pos=right+1;
return(false);
}
else
if(data_array[right]->left==flag)
if(data_array[right]->key==flag)
{
pos=right;
return(true);
@@ -77,21 +77,21 @@ namespace hgl
mid=(right+left)>>1;
if(data_array[mid]->left==flag)
if(data_array[mid]->key==flag)
{
pos=mid;
return(true);
}
if(data_array[mid]->left>flag)
if(data_array[mid]->key>flag)
{
if(data_array[mid-1]->left<flag)
if(data_array[mid-1]->key<flag)
{
pos=mid;
return(false);
}
else
if(data_array[mid-1]->left==flag)
if(data_array[mid-1]->key==flag)
{
pos=mid-1;
return(true);
@@ -102,13 +102,13 @@ namespace hgl
}
else
{
if(data_array[mid+1]->left>flag)
if(data_array[mid+1]->key>flag)
{
pos=mid+1;
return(false);
}
else
if(data_array[mid+1]->left==flag)
if(data_array[mid+1]->key==flag)
{
pos=mid+1;
return(true);
@@ -124,16 +124,16 @@ namespace hgl
return(false);
}
template<typename K,typename V,typename DataPair>
int _Map<K,V,DataPair>::FindByValue(const V &data)const
template<typename K,typename V,typename KVData>
int _Map<K,V,KVData>::FindByValue(const V &data)const
{
const int count=data_list.GetCount();
DataPair **data_array=data_list.GetData();
KVData **data_array=data_list.GetData();
for(int i=0;i<count;i++)
{
if((*data_array)->right==data)
if((*data_array)->value==data)
return(i);
++data_array;
@@ -148,16 +148,16 @@ namespace hgl
* @param data 数据
* @return 新创建好的数据结构
*/
template<typename K,typename V,typename DataPair>
DataPair *_Map<K,V,DataPair>::Add(const K &flag,const V &data)
template<typename K,typename V,typename KVData>
KVData *_Map<K,V,KVData>::Add(const K &flag,const V &data)
{
DataPair *dp;
KVData *dp;
if(!data_pool.Acquire(dp))
return(nullptr);
dp->left=flag;
dp->right=data;
dp->key=flag;
dp->value=data;
int pos;
@@ -173,10 +173,10 @@ namespace hgl
* 添加一个数据
* @param obj 数据
*/
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::Add(DataPair *obj)
template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::Add(KVData *obj)
{
data_list.Insert(FindPos(obj->left),obj);
data_list.Insert(FindPos(obj->key),obj);
}
/**
@@ -185,32 +185,32 @@ namespace hgl
* @param data 数据存放处
* @return 数据序号,<0表示失败
*/
template<typename K,typename V,typename DataPair>
int _Map<K,V,DataPair>::GetValueAndSerial(const K &flag,V &data) const
template<typename K,typename V,typename KVData>
int _Map<K,V,KVData>::GetValueAndSerial(const K &flag,V &data) const
{
int index=Find(flag);
DataPair *obj=GetListObject(data_list,index);
KVData *obj=GetListObject(data_list,index);
if(!obj)
return(-1);
data=obj->right;
data=obj->value;
return(index);
}
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::Check(const K &key,const V &value) const
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::Check(const K &key,const V &value) const
{
int index=Find(key);
DataPair *obj=GetListObject(data_list,index);
KVData *obj=GetListObject(data_list,index);
if(!obj)
return(false);
return (value==obj->right);
return (value==obj->value);
}
/**
@@ -220,18 +220,18 @@ namespace hgl
* @param t 数据存放处
* @return 是否取得成功
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::GetBySerial(int index,K &f,V &t) const
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::GetBySerial(int index,K &f,V &t) const
{
if(index<0||index>=data_list.GetCount())return(false);
DataPair *ds;
KVData *ds;
if(!data_list.Get(index,ds))
return(false);
f=ds->left;
t=ds->right;
f=ds->key;
t=ds->value;
return(true);
}
@@ -242,17 +242,17 @@ namespace hgl
* @param f 数据索引存放处
* @return 是否取得成功
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::GetKey(int index,K &f)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::GetKey(int index,K &f)
{
if(index<0||index>=data_list.GetCount())return(false);
DataPair *ds;
KVData *ds;
if(!data_list.Get(index,ds))
return(false);
f=ds->left;
f=ds->key;
return(true);
}
@@ -263,17 +263,17 @@ namespace hgl
* @param t 数据存放处
* @return 是否取得成功
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::GetValue(int index,V &t)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::GetValue(int index,V &t)
{
if(index<0||index>=data_list.GetCount())return(false);
DataPair *ds;
KVData *ds;
if(!data_list.Get(index,ds))
return(false);
t=ds->right;
t=ds->value;
return(true);
}
@@ -283,12 +283,12 @@ namespace hgl
* @param index 数据序号
* @param t 数据
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::SetValueBySerial(int index,V &t)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::SetValueBySerial(int index,V &t)
{
if(index<0||index>=data_list.GetCount())return(false);
data_list[index]->right=t;
data_list[index]->value=t;
return(true);
}
@@ -299,17 +299,17 @@ namespace hgl
* @param data 数据存放位处
* @return 是否成功
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::Delete(const K &flag,V &data)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::Delete(const K &flag,V &data)
{
int index=Find(flag);
DataPair *dp=GetListObject(data_list,index);
KVData *dp=GetListObject(data_list,index);
if(!dp)
return(false);
data=dp->right;
data=dp->value;
data_pool.Release(dp);
data_list.DeleteMove(index);
@@ -322,8 +322,8 @@ namespace hgl
* @param flag 索引
* @return 是否成功
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::DeleteByKey(const K &flag)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::DeleteByKey(const K &flag)
{
return DeleteBySerial(Find(flag));
}
@@ -334,8 +334,8 @@ namespace hgl
* @param count 索引数量
* @return 是否成功
*/
template<typename K,typename V,typename DataPair>
int _Map<K,V,DataPair>::DeleteByKey(const K *fp,const int count)
template<typename K,typename V,typename KVData>
int _Map<K,V,KVData>::DeleteByKey(const K *fp,const int count)
{
if(!fp||count<=0)return(0);
@@ -358,8 +358,8 @@ namespace hgl
* @param data 数据
* @return 是否成功
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::DeleteByValue(const V &data)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::DeleteByValue(const V &data)
{
return DeleteBySerial(FindByValue(data));
}
@@ -369,8 +369,8 @@ namespace hgl
* @param index 序号
* @return 是否成功
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::DeleteBySerial(int index)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::DeleteBySerial(int index)
{
if(index<0
||index>=data_list.GetCount())return(false);
@@ -387,10 +387,10 @@ namespace hgl
* @param number 数量
* @return 是否成功
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::DeleteBySerial(int start,int number)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::DeleteBySerial(int start,int number)
{
DataPair **dp=data_list.GetData()+start;
KVData **dp=data_list.GetData()+start;
for(int i=0;i<number;i++)
{
@@ -406,11 +406,11 @@ namespace hgl
* @param flag 数据标识
* @param data 新的数据内容
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::ChangeOrAdd(const K &flag,const V &data)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::ChangeOrAdd(const K &flag,const V &data)
{
int result;
DataPair *dp;
KVData *dp;
if(FindPos(flag,result))
{
@@ -418,7 +418,7 @@ namespace hgl
if(dp)
{
dp->right=data;
dp->value=data;
return(true);
}
}
@@ -426,8 +426,8 @@ namespace hgl
{
if(data_pool.Acquire(dp))
{
dp->left=flag;
dp->right=data;
dp->key=flag;
dp->value=data;
data_list.Insert(result,dp);
return(true);
@@ -443,23 +443,23 @@ namespace hgl
* @param data 新的数据内容
* @param return 是否更改成功
*/
template<typename K,typename V,typename DataPair>
bool _Map<K,V,DataPair>::Change(const K &flag,const V &data)
template<typename K,typename V,typename KVData>
bool _Map<K,V,KVData>::Change(const K &flag,const V &data)
{
DataPair *dp=GetListObject(data_list,Find(flag));
KVData *dp=GetListObject(data_list,Find(flag));
if(!dp)
return(false);
dp->right=data;
dp->value=data;
return(true);
}
/**
* 清除所有数据
*/
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::Clear()
template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::Clear()
{
data_pool.ClearAll();
data_list.Clear();
@@ -468,15 +468,15 @@ namespace hgl
/**
* 清除所有数据,但不释放内存
*/
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::ClearData()
template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::ClearData()
{
data_pool.ReleaseAll();
data_list.ClearData();
}
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::operator=(const ThisClass &ftd)
template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::operator=(const ThisClass &ftd)
{
Clear();
@@ -488,16 +488,16 @@ namespace hgl
if(count<=0)
return;
DataPair **obj=ftd.data_list.GetData();
DataPair *new_obj;
KVData **obj=ftd.data_list.GetData();
KVData *new_obj;
for(int i=0;i<count;i++)
{
if(!data_pool.Acquire(new_obj))
break;
new_obj->left=(*obj)->left;
new_obj->right=(*obj)->right;
new_obj->key=(*obj)->key;
new_obj->value=(*obj)->value;
data_list.Add(new_obj);
@@ -505,73 +505,73 @@ namespace hgl
}
}
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::Enum(void (*enum_func)(const K &,V))
template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::Enum(void (*enum_func)(const K &,V))
{
const int count=data_list.GetCount();
if(count<=0)
return;
DataPair **idp=data_list.GetData();
KVData **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
enum_func((*idp)->left,(*idp)->right);
enum_func((*idp)->key,(*idp)->value);
++idp;
}
}
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::EnumKey(void (*enum_func)(const K &))
template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::EnumKey(void (*enum_func)(const K &))
{
const int count=data_list.GetCount();
if(count<=0)
return;
DataPair **idp=data_list.GetData();
KVData **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
enum_func((*idp)->left);
enum_func((*idp)->key);
++idp;
}
}
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::EnumAllValue(void (*enum_func)(V))
template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::EnumAllValue(void (*enum_func)(V))
{
const int count=data_list.GetCount();
if(count<=0)
return;
DataPair **idp=data_list.GetData();
KVData **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
enum_func((*idp)->right);
enum_func((*idp)->value);
++idp;
}
}
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::EnumValue(bool (*enum_func)(V))
template<typename K,typename V,typename KVData>
void _Map<K,V,KVData>::EnumValue(bool (*enum_func)(V))
{
const int count=data_list.GetCount();
if(count<=0)
return;
DataPair **idp=data_list.GetData();
KVData **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
if(!enum_func((*idp)->right))
if(!enum_func((*idp)->value))
return;
++idp;
@@ -581,8 +581,8 @@ namespace hgl
/**
* 统计出所有在in_list中出现的数据产生的结果写入with_list
*/
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::WithList(_Map<K,V,DataPair>::DataPairList &with_list,const List<K> &in_list)
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)
{
with_list.ClearData();
const int count=this->GetCount();
@@ -591,7 +591,7 @@ namespace hgl
with_list.PreMalloc(count);
const DataPair *sp=this->GetDataList();
const KVData *sp=this->GetDataList();
for(int i=0;i<count;i++)
{
@@ -605,8 +605,8 @@ namespace hgl
/**
* 统计出所有没有出现在in_list中的数据产生的结果写入without_list
*/
template<typename K,typename V,typename DataPair>
void _Map<K,V,DataPair>::WithoutList(_Map<K,V,DataPair>::DataPairList &without_list,const List<K> &in_list)
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)
{
without_list.ClearData();
const int count=this->GetCount();
@@ -615,7 +615,7 @@ namespace hgl
without_list.PreMalloc(count);
const DataPair *sp=this->GetDataList();
const KVData *sp=this->GetDataList();
for(int i=0;i<count;i++)
{

View File

@@ -7,25 +7,31 @@
#include<hgl/thread/RWLock.h>
namespace hgl
{
template<typename K,typename V> struct KeyValue
{
K key;
V value;
};
/**
* 索引数据模板
*/
template<typename K,typename V,typename DataPair> class _Map
template<typename K,typename V,typename KVData> class _Map
{
protected:
using ThisClass=_Map<K,V,DataPair>;
using ThisClass=_Map<K,V,KVData>;
using DataPairPool=ObjectPool<DataPair>;
using DataPairList=List<DataPair *>;
using KVDataPool=ObjectPool<KVData>;
using KVDataList=List<KVData *>;
DataPairPool data_pool;
DataPairList data_list;
KVDataPool data_pool;
KVDataList data_list;
public:
// DataPair **begin()const{return data_list.begin();}
// DataPair **end()const{return data_list.end();}
// KVData **begin()const{return data_list.begin();}
// KVData **end()const{return data_list.end();}
public: //方法
@@ -35,8 +41,8 @@ namespace hgl
const int GetCount()const{return data_list.GetCount();} ///<取得数据总量
const bool IsEmpty()const{return data_list.IsEmpty();} ///<是否为空
DataPair * Add(const K &,const V &); ///<添加一个数据数果索引已存在返回nullptr
void Add(DataPair *); ///<添加一个数据
KVData *Add(const K &,const V &); ///<添加一个数据数果索引已存在返回nullptr
void Add(KVData *); ///<添加一个数据
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表示数据不存在
@@ -57,8 +63,8 @@ namespace hgl
virtual void Clear(); ///<清除所有数据
virtual void ClearData(); ///<清除所有数据,但不释放内存
DataPairList & GetList(){return data_list;} ///<取得线性列表
DataPair ** GetDataList()const{return data_list.GetData();} ///<取得纯数据线性列表
KVDataList & GetList(){return data_list;} ///<取得线性列表
KVData ** GetDataList()const{return data_list.GetData();} ///<取得纯数据线性列表
template<typename IT>
int GetKeyList(IT &il_list) ///<取得所有索引合集
@@ -68,11 +74,11 @@ namespace hgl
if(count<=0)
return count;
DataPair **idp=data_list.GetData();
KVData **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
il_list.Add((*idp)->left);
il_list.Add((*idp)->key);
++idp;
}
@@ -87,11 +93,11 @@ namespace hgl
if(count<=0)
return count;
DataPair **idp=data_list.GetData();
KVData **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
il_list.Add((*idp)->right);
il_list.Add((*idp)->value);
++idp;
}
@@ -106,12 +112,12 @@ namespace hgl
if(count<=0)
return count;
DataPair **idp=data_list.GetData();
KVData **idp=data_list.GetData();
for(int i=0;i<count;i++)
{
key_list.Add((*idp)->left);
value_list.Add((*idp)->right);
key_list.Add((*idp)->key);
value_list.Add((*idp)->value);
++idp;
}
@@ -119,7 +125,7 @@ namespace hgl
}
DataPair * GetItem(int n){return GetListObject(data_list,n);} ///<取指定序号的数据
KVData *GetItem(int n){return GetListObject(data_list,n);} ///<取指定序号的数据
bool GetBySerial(int,K &,V &) const; ///<取指定序号的数据
bool GetKey(int,K &); ///<取指定序号的索引
bool GetValue(int,V &); ///<取指定序号的数据
@@ -133,11 +139,11 @@ namespace hgl
void EnumAllValue(void (*enum_func)(V)); ///<枚举所有数值
void EnumValue(bool (*enum_func)(V)); ///<枚举所有数值(返回true/false表示是否继续)
void WithList(DataPairList &with_list,const List<K> &in_list); ///<统计出所有在in_list中出现的数据产生的结果写入with_list
void WithoutList(DataPairList &without_list,const List<K> &in_list); ///<统计出所有没有出现在in_list中的数据产生的结果写入without_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
};//class _Map
template<typename K,typename V> class Map:public _Map<K,V,Pair<K,V> >
template<typename K,typename V> class Map:public _Map<K,V,KeyValue<K,V> >
{
public:
@@ -155,19 +161,19 @@ namespace hgl
return result;
}
template<typename K,typename V,typename DataPair> class _ObjectMap:public _Map<K,V *,DataPair>
template<typename K,typename V,typename KVData> class _ObjectMap:public _Map<K,V *,KVData>
{
protected:
typedef _Map<K,V *,DataPair> SuperClass;
typedef _Map<K,V *,KVData> SuperClass;
virtual void DeleteObject(const K &,V *)=0; ///<删除一个数据
void DeleteObject(DataPair *ds)
void DeleteObject(KVData *ds)
{
if(!ds)return;
if(ds->right) ///<存在数据就是nullptr的可能
DeleteObject(ds->left,ds->right);
if(ds->value) ///<存在数据就是nullptr的可能
DeleteObject(ds->key,ds->value);
}
void DeleteObject(int index)
@@ -274,7 +280,7 @@ namespace hgl
while(n--)
DeleteObject(n);
_Map<K,V *,DataPair>::Clear();
_Map<K,V *,KVData>::Clear();
}
/**
@@ -290,10 +296,10 @@ namespace hgl
{
DeleteObject(index);
DataPair *dp=GetListObject(this->data_list,index);
KVData *dp=GetListObject(this->data_list,index);
if(dp)
dp->right=data;
dp->value=data;
}
else
{
@@ -315,12 +321,12 @@ namespace hgl
{
DeleteObject(index);
DataPair *dp=GetListObject(this->data_list,index);
KVData *dp=GetListObject(this->data_list,index);
if(!dp)
return(false);
dp->right=data;
dp->value=data;
return(true);
}
else
@@ -330,7 +336,7 @@ namespace hgl
void Clear(){DeleteAll();}
};//class _ObjectMap
template<typename K,typename V,typename DataPair> class CustomObjectMap:public _ObjectMap<K,V,DataPair>
template<typename K,typename V,typename KVData> class CustomObjectMap:public _ObjectMap<K,V,KVData>
{
protected:
@@ -342,18 +348,18 @@ namespace hgl
CustomObjectMap()=default;
virtual ~CustomObjectMap()
{
_ObjectMap<K,V,DataPair>::Clear();
_ObjectMap<K,V,KVData>::Clear();
}
};//class CustomObjectMap
template<typename K,typename V> class ObjectMap:public CustomObjectMap<K,V,Pair<K,V *> >
template<typename K,typename V> class ObjectMap:public CustomObjectMap<K,V,KeyValue<K,V *> >
{
public:
ObjectMap()=default;
virtual ~ObjectMap()
{
CustomObjectMap<K,V,Pair<K,V *> >::Clear();
CustomObjectMap<K,V,KeyValue<K,V *> >::Clear();
}
V *operator[](const K &index)const
@@ -361,7 +367,7 @@ namespace hgl
auto *obj=GetListObject(this->data_list,this->Find(index));
if(obj)
return obj->right;
return obj->value;
else
return nullptr;
};

View File

@@ -19,7 +19,7 @@ namespace hgl
{
ResItem *obj=items.GetItem(n);
Clear(obj->right);
Clear(obj->value);
}
items.Clear();
@@ -36,7 +36,7 @@ namespace hgl
if(obj->ref_count<=0)
{
Clear(obj->right);
Clear(obj->value);
items.DeleteBySerial(n);
}
}
@@ -64,7 +64,7 @@ namespace hgl
ResItem *obj=items.GetItem(index);
return obj->right;
return obj->value;
}
template<typename K,typename V>
@@ -78,7 +78,7 @@ namespace hgl
++obj->ref_count;
return obj->right;
return obj->value;
}
return(nullptr);
@@ -113,7 +113,7 @@ namespace hgl
++obj->ref_count;
if(key)
*key=obj->left;
*key=obj->key;
if(ref_count)
*ref_count=obj->ref_count;
@@ -139,7 +139,7 @@ namespace hgl
if(zero_clear)
{
Clear(obj->right);
Clear(obj->value);
items.DeleteBySerial(index);
}

View File

@@ -4,13 +4,13 @@
#include<hgl/type/Map.h>
namespace hgl
{
template<typename K,typename V> struct RefKeyValue:public Pair<K,V *> ///<带引用计数的Key/value数据结构
template<typename K,typename V> struct RefKeyValue:public KeyValue<K,V *> ///<带引用计数的Key/value数据结构
{
int ref_count; ///<引用计数
public:
RefKeyValue():Pair<K,V *>()
RefKeyValue():KeyValue<K,V *>()
{
ref_count=1;
}