#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(Type, Const_name) ULONG Const_name = typeid (Type).hash_code ();

#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[1];

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

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

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

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

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

  return 0;
}
