Use binary search for all Lua cobject fields

This commit is contained in:
MysterD 2022-04-22 18:51:25 -07:00
parent 5cfef9abb3
commit 0d29a29c1b
5 changed files with 13 additions and 24 deletions

View file

@ -37,13 +37,7 @@ $[INCLUDES]
$[BODY] $[BODY]
struct LuaObjectField* smlua_get_object_field_autogen(u16 lot, const char* key) { struct LuaObjectField* smlua_get_object_field_autogen(u16 lot, const char* key) {
struct LuaObjectTable* ot = &sLuaObjectAutogenTable[lot - LOT_AUTOGEN_MIN - 1]; struct LuaObjectTable* ot = &sLuaObjectAutogenTable[lot - LOT_AUTOGEN_MIN - 1];
// TODO: change this to binary search or hash table or something return smlua_get_object_field_from_ot(ot, key);
for (int i = 0; i < ot->fieldCount; i++) {
if (!strcmp(ot->fields[i].key, key)) {
return &ot->fields[i];
}
}
return NULL;
} }
""" """

View file

@ -33,13 +33,7 @@ struct LuaObjectTable sLuaObjectTable[LOT_MAX] = {
{ LOT_VEC3F, sVec3fFields, LUA_VEC3F_FIELD_COUNT }, { LOT_VEC3F, sVec3fFields, LUA_VEC3F_FIELD_COUNT },
}; };
struct LuaObjectField* smlua_get_object_field(u16 lot, const char* key) { struct LuaObjectField* smlua_get_object_field_from_ot(struct LuaObjectTable* ot, const char* key) {
if (lot > LOT_AUTOGEN_MIN) {
return smlua_get_object_field_autogen(lot, key);
}
struct LuaObjectTable* ot = &sLuaObjectTable[lot];
// binary search // binary search
s32 min = 0; s32 min = 0;
s32 max = ot->fieldCount - 1; s32 max = ot->fieldCount - 1;
@ -64,6 +58,15 @@ struct LuaObjectField* smlua_get_object_field(u16 lot, const char* key) {
return NULL; return NULL;
} }
struct LuaObjectField* smlua_get_object_field(u16 lot, const char* key) {
if (lot > LOT_AUTOGEN_MIN) {
return smlua_get_object_field_autogen(lot, key);
}
struct LuaObjectTable* ot = &sLuaObjectTable[lot];
return smlua_get_object_field_from_ot(ot, key);
}
bool smlua_valid_lot(u16 lot) { bool smlua_valid_lot(u16 lot) {
if (lot > LOT_NONE && lot < LOT_MAX) { return true; } if (lot > LOT_NONE && lot < LOT_MAX) { return true; }
if (lot > LOT_AUTOGEN_MIN && lot < LOT_AUTOGEN_MAX) { return true; } if (lot > LOT_AUTOGEN_MIN && lot < LOT_AUTOGEN_MAX) { return true; }

View file

@ -60,6 +60,7 @@ struct LuaObjectTable {
bool smlua_valid_lot(u16 lot); bool smlua_valid_lot(u16 lot);
bool smlua_valid_lvt(u16 lvt); bool smlua_valid_lvt(u16 lvt);
struct LuaObjectField* smlua_get_object_field_from_ot(struct LuaObjectTable* ot, const char* key);
struct LuaObjectField* smlua_get_object_field(u16 lot, const char* key); struct LuaObjectField* smlua_get_object_field(u16 lot, const char* key);
struct LuaObjectField* smlua_get_custom_field(lua_State* L, u32 lot, int keyIndex); struct LuaObjectField* smlua_get_custom_field(lua_State* L, u32 lot, int keyIndex);
void smlua_cobject_init_globals(void); void smlua_cobject_init_globals(void);

View file

@ -1957,12 +1957,6 @@ struct LuaObjectTable sLuaObjectAutogenTable[LOT_AUTOGEN_MAX - LOT_AUTOGEN_MIN]
struct LuaObjectField* smlua_get_object_field_autogen(u16 lot, const char* key) { struct LuaObjectField* smlua_get_object_field_autogen(u16 lot, const char* key) {
struct LuaObjectTable* ot = &sLuaObjectAutogenTable[lot - LOT_AUTOGEN_MIN - 1]; struct LuaObjectTable* ot = &sLuaObjectAutogenTable[lot - LOT_AUTOGEN_MIN - 1];
// TODO: change this to binary search or hash table or something return smlua_get_object_field_from_ot(ot, key);
for (int i = 0; i < ot->fieldCount; i++) {
if (!strcmp(ot->fields[i].key, key)) {
return &ot->fields[i];
}
}
return NULL;
} }

View file

@ -9,9 +9,6 @@
#include "game/print.h" #include "game/print.h"
#include "gfx_dimensions.h" #include "gfx_dimensions.h"
extern u64 SDL_GetPerformanceCounter(void);
extern u64 SDL_GetPerformanceFrequency(void);
#define MAX_PROFILED_MODS 16 #define MAX_PROFILED_MODS 16
#define REFRESH_RATE 15 #define REFRESH_RATE 15