// 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