List删除不合理设计的[]操作符重载
This commit is contained in:
parent
5c3caf4111
commit
b872105f75
@ -51,21 +51,6 @@ namespace hgl
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
T &List<T>::operator[](int index)const ///<操作符重载取得指定索引处的数据
|
|
||||||
{
|
|
||||||
if(!items||index<0||index>=count)
|
|
||||||
{
|
|
||||||
static T *null_ptr=nullptr;
|
|
||||||
|
|
||||||
LOG_ERROR(OS_TEXT("List<>::operator(index=")+OSString(index)+OS_TEXT(") error,DataCount=")+OSString(count));
|
|
||||||
|
|
||||||
return(*null_ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return items[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void List<T>::Set(int index,const T &val)
|
void List<T>::Set(int index,const T &val)
|
||||||
{
|
{
|
||||||
|
@ -70,7 +70,6 @@ namespace hgl
|
|||||||
void Set(int,const T &); ///<设置指定索引处的数据
|
void Set(int,const T &); ///<设置指定索引处的数据
|
||||||
bool Rand(T &)const; ///<随机取得一个数据
|
bool Rand(T &)const; ///<随机取得一个数据
|
||||||
|
|
||||||
virtual T &operator[](int n)const; ///<操作符重载取得指定索引处的数据
|
|
||||||
virtual bool Begin(T &)const; ///<取第一个数据
|
virtual bool Begin(T &)const; ///<取第一个数据
|
||||||
virtual bool End(T &)const; ///<取最后一个数据
|
virtual bool End(T &)const; ///<取最后一个数据
|
||||||
|
|
||||||
|
@ -208,9 +208,12 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
int index=Find(flag);
|
int index=Find(flag);
|
||||||
|
|
||||||
if(index==-1)return(false);
|
DataPair *obj=GetObject(data_list,index);
|
||||||
|
|
||||||
data=data_list[index]->right;
|
if(!obj)
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
data=obj->right;
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
@ -299,9 +302,10 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
int index=Find(flag);
|
int index=Find(flag);
|
||||||
|
|
||||||
if(index==-1)return(false);
|
DataPair *dp=GetObject(data_list,index);
|
||||||
|
|
||||||
DataPair *dp=data_list[index];
|
if(!dp)
|
||||||
|
return(false);
|
||||||
|
|
||||||
data=dp->right;
|
data=dp->right;
|
||||||
|
|
||||||
@ -319,14 +323,7 @@ namespace hgl
|
|||||||
template<typename F,typename T,typename DataPair>
|
template<typename F,typename T,typename DataPair>
|
||||||
bool _Map<F,T,DataPair>::DeleteByKey(const F &flag)
|
bool _Map<F,T,DataPair>::DeleteByKey(const F &flag)
|
||||||
{
|
{
|
||||||
int index=Find(flag);
|
return DeleteBySerial(Find(flag));
|
||||||
|
|
||||||
if(index==-1)return(false);
|
|
||||||
|
|
||||||
data_pool.Release(data_list[index]);
|
|
||||||
data_list.DeleteMove(index);
|
|
||||||
|
|
||||||
return(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -344,15 +341,8 @@ namespace hgl
|
|||||||
|
|
||||||
for(int i=0;i<count;i++)
|
for(int i=0;i<count;i++)
|
||||||
{
|
{
|
||||||
int index=Find(*fp);
|
if(DeleteBySerial(Find(*fp)))
|
||||||
|
|
||||||
if(index!=-1)
|
|
||||||
{
|
|
||||||
data_pool.Release(data_list[index]);
|
|
||||||
data_list.DeleteMove(index);
|
|
||||||
|
|
||||||
++total;
|
++total;
|
||||||
}
|
|
||||||
|
|
||||||
++fp;
|
++fp;
|
||||||
}
|
}
|
||||||
@ -369,14 +359,7 @@ namespace hgl
|
|||||||
template<typename F,typename T,typename DataPair>
|
template<typename F,typename T,typename DataPair>
|
||||||
bool _Map<F,T,DataPair>::DeleteByValue(const T &data)
|
bool _Map<F,T,DataPair>::DeleteByValue(const T &data)
|
||||||
{
|
{
|
||||||
int index=FindByValue(data);
|
return DeleteBySerial(FindByValue(data));
|
||||||
|
|
||||||
if(index==-1)return(false);
|
|
||||||
|
|
||||||
data_pool.Release(data_list[index]);
|
|
||||||
data_list.DeleteMove(index);
|
|
||||||
|
|
||||||
return(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -390,7 +373,7 @@ namespace hgl
|
|||||||
if(index<0
|
if(index<0
|
||||||
||index>=data_list.GetCount())return(false);
|
||index>=data_list.GetCount())return(false);
|
||||||
|
|
||||||
data_pool.Release(data_list[index]);
|
data_pool.Release(GetObject(data_list,index));
|
||||||
data_list.DeleteMove(index);
|
data_list.DeleteMove(index);
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
@ -427,7 +410,12 @@ namespace hgl
|
|||||||
int result;
|
int result;
|
||||||
|
|
||||||
if(FindPos(flag,result))
|
if(FindPos(flag,result))
|
||||||
data_list[result]->right=data;
|
{
|
||||||
|
DataPair *dp=GetObject(data_list,result);
|
||||||
|
|
||||||
|
if(dp)
|
||||||
|
dp->right=data;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DataPair *ds=data_pool.Acquire();
|
DataPair *ds=data_pool.Acquire();
|
||||||
@ -448,13 +436,12 @@ namespace hgl
|
|||||||
template<typename F,typename T,typename DataPair>
|
template<typename F,typename T,typename DataPair>
|
||||||
bool _Map<F,T,DataPair>::Change(const F &flag,const T &data)
|
bool _Map<F,T,DataPair>::Change(const F &flag,const T &data)
|
||||||
{
|
{
|
||||||
int result=Find(flag);
|
DataPair *dp=GetObject(data_list,Find(flag));
|
||||||
|
|
||||||
if(result==-1)
|
if(!dp)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
data_list[result]->right=data;
|
dp->right=data;
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include<hgl/type/List.h>
|
#include<hgl/type/List.h>
|
||||||
#include<hgl/type/Pair.h>
|
#include<hgl/type/Pair.h>
|
||||||
#include<hgl/type/Pool.h>
|
#include<hgl/type/Pool.h>
|
||||||
#include<hgl/LogInfo.h>
|
|
||||||
#include<hgl/thread/RWLock.h>
|
#include<hgl/thread/RWLock.h>
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
@ -93,7 +92,7 @@ namespace hgl
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
IDItem *GetItem(int n)const{return data_list[n];} ///<取指定序号的数据
|
IDItem *GetItem(int n)const{return GetObject(data_list,n);} ///<取指定序号的数据
|
||||||
bool Get(int,F &,T &)const; ///<取指定序号的数据
|
bool Get(int,F &,T &)const; ///<取指定序号的数据
|
||||||
bool GetKey(int,F &)const; ///<取指定序号的索引
|
bool GetKey(int,F &)const; ///<取指定序号的索引
|
||||||
bool GetValue(int,T &)const; ///<取指定序号的数据
|
bool GetValue(int,T &)const; ///<取指定序号的数据
|
||||||
@ -134,8 +133,16 @@ namespace hgl
|
|||||||
typedef _Map<F,T *,DataPair> SuperClass;
|
typedef _Map<F,T *,DataPair> SuperClass;
|
||||||
|
|
||||||
virtual void DeleteObject(const F &,T *)=0; ///<删除一个数据
|
virtual void DeleteObject(const F &,T *)=0; ///<删除一个数据
|
||||||
void DeleteObject(DataPair *ds){DeleteObject(ds->left,ds->right);}
|
void DeleteObject(DataPair *ds)
|
||||||
void DeleteObject(int index){DeleteObject(this->data_list[index]);}
|
{
|
||||||
|
if(!ds)return;
|
||||||
|
DeleteObject(ds->left,ds->right);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeleteObject(int index)
|
||||||
|
{
|
||||||
|
DeleteObject(GetObject(this->data_list,index));
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -145,7 +152,7 @@ namespace hgl
|
|||||||
if(SuperClass::GetCount()>0)
|
if(SuperClass::GetCount()>0)
|
||||||
{
|
{
|
||||||
//LOG_ERROR(u"这是一个严重的程序设计错误,会产生纯虚函数调用,请在派生类的析构函数中调用Clear函数以清除数据。");
|
//LOG_ERROR(u"这是一个严重的程序设计错误,会产生纯虚函数调用,请在派生类的析构函数中调用Clear函数以清除数据。");
|
||||||
LOG_ERROR(OS_TEXT("This is a serious design errors, will produce the pure virtual function call, please call in the destructor of the derived class the <Clear> function to clear the data."));
|
//LOG_ERROR(OS_TEXT("This is a serious design errors, will produce the pure virtual function call, please call in the destructor of the derived class the <Clear> function to clear the data."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,7 +259,10 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
DeleteObject(index);
|
DeleteObject(index);
|
||||||
|
|
||||||
this->data_list[index]->second=data;
|
DataPair *dp=GetObject(this->data_list,index);
|
||||||
|
|
||||||
|
if(dp)
|
||||||
|
dp->right=data;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -274,8 +284,12 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
DeleteObject(index);
|
DeleteObject(index);
|
||||||
|
|
||||||
this->data_list[index]->second=data;
|
DataPair *dp=GetObject(this->data_list,index);
|
||||||
|
|
||||||
|
if(!dp)
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
dp->right=data;
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -313,11 +327,12 @@ namespace hgl
|
|||||||
|
|
||||||
T *operator[](const F &index)const
|
T *operator[](const F &index)const
|
||||||
{
|
{
|
||||||
const int pos=this->Find(index);
|
auto *obj=GetObject(this->data_list,this->Find(index));
|
||||||
|
|
||||||
if(pos==-1)return(nullptr);
|
if(obj)
|
||||||
|
return obj->right;
|
||||||
return this->data_list[pos]->right;
|
else
|
||||||
|
return nullptr;
|
||||||
};
|
};
|
||||||
};//class MapObject
|
};//class MapObject
|
||||||
}//namespace hgl
|
}//namespace hgl
|
||||||
|
@ -127,8 +127,13 @@ namespace hgl
|
|||||||
|
|
||||||
{
|
{
|
||||||
int n=Active.GetCount();
|
int n=Active.GetCount();
|
||||||
|
T *p=Active.GetData();
|
||||||
|
|
||||||
while(n--)
|
while(n--)
|
||||||
Clear(Active[n]);
|
{
|
||||||
|
Clear(*p);
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
|
||||||
Active.Clear();
|
Active.Clear();
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#ifndef HGL_POOL_INCLUDE
|
#ifndef HGL_POOL_INCLUDE
|
||||||
#define HGL_POOL_INCLUDE
|
#define HGL_POOL_INCLUDE
|
||||||
|
|
||||||
#include<hgl/type/List.h>
|
#include<hgl/type/List.h>
|
||||||
@ -47,8 +47,6 @@ namespace hgl
|
|||||||
|
|
||||||
virtual void ClearInactive(); ///<清除所有空闲的
|
virtual void ClearInactive(); ///<清除所有空闲的
|
||||||
virtual void ClearAll(); ///<清除所有的
|
virtual void ClearAll(); ///<清除所有的
|
||||||
|
|
||||||
virtual T operator[](int n){return Active[n];}
|
|
||||||
};//template<typename T> class Pool
|
};//template<typename T> class Pool
|
||||||
|
|
||||||
template<typename T> class MTPool:public Pool<T> ///多线程数据池
|
template<typename T> class MTPool:public Pool<T> ///多线程数据池
|
||||||
@ -188,6 +186,13 @@ namespace hgl
|
|||||||
|
|
||||||
using Pool<T *>::Pool;
|
using Pool<T *>::Pool;
|
||||||
virtual ~_ObjectPool(){Pool<T *>::ClearAll();}
|
virtual ~_ObjectPool(){Pool<T *>::ClearAll();}
|
||||||
|
|
||||||
|
virtual bool Release(T *obj) override ///<释放一个数据
|
||||||
|
{
|
||||||
|
if(!obj)return(true);
|
||||||
|
|
||||||
|
return Pool<T *>::Release(obj);
|
||||||
|
}
|
||||||
};//template<typename T> class _ObjectPool
|
};//template<typename T> class _ObjectPool
|
||||||
|
|
||||||
template<typename T> class ObjectPool:public _ObjectPool<T> ///对象池
|
template<typename T> class ObjectPool:public _ObjectPool<T> ///对象池
|
||||||
|
Loading…
x
Reference in New Issue
Block a user