#include <iostream>
#include <cstdint>
#include <algorithm>
using namespace std;

union structA{
  uint8_t mem[3];

  struct{
    unsigned field1 : 8;
    unsigned field2 : 12; 
    unsigned field3 : 4;
  };
};

struct structB{
  uint8_t mem[10];
};


int main() {
	
	cout << "Infos:"<<endl; 
    cout << "  Alignment constraint of structA: "<<alignof(structA)<<endl;
    cout << "  Alignment constraint of uint8_t: "<<alignof(uint8_t)<<endl;
	cout << "  Size : "<<sizeof(structA)<<endl;
	cout << "  Is trivially copyable: "<<is_trivially_copyable<structA>::value<<endl; 

	structA ia;                                         // test object
	ia.field1 =7; ia.field2=911; ia.field3=5;  
	
	uint8_t globalMem[128];   
	fill( globalMem, globalMem +sizeof(globalMem), 0);     
	
	structA *pa = new (globalMem+10) structA(ia);   // placement new to properly create object
	
	structA a1 = *reinterpret_cast<structA*>(&globalMem[0]);
	structA a2 = *reinterpret_cast<structA*>(&globalMem[10]);
	structB b1 = *reinterpret_cast<structB*>(&globalMem[30]);
	
	cout <<endl<<"Test:"<<endl;
	cout << "  original: "<<ia.field1<<" "<<ia.field2<<" "<<ia.field3<<endl; 
	cout << "  copy:     " <<a2.field1<<" "<<a2.field2<<" "<<a2.field3<<endl; 
	
	return 0;
}