Files
PixelDefense/engine/libs/flecs/include/flecs/private/hashmap.h

149 lines
3.3 KiB
C

/**
* @file hashmap.h
* @brief Hashmap data structure.
*/
#ifndef FLECS_HASHMAP_H
#define FLECS_HASHMAP_H
#include "api_defines.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
ecs_vec_t keys;
ecs_vec_t values;
} ecs_hm_bucket_t;
typedef struct {
ecs_hash_value_action_t hash;
ecs_compare_action_t compare;
ecs_size_t key_size;
ecs_size_t value_size;
ecs_block_allocator_t *hashmap_allocator;
ecs_block_allocator_t bucket_allocator;
ecs_map_t impl;
} ecs_hashmap_t;
typedef struct {
ecs_map_iter_t it;
ecs_hm_bucket_t *bucket;
int32_t index;
} flecs_hashmap_iter_t;
typedef struct {
void *key;
void *value;
uint64_t hash;
} flecs_hashmap_result_t;
FLECS_DBG_API
void flecs_hashmap_init_(
ecs_hashmap_t *hm,
ecs_size_t key_size,
ecs_size_t value_size,
ecs_hash_value_action_t hash,
ecs_compare_action_t compare,
ecs_allocator_t *allocator);
#define flecs_hashmap_init(hm, K, V, hash, compare, allocator)\
flecs_hashmap_init_(hm, ECS_SIZEOF(K), ECS_SIZEOF(V), hash, compare, allocator)
FLECS_DBG_API
void flecs_hashmap_fini(
ecs_hashmap_t *map);
FLECS_DBG_API
void* flecs_hashmap_get_(
const ecs_hashmap_t *map,
ecs_size_t key_size,
const void *key,
ecs_size_t value_size);
#define flecs_hashmap_get(map, key, V)\
(V*)flecs_hashmap_get_(map, ECS_SIZEOF(*key), key, ECS_SIZEOF(V))
FLECS_DBG_API
flecs_hashmap_result_t flecs_hashmap_ensure_(
ecs_hashmap_t *map,
ecs_size_t key_size,
const void *key,
ecs_size_t value_size);
#define flecs_hashmap_ensure(map, key, V)\
flecs_hashmap_ensure_(map, ECS_SIZEOF(*key), key, ECS_SIZEOF(V))
FLECS_DBG_API
void flecs_hashmap_set_(
ecs_hashmap_t *map,
ecs_size_t key_size,
void *key,
ecs_size_t value_size,
const void *value);
#define flecs_hashmap_set(map, key, value)\
flecs_hashmap_set_(map, ECS_SIZEOF(*key), key, ECS_SIZEOF(*value), value)
FLECS_DBG_API
void flecs_hashmap_remove_(
ecs_hashmap_t *map,
ecs_size_t key_size,
const void *key,
ecs_size_t value_size);
#define flecs_hashmap_remove(map, key, V)\
flecs_hashmap_remove_(map, ECS_SIZEOF(*key), key, ECS_SIZEOF(V))
FLECS_DBG_API
void flecs_hashmap_remove_w_hash_(
ecs_hashmap_t *map,
ecs_size_t key_size,
const void *key,
ecs_size_t value_size,
uint64_t hash);
#define flecs_hashmap_remove_w_hash(map, key, V, hash)\
flecs_hashmap_remove_w_hash_(map, ECS_SIZEOF(*key), key, ECS_SIZEOF(V), hash)
FLECS_DBG_API
ecs_hm_bucket_t* flecs_hashmap_get_bucket(
const ecs_hashmap_t *map,
uint64_t hash);
FLECS_DBG_API
void flecs_hm_bucket_remove(
ecs_hashmap_t *map,
ecs_hm_bucket_t *bucket,
uint64_t hash,
int32_t index);
FLECS_DBG_API
void flecs_hashmap_copy(
ecs_hashmap_t *dst,
const ecs_hashmap_t *src);
FLECS_DBG_API
flecs_hashmap_iter_t flecs_hashmap_iter(
ecs_hashmap_t *map);
FLECS_DBG_API
void* flecs_hashmap_next_(
flecs_hashmap_iter_t *it,
ecs_size_t key_size,
void *key_out,
ecs_size_t value_size);
#define flecs_hashmap_next(map, V)\
(V*)flecs_hashmap_next_(map, 0, NULL, ECS_SIZEOF(V))
#define flecs_hashmap_next_w_key(map, K, key, V)\
(V*)flecs_hashmap_next_(map, ECS_SIZEOF(K), key, ECS_SIZEOF(V))
#ifdef __cplusplus
}
#endif
#endif