#pragma once #define reinterpret_cast(T, it) _unsafe_cast_##T(0, it) #define X(T) \ T _unsafe_cast_##T(int dummy, ...) { return ...(0, T); } \ USING(T##_fld, .T); T##_fld _unsafe_cast_##T##_fld(int dummy, ...) { return ...(0, T##_fld); } X(bool) X(int) X(float) X(vector) X(entity) X(string) USING(rawfunc, float(...)); X(rawfunc) #undef X #define _strid(s) ITOF(reinterpret_cast(int, s)) #define strid(s) stof(sprintf("%i", s)) .int _unsafe_fld1, _unsafe_fld2; int INTEGER_ONE; #define FTOI(f) ((f) * INTEGER_ONE) #define ITOF(i) ((i) / INTEGER_ONE) STATIC_INIT(INTEGER_ONE) { INTEGER_ONE = reinterpret_cast(int, _unsafe_fld2) - reinterpret_cast(int, _unsafe_fld1); } #define ARRAY_INDEX(T, arr, idx) (reinterpret_cast(T##_fld, reinterpret_cast(int, arr[0]) + FTOI(idx)))