#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)))
