#ifndef AAB5E4D2_A05B_4F2F_B76A_406A5A569D55 #define AAB5E4D2_A05B_4F2F_B76A_406A5A569D55 #include #include #include "mana_replay_api.h" namespace mesytec::mnode::mana { inline bool is_null(const mana_offset_ptr_t &ptr) { return ptr.offset == 1; } inline void set_raw(mana_offset_ptr_t &ptr, void *p) { assert(p != reinterpret_cast(&ptr) + 1); if (p) { ptr.offset = reinterpret_cast(p) - reinterpret_cast(&ptr); spdlog::info("set_raw: &ptr={}, p={}, offset={}", fmt::ptr(&ptr), fmt::ptr(p), ptr.offset); } else { ptr.offset = 1; } } inline void *get(mana_offset_ptr_t &ptr) { if (is_null(ptr)) return nullptr; return reinterpret_cast(&ptr) + ptr.offset; } template T *get(mana_offset_ptr_t &ptr); // to catch unsupported types template T *get_(mana_offset_ptr_t &ptr, mana_data_type_t expected) { if (ptr.data_type != expected) return nullptr; return reinterpret_cast(get(ptr)); } template <> u32 *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_uint32); } template <> u64 *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_uint64); } template <> s8 *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_sint8); } template <> char *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_sint8); } template <> float *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_float); } template <> double *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_double); } inline void set(mana_offset_ptr_t &ptr, mana_data_type_t data_type, void *p) { ptr.data_type = data_type; set_raw(ptr, p); } inline void set(mana_offset_ptr_t &ptr, std::nullptr_t) { set(ptr, mana_uint32, nullptr); } inline void set(mana_offset_ptr_t &ptr, u32 *p) { set(ptr, mana_uint32, p); } inline void set(mana_offset_ptr_t &ptr, u64 *p) { set(ptr, mana_uint64, p); } inline void set(mana_offset_ptr_t &ptr, s8 *p) { set(ptr, mana_sint8, p); } inline void set(mana_offset_ptr_t &ptr, char *p) { set(ptr, mana_sint8, p); } inline void set(mana_offset_ptr_t &ptr, float *p) { set(ptr, mana_float, p); } inline void set(mana_offset_ptr_t &ptr, double *p) { set(ptr, mana_double, p); } } #endif /* AAB5E4D2_A05B_4F2F_B76A_406A5A569D55 */