#include "types.h" #include "hashtable.h" unkStruct *TableNew(s32 p1, s32 p2, HashFunction p3, s32 p4, s32 p5) { return TableNew2(p1, p2, 4, p3, p4, p5); } unkStruct *TableNew2(s32 p1, s32 p2, s32 p3, HashFunction p4, s32 p5, s32 p6) { unkStruct *r30 = (unkStruct *)gsimalloc(sizeof(unkStruct)); r30->unk0 = (unkStruct2 **)gsimalloc(p2 * sizeof(unkStruct2 *)); for (s32 i = 0; i < p2; i++) { r30->unk0[i] = (unkStruct2 *)ArrayNew(p1, p3, p6); } r30->unk4 = p2; r30->unk8 = p6; r30->unk10 = p5; r30->unkC = p4; return r30; } void TableFree(unkStruct *p1) { if (p1) { for (s32 i = 0; i < p1->unk4; i++) { ArrayFree(p1->unk0[i]); } gsifree(p1->unk0); gsifree(p1); } } // r29: totalSize // r30: i s32 TableCount(unkStruct *p1) { s32 i, totalSize = 0; if (!p1) return 0; for (i = 0; i < p1->unk4; i++) { totalSize += ArrayLength(p1->unk0[i]); } return totalSize; } // TODO: p2 is element to be added void TableEnter(unkStruct *p1, void *p2) { if (p1) { s32 i = p1->unkC(p2, p1->unk4); // r31 s32 result = ArraySearch(p1->unk0[i], p2, p1->unk10, 0, 0); if (result == -1) { ArrayAppend(p1->unk0[i], p2); } else { ArrayReplaceAt(p1->unk0[i], p2, result); } } } BOOL TableRemove(unkStruct *p1, void *p2) { if (!p1) return FALSE; s32 i = p1->unkC(p2, p1->unk4); // r31 s32 result = ArraySearch(p1->unk0[i], p2, p1->unk10, 0, 0); if (result == -1) { return FALSE; } else { ArrayDeleteAt(p1->unk0[i], result); return TRUE; } } // TODO: array seems to be generic. Confirm that void* is the // correct return type void *TableLookup(unkStruct *p1, void *p2) { if (!p1) return NULL; s32 i = p1->unkC(p2, p1->unk4); s32 result = ArraySearch(p1->unk0[i], p2, p1->unk10, 0, 0); if (result == -1) { return NULL; } else { return ArrayNth(p1->unk0[i], result); } } void TableMapSafe(unkStruct *p1, s32 p2, s32 p3) { for (s32 i = 0; i < p1->unk4; i++) { ArrayMapBackwards(p1->unk0[i], p2, p3); } } void *TableMapSafe2(unkStruct *p1, s32 p2, s32 p3) { s32 i; void *result; for (i = 0; i < p1->unk4; i++) { if ((result = ArrayMapBackwards2(p1->unk0[i], p2, p3)) != NULL) { return result; } } return NULL; }