123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- #ifndef _linkhash_h_
- #define _linkhash_h_
- #include "json_object.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- #define LH_PRIME 0x9e370001UL
- #define LH_LOAD_FACTOR 0.66
- #define LH_EMPTY (void*)-1
- #define LH_FREED (void*)-2
- #define JSON_C_STR_HASH_DFLT 0
- #define JSON_C_STR_HASH_PERLLIKE 1
- int json_global_set_string_hash(const int h);
- struct lh_entry;
- typedef void (lh_entry_free_fn) (struct lh_entry *e);
- typedef unsigned long (lh_hash_fn) (const void *k);
- typedef int (lh_equal_fn) (const void *k1, const void *k2);
- struct lh_entry {
-
- const void *k;
-
- int k_is_constant;
-
- const void *v;
-
- struct lh_entry *next;
-
- struct lh_entry *prev;
- };
- struct lh_table {
-
- int size;
-
- int count;
-
- struct lh_entry *head;
-
- struct lh_entry *tail;
- struct lh_entry *table;
-
- lh_entry_free_fn *free_fn;
- lh_hash_fn *hash_fn;
- lh_equal_fn *equal_fn;
- };
- typedef struct lh_table lh_table;
- #define lh_foreach(table, entry) \
- for(entry = table->head; entry; entry = entry->next)
- #define lh_foreach_safe(table, entry, tmp) \
- for(entry = table->head; entry && ((tmp = entry->next) || 1); entry = tmp)
- extern struct lh_table* lh_table_new(int size,
- lh_entry_free_fn *free_fn,
- lh_hash_fn *hash_fn,
- lh_equal_fn *equal_fn);
- extern struct lh_table* lh_kchar_table_new(int size,
- lh_entry_free_fn *free_fn);
- extern struct lh_table* lh_kptr_table_new(int size,
- lh_entry_free_fn *free_fn);
- extern void lh_table_free(struct lh_table *t);
- extern int lh_table_insert(struct lh_table *t, const void *k, const void *v);
- extern int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, const unsigned long h, const unsigned opts);
- extern struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k);
- extern struct lh_entry* lh_table_lookup_entry_w_hash(struct lh_table *t, const void *k, const unsigned long h);
- THIS_FUNCTION_IS_DEPRECATED(extern const void* lh_table_lookup(struct lh_table *t, const void *k));
- extern json_bool lh_table_lookup_ex(struct lh_table *t, const void *k, void **v);
- extern int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e);
- extern int lh_table_delete(struct lh_table *t, const void *k);
- extern int lh_table_length(struct lh_table *t);
- THIS_FUNCTION_IS_DEPRECATED(void lh_abort(const char *msg, ...));
- int lh_table_resize(struct lh_table *t, int new_size);
- #if !defined(_MSC_VER) || (_MSC_VER > 1800)
- #define _LH_INLINE inline
- #else
- #define _LH_INLINE
- #endif
- static _LH_INLINE unsigned long lh_get_hash(const struct lh_table *t, const void *k)
- {
- return t->hash_fn(k);
- }
- #undef _LH_INLINE
- #ifdef __UNCONST
- #define _LH_UNCONST(a) __UNCONST(a)
- #else
- #define _LH_UNCONST(a) ((void *)(uintptr_t)(const void *)(a))
- #endif
- #define lh_entry_k(entry) _LH_UNCONST((entry)->k)
- #define lh_entry_v(entry) _LH_UNCONST((entry)->v)
- #ifdef __cplusplus
- }
- #endif
- #endif
|