#ifndef TYPES_H #define TYPES_H #include typedef s8 unk8; typedef s16 unk16; typedef s32 unk32; #define CEIL_DIV(a, b) (((a) + (b) - 1) / (b)) #ifdef __cplusplus #define DECL_PTMF(name, ...) \ template struct name { \ typedef R (T::*PTMFCallback)(__VA_ARGS__); \ \ PTMFCallback callback; \ }; #define CALL_PTMF(type, data, ...) \ { \ type &ptr = (data); \ (this->*ptr.callback)(__VA_ARGS__); \ } #define STATIC_CALL_PTMF(type, data, thisx, ...) \ { \ type &ptr = (data); \ ((thisx)->*ptr.callback)(__VA_ARGS__); \ } #define STATIC_PTMFCALLBACK(type, data, thisx, ...) \ { \ type::PTMFCallback &ptr = (data); \ ((thisx)->*ptr)(__VA_ARGS__); \ } DECL_PTMF(PTMF); typedef void (*UnkCallback)(u16 param1); template class Instance { public: Instance(); //! TODO: should this be inlined? ~Instance(); //! TODO: should this be inlined? }; template class AutoInstance : public Instance { public: AutoInstance() {} ~AutoInstance() {} }; #define DECL_INSTANCE_CTOR(type, gpInstance) \ template Instance::Instance() { \ gpInstance = (type *) this; \ } \ template class Instance; #define DECL_INSTANCE_DTOR(type, gpInstance) \ template <> Instance::~Instance() { \ gpInstance = NULL; \ } #define DECL_INSTANCE(type, gpInstance) \ DECL_INSTANCE_CTOR(type, gpInstance) \ DECL_INSTANCE_DTOR(type, gpInstance) template struct StaticInstance { static T sInstance; }; #define DECL_STATIC_INSTANCE(T) T StaticInstance::sInstance #endif //! TODO: move elsewhere #ifdef __cplusplus extern "C" { #endif typedef struct SPAHeader { /* 00 */ u32 magic; // always 'SPA ' /* 04 */ unk32 mUnk_04; /* 08 */ u16 mUnk_08; /* 0A */ char pad[0x18 - 0x0A]; /* 18 */ unk32 mUnk_18; } SPAHeader; #ifdef __cplusplus } #endif #endif