new Collection class. it not use template.

This commit is contained in:
2021-05-07 18:59:42 +08:00
parent 1e0c0cfa79
commit 8865308010
3 changed files with 127 additions and 165 deletions

View File

@@ -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

View File

@@ -17,12 +17,7 @@ SET(TYPE_INCLUDE_PATH ${CMCORE_ROOT_INCLUDE_PATH}/hgl/type)
file(GLOB TYPE_TEMPLATE_HEADER ${TYPE_INCLUDE_PATH}/*.h)
file(GLOB TYPE_SOURCE_FILES ${TYPE_INCLUDE_PATH}/*.cpp)
SET(COLLECTION_SOURCE Type/Collection.cpp)
SET(TYPE_SOURCE_FILES ${TYPE_SOURCE_FILES}
${COLLECTION_SOURCE})
SET(TYPE_SOURCE_FILES Type/Collection.cpp)
SOURCE_GROUP("DataType\\Collection" FILES ${TYPE_INCLUDE_PATH}/Collection.h
${COLLECTION_SOURCE})

View File

@@ -1,11 +1,11 @@
#include<hgl/type/Collection.h>
#include<hgl/type/Collection.h>
namespace hgl
{
Collection::Collection(const size_t ub,MemoryBlock *mb,ElementOperator *eo)
Collection::Collection(const size_t ub,MemoryBlock *mb)
{
unit_bytes=ub;
memory_block=mb;
memory_block=mb;
data_count=0;
total_bytes=0;
@@ -13,28 +13,16 @@ namespace hgl
tmp_buffer=new uchar[unit_bytes];
else
tmp_buffer=nullptr;
if(!eo)
{
eo_default=new ElementOperatorMemcmp(unit_bytes);
element_operator=eo_default;
}
else
{
eo_default=nullptr;
element_operator=eo;
}
}
Collection::~Collection()
{
SAFE_CLEAR(eo_default);
SAFE_CLEAR(tmp_buffer);
delete[] tmp_buffer; //"delete[] nullptr" isn't a bug.
SAFE_CLEAR(memory_block);
}
/**
* Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>
* 预分配空间
*/
bool Collection::Alloc(const uint64 count)
{
@@ -55,8 +43,8 @@ namespace hgl
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD>ϼ<EFBFBD>
* @param element Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ָ<EFBFBD><EFBFBD>
* 增加一个数据到合集
* @param element 要增加的元素内存指针
*/
bool Collection::Add(const void *element)
{
@@ -68,7 +56,7 @@ namespace hgl
if(!memory_block->Alloc(total_bytes+unit_bytes))
return(false);
if(!memory_block->Write(total_bytes,&element,unit_bytes))
if(!memory_block->Write(total_bytes,element,unit_bytes))
return(false);
++data_count;
@@ -77,9 +65,9 @@ namespace hgl
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 增加一整个合集的数据
*/
bool Collection::Add(const Collection &c)
bool Collection::AddCollection(const Collection &c)
{
if(!memory_block)
return(false);
@@ -100,10 +88,10 @@ namespace hgl
}
/**
* <EFBFBD><EFBFBD>ȡһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param index <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param element <EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @return <EFBFBD>Ƿ<EFBFBD><EFBFBD>ɹ<EFBFBD>
* 获取一个数据
* @param index 数据索引
* @param element 数据存放指针
* @return 是否成功
*/
bool Collection::Get(const uint64 index,void *element)
{
@@ -117,25 +105,25 @@ namespace hgl
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param index Ҫ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ʧ<EFBFBD><CAA7>)
* @param element Ҫ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD>Ƿ<EFBFBD><EFBFBD>ɹ<EFBFBD>
* 设置一个数据
* @param index 要设置的位置索引(如索引不可用会失败)
* @param element 要设置的数据
* @return 是否成功
*/
bool Collection::Set(const uint64 index,const void *element)
{
if(index>=data_count)return(false);
if(!memory_block)return(false);
memcpy(memory_block->Get(index*unit_bytes),&element,unit_bytes);
memcpy(memory_block->Get(index*unit_bytes),element,unit_bytes);
return(true);
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD>ϼ<EFBFBD>
* @param offset Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
* @param element Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>
* 插入一个数据到合集
* @param offset 要插入的偏移地址
* @param element 要插入的元素
*/
bool Collection::Insert(const uint64 offset,const void *element)
{
@@ -149,7 +137,7 @@ namespace hgl
unit_bytes* offset,
unit_bytes*(data_count-offset));
if(!memory_block->Write(offset*unit_bytes,&element,unit_bytes))
if(!memory_block->Write(offset*unit_bytes,element,unit_bytes))
return(false);
++data_count;
@@ -158,7 +146,7 @@ namespace hgl
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>λ<EFBFBD><EFBFBD>
* 交换两个数据的位置
*/
bool Collection::Exchange(uint64 target,uint64 source)
{
@@ -176,7 +164,7 @@ namespace hgl
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>)
* 清空整个合集(并不释放内存)
*/
void Collection::Clear()
{
@@ -185,7 +173,7 @@ namespace hgl
}
/**
* ӳ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 映射一段数据区供访问
*/
void *Collection::Map(const uint64 start,const uint64 range)
{
@@ -193,7 +181,7 @@ namespace hgl
if(!memory_block)return(nullptr);
if(start+range>data_count)
{
{
if(!memory_block->Alloc((start+range)*unit_bytes))
return(nullptr);
@@ -205,7 +193,7 @@ namespace hgl
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>ڴ<EFBFBD>
* 清空整个合集并释放内存
*/
void Collection::Free()
{
@@ -217,8 +205,8 @@ namespace hgl
}
/**
* <EFBFBD>Ƴ<EFBFBD>ָ<EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param offset Ҫɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
* 移除指定位置的数据
* @param offset 要删除的数据偏移
*/
bool Collection::RemoveAt(const uint64 offset)
{
@@ -227,11 +215,11 @@ namespace hgl
if(offset>data_count)
return(false);
--data_count;
total_bytes-=unit_bytes;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
//将最后一个数据移到这个位置
memory_block->Copy( unit_bytes*offset,
unit_bytes*data_count,
unit_bytes);
@@ -240,9 +228,9 @@ namespace hgl
}
/**
* <EFBFBD>Ƴ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param start <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param remove_count Ҫ<EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD>
* 移除指定数量的连续
* @param start 起始索引
* @param remove_count 要移除的数据个数
*/
bool Collection::RemoveAt(const uint64 start,const uint64 remove_count)
{
@@ -255,13 +243,13 @@ namespace hgl
if(start+remove_count>data_count)
return(false);
const uint64 end_count=data_count-(start+remove_count); //ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD>
const uint64 end_count=data_count-(start+remove_count); //删除的数据段后面的数据个数
if(end_count>0)
{
if(end_count<=remove_count) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><EFBFBD>٣<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӹ<EFBFBD><EFBFBD>ƹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(end_count<=remove_count) //后面比较少,那直接复制过来就行了
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ĺ<EFBFBD>ǰ<EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƹ<EFBFBD><EFBFBD><EFBFBD>
//后面剩的和前面删掉的一样多,复制过来
//[------------][***********]
// ^ v
// | |
@@ -273,7 +261,7 @@ namespace hgl
}
else
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ı<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>յĶ࣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>εȳ<EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD>ƹ<EFBFBD><EFBFBD><EFBFBD>
//后面剩的比前面空的多,将最后一段等长的复制过来
//[---][**********][***]
// ^ v
// | |
@@ -284,7 +272,7 @@ namespace hgl
unit_bytes*remove_count);
}
}
//else{<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD>ʲô<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD>}
//else{后面剩的数据个数为0那就什么都不用干}
data_count-=remove_count;
total_bytes-=remove_count*unit_bytes;
@@ -292,7 +280,7 @@ namespace hgl
}
/**
* <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ںϼ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 获取数据在合集中的索引
*/
int64 Collection::indexOfCondition(CheckElement *condition) const
{
@@ -316,9 +304,9 @@ namespace hgl
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>
* @param condition <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж϶<EFBFBD><EFBFBD><EFBFBD>
* @param max_count <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 按条件移除
* @param condition 条件判断对象
* @param max_count 最大移除个数
*/
int64 Collection::RemoveCondition(CheckElement *condition,int max_count)
{
@@ -335,7 +323,7 @@ namespace hgl
{
if(condition->Check(p))
{
if(p==ep) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(p==ep) //就是最后一个不管了
{
}
else
@@ -357,18 +345,39 @@ namespace hgl
return origin_count-data_count;
}
struct CheckElementInCollection:public CheckElement
{
const Collection *coll;
CheckElement *check;
public:
CheckElementInCollection(const Collection *c,CheckElement *ce)
{
coll=c;
check=ce;
}
const bool Check(const void *v) const override
{
check->Update(v);
return coll->indexOfCondition(check)!=-1;
}
};//struct CheckElementInCollection:public CheckElement
/**
* <EFBFBD>Ӻϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param coll Ҫ<EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺϼ<EFBFBD>
* @param max_count <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 从合集中移除指定的数据
* @param coll 要移除的数据合集
* @param max_count 最大移除个数
* @return 移除的数据总量
*/
int64 Collection::Remove(const Collection &coll,const CheckElement *check,int64 max_count)
int64 Collection::RemoveCollection(const Collection &coll,CheckElement *ce,int64 max_count)
{
if(coll.GetCount()<=0)return 0;
if(coll.GetUnitBytes()!=unit_bytes)return -1;
CheckElementInCollection cec(&coll,check);
CheckElementInCollection cec(&coll,ce);
return RemoveCondition(&cec,max_count);
}