HashMap.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. void coreInitHashMap(CoreHashMap* m, size_t keySize, size_t valueSize);
  21. void coreInitHashMapF(CoreHashMap* m, size_t keySize, size_t valueSize,
  22. CoreHasher hasher, CoreEqual equal);
  23. void coreDestroyHashMap(CoreHashMap* m);
  24. void coreRehashHashMap(CoreHashMap* m, size_t minCapacity);
  25. void* coreHashMapPutPointer(CoreHashMap* m, const void* key, const void* value);
  26. #define coreHashMapPut(m, kType, key, vType, ...) \
  27. coreHashMapPutPointer(m, &(kType){key}, &(vType){__VA_ARGS__})
  28. void* coreHashMapSearchPointer(CoreHashMap* m, const void* key);
  29. #define coreHashMapSearch(m, kType, key, vType) \
  30. ((vType*)coreHashMapSearchPointer(m, &(kType){key}))
  31. const void* coreHashMapSearchPointerC(const CoreHashMap* m, const void* key);
  32. #define coreHashMapSearchC(m, kType, key, vType) \
  33. ((const vType*)coreHashMapSearchPointerC(m, &(kType){key}))
  34. bool coreHashMapContainsPointer(const CoreHashMap* m, const void* key);
  35. #define coreHashMapContains(m, kType, key) \
  36. coreHashMapContainsPointer(m, &(kType){key})
  37. void coreClearHashMap(CoreHashMap* m);
  38. bool coreHashMapRemovePointer(CoreHashMap* m, const void* key);
  39. #define coreHashMapRemove(m, kType, key) \
  40. coreHashMapRemovePointer(m, &(kType){key})
  41. size_t coreToStringHashMap(const CoreHashMap* m, char* buffer, size_t n,
  42. CoreToString keyString, CoreToString valueString);
  43. void coreSwapHashMap(CoreHashMap* a, CoreHashMap* b);
  44. size_t coreHashString(const void* key, size_t n);
  45. size_t coreHash(const void* key, size_t n);
  46. bool coreEqual(const void* keyA, const void* keyB, size_t n);
  47. typedef struct {
  48. const void* key;
  49. void* value;
  50. } CoreHashMapNode;
  51. typedef struct {
  52. char* key;
  53. char* endKey;
  54. char* value;
  55. char* endValue;
  56. const CoreHashMap* map;
  57. CoreHashMapNode node;
  58. } CoreHashMapIterator;
  59. void coreInitHashMapIterator(CoreHashMapIterator* mi, CoreHashMap* m);
  60. bool coreHashMapHasNext(CoreHashMapIterator* mi);
  61. CoreHashMapNode* coreHashMapNext(CoreHashMapIterator* mi);
  62. #define coreHashMapKeyPointer(node, type) ((const type*)node->key)
  63. #define coreHashMapKey(node, type) (*coreHashMapKeyPointer(node, type))
  64. #define coreHashMapValuePointer(node, type) ((type*)node->value)
  65. #define coreHashMapValue(node, type) (*coreHashMapValuePointer(node, type))
  66. #endif