From c8978fd4253384423d7cfae2d2baf5123a9b12ab Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 28 May 2022 19:03:27 -0700 Subject: [PATCH] Util: Rebalance non-hashed Tables too --- src/util/table.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/util/table.c b/src/util/table.c index 717d0955f..83156c0c9 100644 --- a/src/util/table.c +++ b/src/util/table.c @@ -161,6 +161,24 @@ void* TableLookup(const struct Table* table, uint32_t key) { void TableInsert(struct Table* table, uint32_t key, void* value) { struct TableList* list = _getList(table, key); + if (table->size >= table->tableSize * REBALANCE_THRESHOLD) { + struct Table newTable; + TableInit(&newTable, table->tableSize * REBALANCE_THRESHOLD, NULL); + memcpy(&newTable.fn, &table->fn, sizeof(newTable.fn)); + size_t i; + for (i = 0; i < table->tableSize; ++i) { + struct TableList* list = &table->table[i]; + size_t j; + for (j = 0; j < list->nEntries; ++j) { + TableInsert(&newTable, list->list[j].key, list->list[j].value); + } + free(list->list); + } + free(table->table); + table->tableSize = newTable.tableSize; + table->table = newTable.table; + list = _getList(table, key); + } TABLE_LOOKUP_START(TABLE_COMPARATOR, list) { if (value != lookupResult->value) { if (table->fn.deinitializer) {