#include <stdio.h>
#include <functional>
#include <type_traits>
#include <typeinfo>

typedef unsigned char (BYTE);
typedef unsigned short (WORD);
typedef unsigned long (DWORD);
typedef unsigned long (ULONG);

#define struct typedef struct

#define spec(T, Type) extern ULONG T = typeid (Type).hash_code ();
#define $ spec

#define t_id(Type) ( typeid (Type).hash_code () )
#define t_name(Type) ( typeid (Type).name () )

#define Run int main
#define Say printf

struct STRING
{
  ULONG Length;
  DWORD SC_handle;
  WORD Flags;
  BYTE Chars[2];

  BYTE IsEmpty () 
  {
    return (!Length) ? 1 : 0;
  }
} * P_STRING, ** P_P_STRING;

spec (T_STRING, STRING) $
     (T_P_STRING, P_STRING);

Run () 
{
  STRING String = {0};
  P_STRING Pointer = &String;
  P_P_STRING Pointer_address = &Pointer;

  Say ("Hello, World!" "\n");

  Say ("%s, %d, %d" "\n", t_name (String), t_id (String), T_STRING);

  Say ("%d" "\n", String.IsEmpty ());

  return 0;
}
