ksys/gdt: Add more flag utilities

This commit is contained in:
Léo Lam
2020-11-09 13:53:18 +01:00
parent b28ba7b3ad
commit f242ce69ee
3 changed files with 327 additions and 26 deletions
+159
View File
@@ -14,4 +14,163 @@ inline bool getBool(FlagHandle handle, bool debug = false) {
return value;
}
inline s32 getS32(FlagHandle handle, bool debug = false) {
s32 value{};
auto* mgr = Manager::instance();
if (mgr)
mgr->getS32(handle, &value, debug);
return value;
}
inline f32 getF32(FlagHandle handle, bool debug = false) {
f32 value{};
auto* mgr = Manager::instance();
if (mgr)
mgr->getF32(handle, &value, debug);
return value;
}
inline void getStr(FlagHandle handle, const char** value, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getStr(handle, value, debug);
}
inline void getStr64(FlagHandle handle, const char** value, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getStr64(handle, value, debug);
}
inline void getStr256(FlagHandle handle, const char** value, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getStr256(handle, value, debug);
}
inline void getVec2f(FlagHandle handle, sead::Vector2f* value, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getVec2f(handle, value, debug);
}
inline void getVec3f(FlagHandle handle, sead::Vector3f* value, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getVec3f(handle, value, debug);
}
inline void getVec4f(FlagHandle handle, sead::Vector4f* value, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getVec4f(handle, value, debug);
}
inline bool getBool(FlagHandle handle, s32 idx, bool debug = false) {
bool value{};
auto* mgr = Manager::instance();
if (mgr)
mgr->getBool(handle, &value, idx, debug);
return value;
}
inline s32 getS32(FlagHandle handle, s32 idx, bool debug = false) {
s32 value{};
auto* mgr = Manager::instance();
if (mgr)
mgr->getS32(handle, &value, idx, debug);
return value;
}
inline f32 getF32(FlagHandle handle, s32 idx, bool debug = false) {
f32 value{};
auto* mgr = Manager::instance();
if (mgr)
mgr->getF32(handle, &value, idx, debug);
return value;
}
inline void getStr(FlagHandle handle, const char** value, s32 idx, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getStr(handle, value, idx, debug);
}
inline void getStr64(FlagHandle handle, const char** value, s32 idx, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getStr64(handle, value, idx, debug);
}
inline void getStr256(FlagHandle handle, const char** value, s32 idx, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getStr256(handle, value, idx, debug);
}
inline void getVec2f(FlagHandle handle, sead::Vector2f* value, s32 idx, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getVec2f(handle, value, idx, debug);
}
inline void getVec3f(FlagHandle handle, sead::Vector3f* value, s32 idx, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getVec3f(handle, value, idx, debug);
}
inline void getVec4f(FlagHandle handle, sead::Vector4f* value, s32 idx, bool debug = false) {
auto* mgr = Manager::instance();
if (mgr)
mgr->getVec4f(handle, value, idx, debug);
}
#define GDT_SET_FLAG_(NAME, T) \
inline void NAME(T value, FlagHandle handle, bool debug = false) { \
auto* mgr = Manager::instance(); \
if (mgr) \
mgr->NAME(value, handle, debug); \
} \
inline void NAME(T value, FlagHandle handle, s32 sub_idx, bool debug = false) { \
auto* mgr = Manager::instance(); \
if (mgr) \
mgr->NAME(value, handle, debug, sub_idx); \
}
#define GDT_SET_FLAG_STR_(NAME, T) \
inline void NAME(T value, FlagHandle handle, bool debug = false) { \
auto* mgr = Manager::instance(); \
if (mgr) \
mgr->NAME(value.cstr(), handle, debug); \
} \
inline void NAME(T value, FlagHandle handle, s32 sub_idx, bool debug = false) { \
auto* mgr = Manager::instance(); \
if (mgr) \
mgr->NAME(value.cstr(), handle, debug, sub_idx); \
}
GDT_SET_FLAG_(setBool, bool)
GDT_SET_FLAG_(setS32, s32)
GDT_SET_FLAG_(setF32, f32)
GDT_SET_FLAG_STR_(setStr, const sead::SafeString&)
GDT_SET_FLAG_STR_(setStr64, const sead::SafeString&)
GDT_SET_FLAG_STR_(setStr256, const sead::SafeString&)
GDT_SET_FLAG_(setVec2f, const sead::Vector2f&)
GDT_SET_FLAG_(setVec3f, const sead::Vector3f&)
GDT_SET_FLAG_(setVec4f, const sead::Vector4f&)
#undef GDT_SET_FLAG_
#undef GDT_SET_FLAG_STR_
} // namespace ksys::gdt
+78 -1
View File
@@ -215,6 +215,12 @@ public:
ref.get().NAME(value, idx); \
return true; \
}); \
} \
void NAME(FlagHandle handle, T* value, s32 sub_idx, bool debug = false) { \
unwrapHandle<false>(handle, debug, [&](u32 idx, TriggerParamRef& ref) { \
ref.get().NAME(value, idx, sub_idx); \
return true; \
}); \
}
GDT_GET_(getBool, bool)
@@ -230,6 +236,7 @@ public:
#undef GDT_GET_
#define GDT_SET_(NAME, T) \
/* Setters (by handle) */ \
KSYS_ALWAYS_INLINE bool NAME(T value, FlagHandle handle, bool debug, bool force) { \
if (mBitFlags.isOn(BitFlag::_40000)) \
return false; \
@@ -242,7 +249,25 @@ public:
bool NAME##NoCheckForce(T value, FlagHandle handle) { \
return NAME(value, handle, true, true); \
} \
\
/* Setters for arrays (by handle) */ \
KSYS_ALWAYS_INLINE bool NAME(T value, FlagHandle handle, bool debug, bool force, \
s32 sub_idx) { \
if (mBitFlags.isOn(BitFlag::_40000)) \
return false; \
return unwrapHandle<true>(handle, debug, [&](u32 idx, TriggerParamRef& ref) { \
return ref.get().NAME(value, idx, sub_idx, force); \
}); \
} \
bool NAME(T value, FlagHandle handle, s32 sub_idx) { \
return NAME(value, handle, false, false, sub_idx); \
} \
bool NAME##NoCheck(T value, FlagHandle handle, s32 sub_idx) { \
return NAME(value, handle, true, false, sub_idx); \
} \
bool NAME##NoCheckForce(T value, FlagHandle handle, s32 sub_idx) { \
return NAME(value, handle, true, true, sub_idx); \
} \
/* Setters (by name) */ \
KSYS_ALWAYS_INLINE bool NAME(T value, const sead::SafeString& name, bool debug, bool force) { \
if (mBitFlags.isOn(BitFlag::_40000)) \
return false; \
@@ -257,6 +282,58 @@ public:
} \
[[gnu::noinline]] bool NAME##NoCheckForce(T value, const sead::SafeString& name) { \
return NAME(value, name, true, true); \
} \
/* Setters for arrays (by name) */ \
KSYS_ALWAYS_INLINE bool NAME(T value, const sead::SafeString& name, bool debug, bool force, \
s32 sub_idx) { \
if (mBitFlags.isOn(BitFlag::_40000)) \
return false; \
auto& ref = debug ? getParamBypassPerm() : getParam(); \
return ref.get().NAME(value, name, sub_idx, force); \
} \
[[gnu::noinline]] bool NAME(T value, const sead::SafeString& name, s32 sub_idx) { \
return NAME(value, name, false, false, sub_idx); \
} \
[[gnu::noinline]] bool NAME##NoCheck(T value, const sead::SafeString& name, s32 sub_idx) { \
return NAME(value, name, true, false, sub_idx); \
} \
[[gnu::noinline]] bool NAME##NoCheckForce(T value, const sead::SafeString& name, \
s32 sub_idx) { \
return NAME(value, name, true, true, sub_idx); \
} \
\
bool NAME(T value, FlagHandle handle, bool debug) { \
if (debug) { \
setBool(true, "IsChangedByDebug"); \
mBitFlags.set(BitFlag::_800); \
return NAME##NoCheckForce(value, handle); \
} \
return NAME(value, handle); \
} \
bool NAME(T value, const sead::SafeString& name, bool debug) { \
if (debug) { \
setBool(true, "IsChangedByDebug"); \
mBitFlags.set(BitFlag::_800); \
return NAME##NoCheckForce(value, name); \
} \
return NAME(value, name); \
} \
\
bool NAME(T value, FlagHandle handle, bool debug, s32 sub_idx) { \
if (debug) { \
setBool(true, "IsChangedByDebug"); \
mBitFlags.set(BitFlag::_800); \
return NAME##NoCheckForce(value, handle, sub_idx); \
} \
return NAME(value, handle, sub_idx); \
} \
bool NAME(T value, const sead::SafeString& name, bool debug, s32 sub_idx) { \
if (debug) { \
setBool(true, "IsChangedByDebug"); \
mBitFlags.set(BitFlag::_800); \
return NAME##NoCheckForce(value, name, sub_idx); \
} \
return NAME(value, name, sub_idx); \
}
GDT_SET_(setBool, bool)