152b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian#ifndef HASHMAP_H 252b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian# define HASHMAP_H 352b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian 452b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian# include <stdlib.h> 552b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian# include <stdint.h> 652b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian 752b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qianstruct ext2fs_hashmap { 852b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian uint32_t size; 952b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian uint32_t(*hash)(const void *key, size_t len); 1052b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian void(*free)(void*); 1152b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian struct ext2fs_hashmap_entry *first; 1252b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian struct ext2fs_hashmap_entry *last; 1352b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian struct ext2fs_hashmap_entry { 1452b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian void *data; 1552b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian const void *key; 1652b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian size_t key_len; 1752b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian struct ext2fs_hashmap_entry *next; 1852b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian struct ext2fs_hashmap_entry *list_next; 1952b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian struct ext2fs_hashmap_entry *list_prev; 2052b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian } *entries[0]; 2152b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian}; 2252b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian 2352b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qianstruct ext2fs_hashmap *ext2fs_hashmap_create( 2452b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian uint32_t(*hash_fct)(const void*, size_t), 2552b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian void(*free_fct)(void*), size_t size); 2652b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qianvoid ext2fs_hashmap_add(struct ext2fs_hashmap *h, void *data, const void *key, 2752b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian size_t key_len); 2852b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qianvoid *ext2fs_hashmap_lookup(struct ext2fs_hashmap *h, const void *key, 2952b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian size_t key_len); 3052b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qianvoid *ext2fs_hashmap_iter_in_order(struct ext2fs_hashmap *h, 3152b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian struct ext2fs_hashmap_entry **it); 3252b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qianvoid ext2fs_hashmap_del(struct ext2fs_hashmap *h, 3352b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian struct ext2fs_hashmap_entry *e); 3452b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qianvoid ext2fs_hashmap_free(struct ext2fs_hashmap *h); 3552b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian 3652b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qianuint32_t ext2fs_djb2_hash(const void *str, size_t size); 3752b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian 3852b7292ce3fd9a82682618270536d2c70bcbd4d2Jin Qian#endif /* !HASHMAP_H */ 39