reman3/game_re/binders/gh_auto_binder.h

54 lines
1.3 KiB
C++

#ifndef B8D59B54_1674_4C0F_AA2C_611385FF5D03
#define B8D59B54_1674_4C0F_AA2C_611385FF5D03
#include "gh_base.h"
#include "gh_static_mem.h"
#include "gh_types.h"
#include "gh_global.h"
#ifdef _WIN32
#include <direct.h>
#include <process.h>
#else
#include <unistd.h>
#endif
template <size_t Offset, size_t Size> struct Field {};
template <size_t Size> struct _FieldBinderSizeTraits {
using type = undefined;
};
template <> struct _FieldBinderSizeTraits<4> {
using type = undefined4;
};
template <> struct _FieldBinderSizeTraits<2> {
using type = undefined2;
};
template <> struct _FieldBinderSizeTraits<3> {
using type = undefined3;
};
template <size_t Size> struct FieldBinder {
void *dst;
using ExpectedType = typename _FieldBinderSizeTraits<Size>::type;
operator ExpectedType &() const {
return *reinterpret_cast<ExpectedType *>(dst);
}
template <typename T> T *operator=(T *src) {
return reinterpret_cast<T *>(dst) = src;
}
ExpectedType& operator=(ExpectedType src) {
return *reinterpret_cast<ExpectedType *>(dst) = src;
}
};
template <size_t Offset, size_t Size>
inline FieldBinder<Size> operator+(const void *str,
Field<Offset, Size> offset) {
return FieldBinder<Size>{.dst = (uint8_t *)str + offset};
}
#endif /* B8D59B54_1674_4C0F_AA2C_611385FF5D03 */