//
// Serialize.h
// DescriptionHere
//
// Created by John Ryland (jryland@xiaofrog.com) on 19/12/2017.
// Copyright 2017 InvertedLogic. All rights reserved.
//
#pragma once
// Allows us to map in bytes from a file irrespective of the machine's endianess
// This is for binary serialization
template <typename T>
class SerializableUnsignedInteger
{
public:
operator T()
{
T ret = 0;
for (int i = 0; i < sizeof(T); i++)
ret |= T(m_v[i] << ((sizeof(T)-1-i)*8));
return ret;
}
SerializableUnsignedInteger<T>& operator=(T v)
{
for (int i = 0; i < sizeof(T); i++)
m_v[i] = uint8_t(v >> ((sizeof(T)-1-i)*8));
return *this;
}
private:
uint8_t m_v[sizeof(T)];
};
typedef SerializableUnsignedInteger<uint8_t> S_UINT8;
typedef SerializableUnsignedInteger<uint16_t> S_UINT16;
typedef SerializableUnsignedInteger<uint32_t> S_UINT32;
typedef SerializableUnsignedInteger<uint64_t> S_UINT64;
/*
// MI -> Machine Independant
struct MI_UINT8
{
operator uint8_t() { return v1; }
MI_UINT8& operator=(uint8_t v) { v1 = uint8_t(v); return *this; }
private: uint8_t v1;
};
struct MI_UINT16
{
operator uint16_t() { return uint16_t(v1 << 8) | v2; }
MI_UINT16& operator=(uint16_t v) { v1 = uint8_t(v >> 8); v2 = uint8_t(v); return *this; }
private: uint8_t v1, v2;
};
struct MI_UINT32
{
operator uint32_t() { return uint32_t(v1 << 24) | uint32_t(v2 << 16) | uint32_t(v3 << 8) | v4; }
MI_UINT32& operator=(uint32_t v) { v1 = uint8_t(v >> 24); v2 = uint8_t(v >> 16); v3 = uint8_t(v >> 8); v4 = uint8_t(v); return *this; }
private: uint8_t v1, v2, v3, v4;
};
*/