// Common, group Encoding
// Copyright Alexander Liss

#ifndef __DATACODER_H__
#define __DATACODER_H__

#include "datahook.h"


class DataCoderVariant;

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

DataCoder():p(0){}
DataCoder(CommBuffer& d):p(0){use(d);}
DataCoder(const CommBuffer& s,ReadControl& c):p(0){use(s,c);}
~DataCoder();

// for packing
int use(CommBuffer& d);
// for unpacking
int use(const CommBuffer& s,ReadControl& c);


// an array of bytes
int put(const unsigned char * data,int size);
int get(unsigned char * data,int size);

// as an array of bytes
int put(const char * data,int size);
int get(char * data,int size);


int put(unsigned int data);
int get(unsigned int& data);

int put(int data);
int get(int& data);

int put(unsigned long data);
int get(unsigned long& data);

int put(long data);
int get(long& data);

int put(unsigned short data);
int get(unsigned short& data);

int put(short data);
int get(short& data);

int put(unsigned char data);
int get(unsigned char& data);

int put(char data);
int get(char& data);

int put(float data);
int get(float& data);

int put(double data);
int get(double& data);


int put(const DataHook& data);
int get(DataHook& data);

int put(const CommBuffer& data);
int get(CommBuffer& data);

private:

	DataCoderVariant* p;
};


	// basic types


int pack(CommBuffer& d,unsigned int t);
int unpack(unsigned int& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,int t);
int unpack(int& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,unsigned long t);
int unpack(unsigned long& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,long t);
int unpack(long& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,unsigned short t);
int unpack(unsigned short& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,short t);
int unpack(short& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,unsigned char t);
int unpack(unsigned char& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,char t);
int unpack(char& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,float t);
int unpack(float& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,double t);
int unpack(double& t,const CommBuffer& s,ReadControl& c);

int pack(CommBuffer& d,const CommBuffer& t);
int unpack(CommBuffer& t,const CommBuffer& s,ReadControl& c);


#endif