HashMap.h 3.0 KB

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