#ifndef _PACKET_DATA_TYPES
#define _PACKET_DATA_TYPES
namespace mcp {
class mc_int;
class mc_short;
class mc_string;
class mc_int {
private:
int val; //actual int
public:
int value() const;
int value(int);
mc_int();
mc_int(int);
void asBytes(char*);
void fromBytes(char*) const;
void fromBytes(char*,bool) const;
void showBytes(); //Debug function, requires STD iostream
mc_int& operator=(int);
mc_int& operator=(const mc_int&);
mc_int& operator=(const mc_short&);
bool endianity; //true for little
};
class mc_short {
private:
short val;
public:
short value() const;
short value(short);
mc_short();
mc_short(short);
void asBytes(char*);
void fromBytes(char*) const;
void fromBytes(char*,bool) const;
mc_short& operator=(int);
mc_short& operator=(const mc_int&);
mc_short& operator=(const mc_short&);
bool endianity; //true for little endian
};
#ifndef _INC_STRING
#include <string.h>
#endif
class mc_string {
private:
std::string val;
public:
std::string value() const;
std::string value(std::string);
int length() const; //size of output with length identifier
mc_string();
mc_string(char*);
mc_string(std::string);
mc_string& operator=(const char*);
mc_string& operator=(const mc_string&);
mc_string& operator=(const std::string&);
void showBytes();
void asBytes(char*);
bool endianity; //Endianity of length identifier
};
mc_int::mc_int() {
val = 0;
endianity = true;
}
mc_int::mc_int(int integer) {
val = integer;
endianity = true;
}
int mc_int::value() const {
return val;
}
int mc_int::value(int integer) {
val = integer;
return val;
}
void mc_int::asBytes(char* data) {
for (int i = 0; i < 4; i++)
data[endianity?i:3-i] = (val >> (i * 8));
}
void mc_int::fromBytes(char* data) const {
this->fromBytes(data, endianity);
}
void mc_int::fromBytes(char* data, bool endian) const {
int result = 0;
for (int i = 0; i < 4; i++)
result = (result<<8)+data[endian?i:3-i];
}
void mc_int::showBytes() {
#ifdef _IOSTREAM_
char data[4];
this->asBytes(data);
std::cout<<'[';
for(unsigned char i=0; i<4; i++) {
std::cout<<(int)data[i];
if(i<3)
std::cout<<", ";
else
std::cout<<']';
}
#endif
}
mc_int& mc_int::operator=(int integer) {
val = integer;
return *this;
}
mc_int& mc_int::operator=(const mc_int& other) {
val = other.value();
return *this;
}
mc_int& mc_int::operator=(const mc_short& other) {
val = (int)other.value();
return *this;
}
mc_short::mc_short() {
val = 0;
endianity = true;
}
mc_short::mc_short(short integer) {
val = integer;
endianity = true;
}
short mc_short::value() const {
return val;
}
short mc_short::value(short integer) {
val = integer;
return val;
}
void mc_short::asBytes(char* data) {
for (int i = 0; i < 2; i++)
data[endianity?i:1-i] = (val >> (i * 8));
}
void mc_short::fromBytes(char* data) const {
this->fromBytes(data, endianity);
}
void mc_short::fromBytes(char* data, bool endian) const {
int result = 0;
for (int i = 0; i < 2; i++)
result = (result<<8)+data[endian?i:1-i];
}
mc_short& mc_short::operator=(int integer) {
val = (short)integer;
return *this;
}
mc_short& mc_short::operator=(const mc_int& other) {
val = (short)other.value();
return *this;
}
mc_short& mc_short::operator=(const mc_short& other) {
val = other.value();
return *this;
}
mc_string::mc_string() {
val = std::string("");
}
mc_string::mc_string(char* data) {
val = std::string(data);
}
mc_string::mc_string(std::string data) {
val = data;
}
std::string mc_string::value() const {
return val;
}
std::string mc_string::value(std::string data) {
val = data;
return val;
}
void mc_string::asBytes(char* data) {
mc_short size((short)val.length());
size.endianity = endianity;
size.asBytes(data);
for(short i=0; i<size.value(); i++) {
data[i+2] = val[i];
}
}
int mc_string::length() const {
return val.length()+2;
}
void mc_string::showBytes() {
#ifdef _IOSTREAM_
char data[2];
mc_short size((short)val.length());
size.endianity = endianity;
size.asBytes(data);
std::cout<<'[';
std::cout<<(int)data[0]<<", "<<(int)data[1]<<", ";
for(unsigned char i=0; i<val.length(); i++) {
std::cout<<(char)val[i];
if(i<val.length()-1)
std::cout<<", ";
else
std::cout<<']';
}
#endif
}
}
#endif