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