// Common, group Encoding
// Copyright Alexander Liss

#include "datacoder.h"
#include "datacodervar.h"


DataCoder::~DataCoder(){delete p;}


int DataCoder::use(CommBuffer& z)
{
	if(p) 
	{
		delete p; 
		p=0;
	}

	p=DataCoderVariant::new_object(z.encoding);

	if(p) 
		return p->use(z); 

	return 1;}

int DataCoder::use(const CommBuffer& z,ReadControl& c)
{
	if(p) 
	{
		delete p; 
		p=0;
	}

	p=DataCoderVariant::new_object(z.encoding);

	if(p)
		return p->use(z,c); 

	return 1;
}

// an array of bytes
int DataCoder::put(const unsigned char * data,int size){if(p)return p->put(data,size); return 1;}
int DataCoder::get(unsigned char * data,int size){if(p)return p->get(data,size); return 1;}

// as an array of bytes
int DataCoder::put(const char * data,int size){if(p)return p->put(data,size); return 1;}
int DataCoder::get(char * data,int size){if(p)return p->get(data,size); return 1;}


int DataCoder::put(unsigned int data){if(p)return p->put(data); return 1;}
int DataCoder::get(unsigned int& data){if(p)return p->get(data); return 1;}

int DataCoder::put(int data){if(p)return p->put(data); return 1;}
int DataCoder::get(int& data){if(p)return p->get(data); return 1;}

int DataCoder::put(unsigned long data){if(p)return p->put(data); return 1;}
int DataCoder::get(unsigned long& data){if(p)return p->get(data); return 1;}

int DataCoder::put(long data){if(p)return p->put(data); return 1;}
int DataCoder::get(long& data){if(p)return p->get(data); return 1;}

int DataCoder::put(unsigned short data){if(p)return p->put(data); return 1;}
int DataCoder::get(unsigned short& data){if(p)return p->get(data); return 1;}

int DataCoder::put(short data){if(p)return p->put(data); return 1;}
int DataCoder::get(short& data){if(p)return p->get(data); return 1;}

int DataCoder::put(unsigned char data){if(p)return p->put(data); return 1;}
int DataCoder::get(unsigned char& data){if(p)return p->get(data); return 1;}

int DataCoder::put(char data){if(p)return p->put(data); return 1;}
int DataCoder::get(char& data){if(p)return p->get(data); return 1;}

int DataCoder::put(float data){if(p)return p->put(data); return 1;}
int DataCoder::get(float& data){if(p)return p->get(data); return 1;}

int DataCoder::put(double data){if(p)return p->put(data); return 1;}
int DataCoder::get(double& data){if(p)return p->get(data); return 1;}


int DataCoder::put(const DataHook& data){if(p)return p->put(data); return 1;}
int DataCoder::get(DataHook& data){if(p)return p->get(data); return 1;}


int DataCoder::put(const CommBuffer& d)
{
	int g=0;

			g=put(d.data_size);
	if(!g)	g=put(d.data + d.write_offset,d.data_size);

	return g;
}

int DataCoder::get(CommBuffer& d)
{
	int g=0,sz=0;

			g=get(sz);
	if(!g)	g=d.reallocate(d.write_offset+d.data_size+sz);
	if(!g)	g=get(d.data + d.write_offset + d.data_size, sz);
	if(!g)	d.data_size+=sz;
	
	return g;
}

	// basic types


int pack(CommBuffer& d,unsigned int t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(unsigned int& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}


int pack(CommBuffer& d,int t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(int& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}


int pack(CommBuffer& d,unsigned long t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(unsigned long& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}


int pack(CommBuffer& d,long t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(long& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}


int pack(CommBuffer& d,unsigned short t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(unsigned short& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}


int pack(CommBuffer& d,short t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(short& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}


int pack(CommBuffer& d,unsigned char t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(unsigned char& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}


int pack(CommBuffer& d,char t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(char& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}


int pack(CommBuffer& d,float t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(float& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}


int pack(CommBuffer& d,double t)
{
	DataCoder z;
	z.use(d);
	return z.put(t);
}

int unpack(double& t,const CommBuffer& s,ReadControl& c)
{
	DataCoder z;
	z.use(s,c);
	return z.get(t);
}