69 lines
2.3 KiB
C++
69 lines
2.3 KiB
C++
|
#ifndef AAB5E4D2_A05B_4F2F_B76A_406A5A569D55
|
||
|
#define AAB5E4D2_A05B_4F2F_B76A_406A5A569D55
|
||
|
|
||
|
#include <cassert>
|
||
|
#include <mesytec-mnode/mnode_cpp_types.h>
|
||
|
#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<u8 *>(&ptr) + 1);
|
||
|
|
||
|
if (p)
|
||
|
{
|
||
|
ptr.offset = reinterpret_cast<u8 *>(p) - reinterpret_cast<u8 *>(&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<u8 *>(&ptr) + ptr.offset;
|
||
|
}
|
||
|
|
||
|
template <typename T> T *get(mana_offset_ptr_t &ptr); // to catch unsupported types
|
||
|
|
||
|
template <typename T> T *get_(mana_offset_ptr_t &ptr, mana_data_type_t expected)
|
||
|
{
|
||
|
if (ptr.data_type != expected)
|
||
|
return nullptr;
|
||
|
|
||
|
return reinterpret_cast<T *>(get(ptr));
|
||
|
}
|
||
|
|
||
|
template <> u32 *get(mana_offset_ptr_t &ptr) { return get_<u32>(ptr, mana_uint32); }
|
||
|
template <> u64 *get(mana_offset_ptr_t &ptr) { return get_<u64>(ptr, mana_uint64); }
|
||
|
template <> s8 *get(mana_offset_ptr_t &ptr) { return get_<s8>(ptr, mana_sint8); }
|
||
|
template <> char *get(mana_offset_ptr_t &ptr) { return get_<char>(ptr, mana_sint8); }
|
||
|
template <> float *get(mana_offset_ptr_t &ptr) { return get_<float>(ptr, mana_float); }
|
||
|
template <> double *get(mana_offset_ptr_t &ptr) { return get_<double>(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 */
|