#ifndef HASH_H
#define HASH_H
typedef unsigned int hash_callback_t(const void *p);
typedef int hash_cmp_callback_t(const void *p1, const void *p2);
struct hash_table *
hash_table_create(pool_t table_pool, pool_t node_pool, unsigned int initial_size,
hash_callback_t *hash_cb, hash_cmp_callback_t *key_compare_cb);
void hash_table_destroy(struct hash_table **table);
void hash_table_clear(struct hash_table *table, bool free_collisions);
void *hash_table_lookup(const struct hash_table *table, const void *key) ATTR_PURE;
bool hash_table_lookup_full(const struct hash_table *table,
const void *lookup_key,
void **orig_key, void **value);
void hash_table_insert(struct hash_table *table, void *key, void *value);
void hash_table_update(struct hash_table *table, void *key, void *value);
void hash_table_remove(struct hash_table *table, const void *key);
unsigned int hash_table_count(const struct hash_table *table) ATTR_PURE;
struct hash_iterate_context *hash_table_iterate_init(struct hash_table *table);
bool hash_table_iterate(struct hash_iterate_context *ctx,
void **key_r, void **value_r);
void hash_table_iterate_deinit(struct hash_iterate_context **ctx);
void hash_table_freeze(struct hash_table *table);
void hash_table_thaw(struct hash_table *table);
void hash_table_copy(struct hash_table *dest, struct hash_table *src);
unsigned int str_hash(const void *p) ATTR_PURE;
unsigned int strcase_hash(const void *p) ATTR_PURE;
#endif