Newer
Older
Import / research / ui / toolkit / src / Serialize.h
//
//  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;
};
*/