From 0258683c748b1ce09a498fbc49d262fa2ffd9214 Mon Sep 17 00:00:00 2001 From: Jonathan Hoffstadt Date: Thu, 13 Feb 2025 20:53:32 -0600 Subject: [PATCH] feat: pl_ds.h hashmap insert can now replace item --- pl_ds.h | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/pl_ds.h b/pl_ds.h index 22d415f..1b777d0 100644 --- a/pl_ds.h +++ b/pl_ds.h @@ -4,8 +4,8 @@ */ // library version (format XYYZZ) -#define PL_DS_VERSION "1.0.0" -#define PL_DS_VERSION_NUM 10000 +#define PL_DS_VERSION "1.1.0" +#define PL_DS_VERSION_NUM 10100 /* Index of this file: @@ -176,7 +176,7 @@ COMPILE TIME OPTIONS PL_DS_ALLOC(x) PL_DS_FREE(x) * Change initial hashmap size: - PL_DS_HASHMAP_INITIAL_SIZE (default is 256) // should be power of 2 + PL_DS_HASHMAP_INITIAL_SIZE (default is 1024) // should be power of 2 * Change assert by defining: PL_DS_ASSERT(x) */ @@ -209,7 +209,7 @@ COMPILE TIME OPTIONS #endif #ifndef PL_DS_HASHMAP_INITIAL_SIZE - #define PL_DS_HASHMAP_INITIAL_SIZE 256 + #define PL_DS_HASHMAP_INITIAL_SIZE 1024 #endif //----------------------------------------------------------------------------- @@ -533,26 +533,38 @@ pl__hm_insert(plHashMap** pptHashMap, uint64_t ulKey, uint64_t ulValue, const ch else if(((float)ptHashMap->_uItemCount / (float)ptHashMap->_uBucketCount) > 0.60f) pl__hm_resize(pptHashMap, ptHashMap->_uBucketCount * 2, pcFile, iLine); - uint64_t mask = ptHashMap->_uBucketCount - 1; + uint64_t mask = ptHashMap->_uBucketCount - 1; uint64_t ulModKey = ulKey & mask; - while(ptHashMap->_aulKeys[ulModKey] != ulKey && ptHashMap->_aulKeys[ulModKey] != UINT64_MAX) + uint64_t ulExistingKey = pl__hm_lookup(pptHashMap, ulKey); + if(ulExistingKey == UINT64_MAX) { - ulModKey = (ulModKey + 1) & mask; - if(ptHashMap->_aulKeys[ulModKey] == UINT64_MAX - 1) - break; - } + while(ptHashMap->_aulKeys[ulModKey] != ulKey && ptHashMap->_aulKeys[ulModKey] != UINT64_MAX) + { + ulModKey = (ulModKey + 1) & mask; + if(ptHashMap->_aulKeys[ulModKey] == UINT64_MAX - 1) + break; + } - ptHashMap->_aulKeys[ulModKey] = ulKey; - ptHashMap->_aulValueIndices[ulModKey] = ulValue; - ptHashMap->_uItemCount++; + ptHashMap->_aulKeys[ulModKey] = ulKey; + ptHashMap->_aulValueIndices[ulModKey] = ulValue; + ptHashMap->_uItemCount++; + } + else + { + while(ptHashMap->_aulKeys[ulModKey] != ulKey && ptHashMap->_aulKeys[ulModKey] != UINT64_MAX) + ulModKey = (ulModKey + 1) & mask; + + ptHashMap->_aulValueIndices[ulModKey] = ulValue; + } } static inline void pl__hm_remove(plHashMap** pptHashMap, uint64_t ulKey) { plHashMap* ptHashMap = *pptHashMap; - PL_DS_ASSERT(ptHashMap->_uBucketCount > 0 && "hashmap has no items"); + if(ptHashMap == NULL) + return; uint64_t mask = ptHashMap->_uBucketCount - 1; uint64_t ulModKey = ulKey & mask; @@ -688,4 +700,4 @@ pl__hm_has_key(plHashMap** pptHashMap, uint64_t ulKey) return ptHashMap->_aulKeys[ulModKey] != UINT64_MAX; } -#endif // PL_DS_H \ No newline at end of file +#endif // PL_DS_H