HashMap.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #ifndef CORE_HASHMAP_H
  2. #define CORE_HASHMAP_H
  3. #include "core/Types.h"
  4. typedef size_t (*CoreHasher)(const void* key, size_t n);
  5. typedef bool (*CoreEqual)(const void* keyA, const void* keyB, size_t n);
  6. typedef struct {
  7. void* keys;
  8. void* values;
  9. size_t keySize;
  10. size_t valueSize;
  11. size_t capacity;
  12. size_t entries;
  13. CoreHasher hasher;
  14. CoreEqual equal;
  15. } CoreHashMap;
  16. #define CORE_HASH_MAP(keySize, valueSize, hasher, equal) \
  17. ((CoreHashMap){nullptr, nullptr, keySize, valueSize, 0, 0, hasher, equal})
  18. void coreDestroyHashMap(CoreHashMap* m);
  19. void coreRehashHashMap(CoreHashMap* m, size_t minCapacity);
  20. void* coreHashMapPutPointer(CoreHashMap* m, const void* key, const void* value);
  21. #define coreHashMapPut(m, kType, key, vType, ...) \
  22. coreHashMapPutPointer(m, &(kType){key}, &(vType){__VA_ARGS__})
  23. void* coreHashMapSearchPointer(CoreHashMap* m, const void* key);
  24. #define coreHashMapSearch(m, kType, key, vType) \
  25. ((vType*)coreHashMapSearchPointer(m, &(kType){key}))
  26. const void* coreHashMapSearchPointerC(const CoreHashMap* m, const void* key);
  27. #define coreHashMapSearchC(m, kType, key, vType) \
  28. ((const vType*)coreHashMapSearchPointerC(m, &(kType){key}))
  29. bool coreHashMapContainsPointer(const CoreHashMap* m, const void* key);
  30. #define coreHashMapContains(m, kType, key) \
  31. coreHashMapContainsPointer(m, &(kType){key})
  32. void coreClearHashMap(CoreHashMap* m);
  33. size_t coreToStringHashMap(const CoreHashMap* m, char* buffer, size_t n,
  34. CoreToString keyString, CoreToString valueString);
  35. void coreSwapHashMap(CoreHashMap* a, CoreHashMap* b);
  36. size_t coreHashString(const void* key, size_t n);
  37. size_t coreHash(const void* key, size_t n);
  38. bool coreEqual(const void* keyA, const void* keyB, size_t n);
  39. typedef struct {
  40. const void* key;
  41. void* value;
  42. } CoreHashMapNode;
  43. typedef struct {
  44. const CoreHashMap* map;
  45. size_t index;
  46. CoreHashMapNode node;
  47. } CoreHashMapIterator;
  48. #define CORE_HASH_MAP_ITERATOR(map) \
  49. ((CoreHashMapIterator){map, (size_t)-1, {0}})
  50. CoreHashMapNode* coreHashMapNext(CoreHashMapIterator* mi);
  51. #define coreHashMapKeyPointer(node, type) ((const type*)node->key)
  52. #define coreHashMapKey(node, type) (*coreHashMapKeyPointer(node, type))
  53. #define coreHashMapValuePointer(node, type) ((const type*)node->value)
  54. #define coreHashMapValue(node, type) (*coreHashMapValuePointer(node, type))
  55. #endif