// Common, group Encoding
// Copyright Alexander Liss

	// has a dual use
	// as a DataCoderVariant and independent, 
	// when its special functions are needed

#ifndef __WIREPACK_H__
#define __WIREPACK_H__

#include "datacodervar.h"


	// WirePacker

	// byte packing without encoding
	// wire order: big endian
	// local order is set through a Porting variable

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

WirePacker(){}
WirePacker(CommBuffer& d):DataCoderVariant(d){}
WirePacker(const CommBuffer& s,ReadControl& c):DataCoderVariant(s,c){}

	// disabled

int put(int data){return 1;}
int get(int& data){return 1;}

int put(long data){return 1;}
int get(long& data){return 1;}

int put(short data){return 1;}
int get(short& data){return 1;}

int put(char data){return 1;}
int get(char& data){return 1;}

int put(float data){return 1;}
int get(float& data){return 1;}

int put(double data){return 1;}
int get(double& data){return 1;}

	// working

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

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

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

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

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

	// special

// lower bytes in an integer value - 1,2 or 3
int put_tail(int data, int bytes);
// it clears data first
int get_tail(int& data, int bytes);

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

};


	// message header functions

int put_message_size(CommBuffer& buf,unsigned int size);
int prepend_message_size(CommBuffer& buf,unsigned int size);
unsigned int get_message_size(CommBuffer& buf,ReadControl& c); 


#endif