LINUX.ORG.RU

История изменений

Исправление 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 ----------------------------------------------------------//
};