// Common, group Encoding
// Copyright Alexander Liss

#include <string.h>
#include "localcoder.h"

template<class T>
int local_put(T& data,CommBuffer& b)
{
	return b.append((unsigned char*)(&data), sizeof(T));
}


template<class T>
int local_get(T& data,const CommBuffer& b, ReadControl& c)
{
	if(c.offset+(int)sizeof(T)>b.data_size) return 1;
	memcpy(&data,b.data+b.write_offset+c.offset,sizeof(T));
	c.offset+=sizeof(T);
	return 0;
}



	// LocalCoder


int LocalCoder::put(void * data,int size)
{
	if(!write_buffer) return 1;

	return write_buffer->append((unsigned char*)data, size);
}

int LocalCoder::get(void * data,int size)
{
	if(!read_buffer || !read_control) return 1;
	
	if(read_control->offset+size>read_buffer->data_size) return 2;

	memcpy(data,read_buffer->data+read_buffer->write_offset+read_control->offset,size);

	read_control->offset+=size;

	return 0;
}


int LocalCoder::put(int data)
{
	if(!write_buffer) return 1;

	return local_put(data,*write_buffer);
}

int LocalCoder::get(int& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}

int LocalCoder::put(unsigned int data)
{
	if(!write_buffer) return 1;

	return local_put(data,*write_buffer);
}

int LocalCoder::get(unsigned int& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}


int LocalCoder::put(long data)
{
	if(!write_buffer) return 1;
	
	return local_put(data,*write_buffer);
}

int LocalCoder::get(long& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}


int LocalCoder::put(unsigned long data)
{
	if(!write_buffer) return 1;	
		
	return local_put(data,*write_buffer);
}

int LocalCoder::get(unsigned long& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}

int LocalCoder::put(short data)
{
	if(!write_buffer) return 1;	

	return local_put(data,*write_buffer);
}

int LocalCoder::get(short& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}


int LocalCoder::put(unsigned short data)
{
	if(!write_buffer) return 1;
		
	return local_put(data,*write_buffer);
}

int LocalCoder::get(unsigned short& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}

int LocalCoder::put(char data)
{
	if(!write_buffer) return 1;

	return local_put(data,*write_buffer);
}

int LocalCoder::get(char& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}


int LocalCoder::put(unsigned char data)
{
	if(!write_buffer) return 1;

	return local_put(data,*write_buffer);
}

int LocalCoder::get(unsigned char& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}

int LocalCoder::put(float data)
{
	if(!write_buffer) return 1;

	return local_put(data,*write_buffer);
}

int LocalCoder::get(float& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}

int LocalCoder::put(double data)
{
	if(!write_buffer) return 1;

	return local_put(data,*write_buffer);
}

int LocalCoder::get(double& data)
{
	if(!read_buffer || !read_control) return 1;

	return local_get(data,*read_buffer,*read_control);
}