#ifndef BTPD_HASHTABLE_H #define BTPD_HASHTABLE_H struct htbl_iter { struct _htbl *tbl; size_t bi; size_t cnt; struct _any **ptr; struct _any *obj; }; struct _htbl *_htbl_create(float ratio, int (*equal)(const void *, const void *), uint32_t (*hash)(const void *), size_t keyoff, size_t chainoff); void _htbl_free(struct _htbl *tbl); void _htbl_insert(struct _htbl *tbl, struct _any *o); struct _any *_htbl_remove(struct _htbl *tbl, const void *key); struct _any *_htbl_find(struct _htbl *tbl, const void *key); void _htbl_fillv(struct _htbl *tbl, struct _any **v); struct _any **_htbl_tov(struct _htbl *tbl); size_t _htbl_size(struct _htbl *tbl); struct _any *_htbl_iter_first(struct _htbl *tbl, struct htbl_iter *it); struct _any *_htbl_iter_next(struct htbl_iter *it); struct _any *_htbl_iter_del(struct htbl_iter *it); #define HTBL_ENTRY(name) struct _any *name #define HTBL_TYPE(name, type, ktype, kname, cname) \ __attribute__((always_inline)) static inline struct name * \ name##_create(float ratio, int (*equal)(const void *, const void *), \ uint32_t (*hash)(const void *)) \ { \ return (struct name *) \ _htbl_create(ratio, equal, hash, offsetof(struct type, kname), \ offsetof(struct type, cname)); \ } \ \ __attribute__((always_inline)) static inline struct type * \ name##_find(struct name *tbl, const ktype *key) \ { \ return (struct type *)_htbl_find((struct _htbl *)tbl, key); \ } \ \ __attribute__((always_inline)) static inline struct type * \ name##_remove(struct name *tbl, const ktype *key) \ { \ return (struct type *)_htbl_remove((struct _htbl *)tbl, key); \ } \ \ __attribute__((always_inline)) static inline void \ name##_free(struct name *tbl) \ { \ _htbl_free((struct _htbl *)tbl); \ } \ \ __attribute__((always_inline)) static inline void \ name##_insert(struct name *tbl, struct type *o) \ { \ _htbl_insert((struct _htbl *)tbl, (struct _any *)o); \ } \ __attribute__((always_inline)) static inline struct type ** \ name##_tov(struct name *tbl) \ { \ return (struct type **) _htbl_tov((struct _htbl *)tbl); \ } \ __attribute__((always_inline)) static inline void \ name##_fillv(struct name *tbl, struct type **v) \ { \ _htbl_fillv((struct _htbl *)tbl, (struct _any **)v); \ } \ \ __attribute__((always_inline)) static inline size_t \ name##_size(struct name *tbl) \ { \ return _htbl_size((struct _htbl *)tbl); \ } \ \ __attribute__((always_inline)) static inline struct type * \ name##_iter_first(struct name *tbl, struct htbl_iter *it) \ { \ return (struct type *)_htbl_iter_first((struct _htbl *)tbl, it); \ } \ \ __attribute__((always_inline)) static inline struct type * \ name##_iter_del(struct htbl_iter *it) \ { \ return (struct type *)_htbl_iter_del(it); \ } \ __attribute__((always_inline)) static inline struct type * \ name##_iter_next(struct htbl_iter *it) \ { \ return (struct type *)_htbl_iter_next(it); \ } #endif