История изменений
Исправление thunar, (текущая версия) :
Так, пока получилось что то вроде (класс из 4-х элементов хранится в начале, класс из 2-х — в конце):
class CPool{
public:
size_t index_e=0, buffer_e=0;
size_t index_i=0, buffer_i=0;
size_t index_0=0, buffer_0=0;
private:
byte *pool_s;
byte *pool_e;
public:
CPool(size_t n){ //n bytes
pool_s= new byte[n];
pool_e= pool_s +(n);
std::cout<<(size_t)pool_s<<":"<<(size_t)pool_e<<"("<<(size_t)(pool_e-pool_s)/1024<<"KiB)"<<std::endl;
}
~CPool(){
delete[]pool_s; pool_s=NULL; pool_e=NULL;
}
// management --------------------------------------------------------------//
#define _NE( n ) (pool_s + (((n)<<1)+0)*sizeof(CCharged)) //electrons 64 bytes
#define _NI( n ) (pool_s + (((n)<<1)+1)*sizeof(CCharged)) //ions 64 bytes
#define _N0( n ) (pool_e - (((n) )+1)*sizeof(CNeutral)) //neutrals 32 bytes
CCharged *get_e(size_t n){
return reinterpret_cast<CCharged*>_NE(n);
}
CCharged *get_i(size_t n){
return reinterpret_cast<CCharged*>_NI(n);
}
CNeutral *get_0(size_t n){
return reinterpret_cast<CNeutral*>_N0(n);
}
CCharged *add_e(){
if( _NE(index_e)<_N0(index_0) ){
return get_e(index_e++);
} else return NULL;
}
CCharged *add_i(){
if( _NI(index_i)<_N0(index_0) ){
return get_i(index_i++);
} else return NULL;
}
CNeutral *add_0(){
if( _N0(index_0)>_NE(index_e) && _N0(index_0)>_NI(index_i) ){
return get_0(index_0++);
} else return NULL;
}
void del_e(CCharged *p){
if(index_e){
index_e--;
if(p!=get_e(index_e)) *p= *get_e(index_e);
}
}
void del_i(CCharged *p){
if(index_i){
index_i--;
if(p!=get_i(index_i)) *p= *get_i(index_i);
}
}
void del_0(CNeutral *p){
if(index_0){
index_0--;
if(p!=get_0(index_0)) *p= *get_0(index_0);
}
}
#undef _NE
#undef _NI
#undef _NA
// end management ----------------------------------------------------------//
};
Исходная версия thunar, :
Так, пока получилось что то вроде (класс из 4-х элементов хранится вначале, класс из 2-х — в конце):
class CPool{
public:
size_t index_e=0, buffer_e=0;
size_t index_i=0, buffer_i=0;
size_t index_0=0, buffer_0=0;
private:
byte *pool_s;
byte *pool_e;
public:
CPool(size_t n){ //n bytes
pool_s= new byte[n];
pool_e= pool_s +(n);
std::cout<<(size_t)pool_s<<":"<<(size_t)pool_e<<"("<<(size_t)(pool_e-pool_s)/1024<<"KiB)"<<std::endl;
}
~CPool(){
delete[]pool_s; pool_s=NULL; pool_e=NULL;
}
// management --------------------------------------------------------------//
#define _NE( n ) (pool_s + (((n)<<1)+0)*sizeof(CCharged)) //electrons 64 bytes
#define _NI( n ) (pool_s + (((n)<<1)+1)*sizeof(CCharged)) //ions 64 bytes
#define _N0( n ) (pool_e - (((n) )+1)*sizeof(CNeutral)) //neutrals 32 bytes
CCharged *get_e(size_t n){
return reinterpret_cast<CCharged*>_NE(n);
}
CCharged *get_i(size_t n){
return reinterpret_cast<CCharged*>_NI(n);
}
CNeutral *get_0(size_t n){
return reinterpret_cast<CNeutral*>_N0(n);
}
CCharged *add_e(){
if( _NE(index_e)<_N0(index_0) ){
return get_e(index_e++);
} else return NULL;
}
CCharged *add_i(){
if( _NI(index_i)<_N0(index_0) ){
return get_i(index_i++);
} else return NULL;
}
CNeutral *add_0(){
if( _N0(index_0)>_NE(index_e) && _N0(index_0)>_NI(index_i) ){
return get_0(index_0++);
} else return NULL;
}
void del_e(CCharged *p){
if(index_e){
index_e--;
if(p!=get_e(index_e)) *p= *get_e(index_e);
}
}
void del_i(CCharged *p){
if(index_i){
index_i--;
if(p!=get_i(index_i)) *p= *get_i(index_i);
}
}
void del_0(CNeutral *p){
if(index_0){
index_0--;
if(p!=get_0(index_0)) *p= *get_0(index_0);
}
}
#undef _NE
#undef _NI
#undef _NA
// end management ----------------------------------------------------------//
};