// Common, group Encoding
// Copyright Alexander Liss

#ifndef __DATACODERVAR_H__
#define __DATACODERVAR_H__

#include "datahook.h"


class DataCoderVariant
{
DataCoderVariant(const DataCoderVariant&);
DataCoderVariant& operator=(const DataCoderVariant&);
public:

DataCoderVariant():
	  read_buffer(0),write_buffer(0),read_control(0){}
DataCoderVariant(CommBuffer& d):
	  read_buffer(0),write_buffer(0),read_control(0){use(d);}
DataCoderVariant(const CommBuffer& s,ReadControl& c):
	  read_buffer(0),write_buffer(0),read_control(0){use(s,c);}
virtual ~DataCoderVariant(){}

int use(CommBuffer& d){write_buffer=&d; return 0;}
int use(const CommBuffer& s,ReadControl& c){read_buffer=&s; read_control=&c; return 0;}


virtual int put(const void * data,int size)=0;
virtual int get(void * data,int size)=0;


virtual int put(unsigned int data)=0;
virtual int get(unsigned int& data)=0;

virtual int put(int data)=0;
virtual int get(int& data)=0;

virtual int put(unsigned long data)=0;
int get(unsigned long& data);

virtual int put(long data)=0;
virtual int get(long& data)=0;

virtual int put(unsigned short data)=0;
virtual int get(unsigned short& data)=0;

virtual int put(short data)=0;
virtual int get(short& data)=0;

virtual int put(unsigned char data)=0;
virtual int get(unsigned char& data)=0;

virtual int put(char data)=0;
virtual int get(char& data)=0;

virtual int put(float data)=0;
virtual int get(float& data)=0;

virtual int put(double data)=0;
virtual int get(double& data)=0;

int put(const DataHook& z)
{if(write_buffer)return z.pack(*write_buffer);return 1;}
int get(DataHook& z)
{if(read_buffer && read_control)return z.unpack(*read_buffer,*read_control);return 1;}

static DataCoderVariant* new_object(int type);

protected:

	CommBuffer* write_buffer;
	const CommBuffer *read_buffer;
	ReadControl* read_control;
};



#endif