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
|
||||
|
@@ -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})
|
||||
|
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user