new Collection class. it not use template.
This commit is contained in:
@@ -6,56 +6,10 @@ namespace hgl
|
||||
{
|
||||
class Collection;
|
||||
|
||||
struct ElementOperator
|
||||
{
|
||||
virtual const bool equal(const void *,const void *)const{return false;}
|
||||
virtual const int comp(const void *,const void *)const{return 0;}
|
||||
virtual const bool copy(void *,const void *)const{return false;}
|
||||
};//
|
||||
|
||||
struct ElementOperatorMemcmp:public ElementOperator
|
||||
{
|
||||
size_t size;
|
||||
|
||||
public:
|
||||
|
||||
ElementOperatorMemcmp(const size_t s)
|
||||
{
|
||||
size=s;
|
||||
}
|
||||
|
||||
const bool equal(const void *a,const void *b)const override
|
||||
{
|
||||
return !memcmp(a,b,size);
|
||||
}
|
||||
|
||||
const int comp(const void *a,const void *b)const override
|
||||
{
|
||||
return memcmp(a,b,size);
|
||||
}
|
||||
};//struct ElementOperatorMemcmp:public ElementOperator
|
||||
|
||||
template<typename T>
|
||||
struct ElementOperatorRawtype:public ElementOperator
|
||||
{
|
||||
public:
|
||||
|
||||
const bool equal(const void *a,const void *b)const override
|
||||
{
|
||||
return (*(T *)a)
|
||||
==(*(T *)b);
|
||||
}
|
||||
|
||||
const int comp(const void *a,const void *b)const override
|
||||
{
|
||||
return (*(T *)a)
|
||||
-(*(T *)b);
|
||||
}
|
||||
};//struct ElementOperatorRawtype:public ElementOperator
|
||||
|
||||
struct CheckElement
|
||||
{
|
||||
virtual const bool Check(const void *)const=0;
|
||||
virtual void Update(const void *){}
|
||||
virtual const bool Check(const void *)const=0;
|
||||
};//struct CheckElement
|
||||
|
||||
struct CheckElementMemcmp:public CheckElement
|
||||
@@ -71,6 +25,11 @@ namespace hgl
|
||||
size=s;
|
||||
}
|
||||
|
||||
void Update(const void *v)override
|
||||
{
|
||||
value=v;
|
||||
}
|
||||
|
||||
const bool Check(const void *v) const override
|
||||
{
|
||||
return !memcmp(v,value,size);
|
||||
@@ -80,40 +39,28 @@ namespace hgl
|
||||
template<typename T>
|
||||
struct CheckElementEqual:public CheckElement
|
||||
{
|
||||
const T value;
|
||||
T value;
|
||||
|
||||
public:
|
||||
|
||||
CheckElementEqual(){}
|
||||
|
||||
CheckElementEqual(const T &v)
|
||||
{
|
||||
value=v;
|
||||
}
|
||||
|
||||
void Update(const void *v)override
|
||||
{
|
||||
value=*(const T *)v;
|
||||
}
|
||||
|
||||
const bool Check(const void *v) const override
|
||||
{
|
||||
return (*(T *)v)==value;
|
||||
return (*(const T *)v)==value;
|
||||
}
|
||||
};//struct CheckElementEqual:public CheckElement<T>
|
||||
|
||||
struct CheckElementInCollection:public CheckElement
|
||||
{
|
||||
const Collection *coll;
|
||||
const CheckElement *check;
|
||||
|
||||
public:
|
||||
|
||||
CheckElementInCollection(const Collection *c,const CheckElement *ce)
|
||||
{
|
||||
coll=c;
|
||||
check=ce;
|
||||
}
|
||||
|
||||
const bool Check(const void *v) const override
|
||||
{
|
||||
return check->Check(v);
|
||||
}
|
||||
};//struct CheckElementInCollection:public CheckElement
|
||||
|
||||
/**
|
||||
* 数据合集类
|
||||
*/
|
||||
@@ -129,53 +76,55 @@ namespace hgl
|
||||
|
||||
uchar *tmp_buffer;
|
||||
|
||||
ElementOperator *eo_default;
|
||||
ElementOperator *element_operator;
|
||||
|
||||
public: //属性
|
||||
|
||||
const size_t GetUnitBytes ()const{return unit_bytes;}
|
||||
|
||||
virtual MemoryBlock * GetMemoryBlock ()const{return memory_block;} ///<获取整个合集所用的内存块
|
||||
|
||||
template<typename T>
|
||||
T * ToArray ()const{return memory_block?(T *)(memory_block->Get()):nullptr;} ///<按C阵列方式访问数据
|
||||
T * ToArray ()const{return memory_block?(T *)(memory_block->Get()):nullptr;} ///<按C阵列方式访问数据
|
||||
|
||||
void * begin ()const{return memory_block?memory_block->Get():nullptr;}
|
||||
void * end ()const{return memory_block?((uchar *)memory_block->Get())+total_bytes:nullptr;}
|
||||
|
||||
virtual const bool IsEmpty ()const{return !data_count;} ///<当前合集是否为空
|
||||
virtual const uint64 GetCount ()const{return data_count;} ///<获取合集内的数据个数
|
||||
virtual const uint64 GetAllocCount ()const{return memory_block?memory_block->GetAllocSize()/unit_bytes:0;} ///<获取合集实际分配空间
|
||||
virtual const uint64 GetAllocCount ()const{return memory_block?memory_block->GetAllocSize()/unit_bytes:0;} ///<获取合集实际分配空间
|
||||
|
||||
virtual const uint64 GetTotalBytes ()const{return total_bytes;}
|
||||
const size_t GetUnitBytes ()const{return unit_bytes;} ///<取得单项数据长度字节数
|
||||
virtual const uint64 GetTotalBytes ()const{return total_bytes;} ///<取得所有数据总长度字节数
|
||||
|
||||
public:
|
||||
|
||||
Collection(const size_t ub=1,MemoryBlock *mb=new MemoryBlock,ElementOperator *eo=nullptr);
|
||||
Collection(const size_t ub=1,MemoryBlock *mb=new MemoryBlock);
|
||||
virtual ~Collection();
|
||||
|
||||
virtual bool Alloc(const uint64 count); ///<预分配空间
|
||||
virtual bool Alloc(const uint64 count); ///<预分配空间
|
||||
|
||||
public:
|
||||
|
||||
virtual bool Add(const void *element); ///<增加一个数据到合集
|
||||
virtual bool Add(const Collection &c); ///<增加一整个合集的数据
|
||||
virtual bool Get(const uint64 index,void *element); ///<获取一个数据
|
||||
virtual bool Set(const uint64 index,const void *element); ///<设置一个数据
|
||||
virtual bool Insert(const uint64 offset,const void *element); ///<插入一个数据到合集
|
||||
virtual bool Exchange(uint64 target,uint64 source); ///<交换两个数据的位置
|
||||
virtual bool Add(const void *element); ///<增加一个数据到合集
|
||||
template<typename T>
|
||||
bool AddValue(const T &value)
|
||||
{
|
||||
return Add(&value);
|
||||
}
|
||||
|
||||
virtual void Clear(); ///<清空整个合集(并不释放内存)
|
||||
virtual void *Map(const uint64 start,const uint64 range); ///<映射一段数据区供访问
|
||||
virtual void Free(); ///<清空整个合集并释放内存
|
||||
virtual bool AddCollection(const Collection &c); ///<增加一整个合集的数据
|
||||
virtual bool Get(const uint64 index,void *element); ///<获取一个数据
|
||||
virtual bool Set(const uint64 index,const void *element); ///<设置一个数据
|
||||
virtual bool Insert(const uint64 offset,const void *element); ///<插入一个数据到合集
|
||||
virtual bool Exchange(uint64 target,uint64 source); ///<交换两个数据的位置
|
||||
|
||||
virtual bool RemoveAt(const uint64 offset); ///<移除指定位置的数据
|
||||
virtual bool RemoveAt(const uint64 start,const uint64 remove_count); ///<移除指定数量的连续
|
||||
virtual void Clear(); ///<清空整个合集(并不释放内存)
|
||||
virtual void *Map(const uint64 start,const uint64 range); ///<映射一段数据区供访问
|
||||
virtual void Free(); ///<清空整个合集并释放内存
|
||||
|
||||
virtual int64 indexOfCondition(CheckElement *condition) const; ///<获取数据在合集中的索引
|
||||
virtual bool RemoveAt(const uint64 offset); ///<移除指定位置的数据
|
||||
virtual bool RemoveAt(const uint64 start,const uint64 remove_count); ///<移除指定数量的连续
|
||||
|
||||
virtual int64 indexOf(const void *value) const ///<获取数据在合集中的索引
|
||||
virtual int64 indexOfCondition(CheckElement *condition) const; ///<获取数据在合集中的索引
|
||||
|
||||
virtual int64 indexOf(const void *value) const ///<获取数据在合集中的索引
|
||||
{
|
||||
CheckElementMemcmp cem(value,unit_bytes);
|
||||
|
||||
@@ -183,16 +132,19 @@ namespace hgl
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
int64 indexOf(const T &value)
|
||||
int64 indexOf(const T &value) ///<获取数据在合集中的索引
|
||||
{
|
||||
CheckElementEqual<T> cee(value);
|
||||
|
||||
return indexOfCondition(&cee);
|
||||
}
|
||||
|
||||
virtual bool isMember(const void *value) const{return indexOf(value)!=-1;} ///<
|
||||
virtual bool isMember(const void *value) const{return indexOf(value)!=-1;} ///<判断当前数据是否是其成员
|
||||
|
||||
virtual int64 RemoveCondition(CheckElement *condition,int max_count=1); ///<按条件移除
|
||||
template<typename T>
|
||||
bool isMember(const T &value)const{return indexOf<T>(value)!=-1;} ///<判断当前数据是否是其成员
|
||||
|
||||
virtual int64 RemoveCondition(CheckElement *condition,int max_count=1); ///<按条件移除
|
||||
|
||||
/**
|
||||
* 移除指定数据
|
||||
@@ -221,7 +173,7 @@ namespace hgl
|
||||
return RemoveCondition(&cee,max_count);
|
||||
}
|
||||
|
||||
virtual int64 Remove(const Collection &coll,const CheckElement *check,int64 max_count=-1); ///<从合集中移除指定的数据
|
||||
virtual int64 RemoveCollection(const Collection &coll,CheckElement *ce,int64 max_count=-1); ///<从合集中移除指定的数据
|
||||
};//class Collection
|
||||
|
||||
/**
|
||||
@@ -238,6 +190,12 @@ namespace hgl
|
||||
coll=c;
|
||||
}
|
||||
|
||||
const size_t size()const
|
||||
{
|
||||
return (T *)(coll->end())
|
||||
-(T *)(coll->begin());
|
||||
}
|
||||
|
||||
const T *begin()const{return (T *)(coll->begin());}
|
||||
const T *end()const{return (T *)(coll->end());}
|
||||
};//template<typename T> class ElementEnumerator
|
||||
|
Reference in New Issue
Block a user