#include"Land.h"
#include"Err.h"
#include<stdlib.h>
#include<string.h>

Land::Land(){
	t0=n=t=Q=Qi=0;
	r=p=NULL;
}
Land::Land(int k){	
	t0 = k;
	p = NULL;
	t = 0;
	n = 0;
	r = NULL;
	Q=0;
	Qi=0;
}
Land::~Land(){
	int **a,**an;
	a =(int**)r;
	an = a + n;
	while (a<an) if (*a) free(*(a++));
	if (r) free(r);
}
void Land::AddLand(int nL, int nP){
	int* B;
	int i;
	B = (int*)malloc(t0*nL*sizeof(int));
	if (!B) Err::MI("Land::AddLand","out of memory");
	Q += t0*nL*sizeof(int);
	B[(nL-1)*t0]=(int)p;
	for(i=0;i<(nL-1);i++) B[i*t0]= (int)(B + (i+1)*t0);
	if (n == t){   
		t += nP; 
		int* W = (int*) malloc(sizeof(int[t]));
		if (!W) Err::MI("Land::AddLand","out of memory");
		if (n>0) memcpy(W,r,sizeof(int[n]));
		if (r) free(r);
		r = W;
	}
	r[n]=(int)B;
	n++;
	p=B;
}
int* Land::Malloc(int nL,int nP){	
	if (!p) AddLand(nL,nP);
	int *x = p;
	p = *(int**)x;
	Qi += sizeof(int)*t0;
	return x;
}
int* Land::Calloc(int nL,int nP){	
	if (!p) AddLand(nL,nP);
    int *x = p;
	p = *(int**)x;
	Qi += sizeof(int)*t0;
	memset(x,0,sizeof(int)*t0);
	return x;
}
void Land::Free(int* x){	
	int* s = p;
	p = x;
	*(int**)x = s;
	Qi -= sizeof(int)*t0;
}
