added ArrayRearrangeHelper.h
This commit is contained in:
parent
9504560e44
commit
b4fcd415e4
154
inc/hgl/type/ArrayRearrangeHelper.h
Normal file
154
inc/hgl/type/ArrayRearrangeHelper.h
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
#pragma once
|
||||||
|
#include<initializer_list>
|
||||||
|
|
||||||
|
namespace hgl
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 数组重新排列辅助类
|
||||||
|
*/
|
||||||
|
class ArrayRearrangeHelper
|
||||||
|
{
|
||||||
|
int data_count; ///<数据总量
|
||||||
|
int left_count; ///<剩余数量
|
||||||
|
int data_offset; ///<当前访问偏移
|
||||||
|
|
||||||
|
int field_count; //分段数量
|
||||||
|
|
||||||
|
struct Field
|
||||||
|
{
|
||||||
|
int start;
|
||||||
|
int count;
|
||||||
|
};
|
||||||
|
|
||||||
|
Field *field_list;
|
||||||
|
int field_index;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ArrayRearrangeHelper(int dc,int fc)
|
||||||
|
{
|
||||||
|
data_count=dc;
|
||||||
|
left_count=dc;
|
||||||
|
field_count=fc;
|
||||||
|
data_offset=0;
|
||||||
|
|
||||||
|
field_list=new Field[fc];
|
||||||
|
|
||||||
|
field_index=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ArrayRearrangeHelper()
|
||||||
|
{
|
||||||
|
delete[] field_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加一个分段
|
||||||
|
*/
|
||||||
|
bool AddField(int count)
|
||||||
|
{
|
||||||
|
if(count<0)return(false);
|
||||||
|
if(count>left_count)return(false);
|
||||||
|
if(field_index>=field_count)return(false);
|
||||||
|
|
||||||
|
field_list[field_index].start=data_offset;
|
||||||
|
field_list[field_index].count=count;
|
||||||
|
|
||||||
|
data_offset+=count;
|
||||||
|
left_count-=count;
|
||||||
|
++field_index;
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加多个分段
|
||||||
|
*/
|
||||||
|
bool AddField(const std::initializer_list<int> &count_list)
|
||||||
|
{
|
||||||
|
for(const int count:count_list)
|
||||||
|
if(!AddField(count))
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束分段(如果还有剩余数据,将会被添加到最后一个分段)
|
||||||
|
*/
|
||||||
|
bool Finish()
|
||||||
|
{
|
||||||
|
if(left_count>0)
|
||||||
|
{
|
||||||
|
if(field_index>=field_count)return(false);
|
||||||
|
|
||||||
|
field_list[field_index].start=data_offset;
|
||||||
|
field_list[field_index].count=left_count;
|
||||||
|
++field_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Reset()
|
||||||
|
{
|
||||||
|
data_offset=0;
|
||||||
|
left_count=data_count;
|
||||||
|
field_index=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重新排列数据到一个新的数组中
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
bool Rearrange(T *new_array,const T *old_array,const int *index)
|
||||||
|
{
|
||||||
|
if(!Finish())
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
T *p=new_array;
|
||||||
|
Field *f;
|
||||||
|
|
||||||
|
for(int i=0;i<field_index;i++)
|
||||||
|
{
|
||||||
|
if(*index<0||*index>=field_index)
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
f=field_list+(*index);
|
||||||
|
|
||||||
|
hgl_cpy<T>(p,old_array+f->start,f->count);
|
||||||
|
|
||||||
|
p+=f->count;
|
||||||
|
++index;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
bool Rearrange(T *new_array,const T *old_array,const std::initializer_list<int> &index)
|
||||||
|
{
|
||||||
|
return Rearrange(new_array,old_array,index.begin());
|
||||||
|
}
|
||||||
|
};//class ArrayRearrangeHelper
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool ArrayRearrange(T *new_array,const T *old_array,const int count,const std::initializer_list<int> &field_list,const std::initializer_list<int> &index)
|
||||||
|
{
|
||||||
|
int field_count=(int)field_list.size();
|
||||||
|
|
||||||
|
int total=0;
|
||||||
|
|
||||||
|
for(const int fc:field_list)total+=fc;
|
||||||
|
|
||||||
|
if(total<count)
|
||||||
|
++field_count;
|
||||||
|
|
||||||
|
ArrayRearrangeHelper arh(count,field_count);
|
||||||
|
|
||||||
|
if(!arh.AddField(field_list))
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
return arh.Rearrange(new_array,old_array,index);
|
||||||
|
}
|
||||||
|
}//namespace hgl
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user