X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Futil%2Fhash_table.h;h=40ff041e94ba1bd57bc682307e1f2778865f54e6;hb=47f5d158aebe69136a844f82c59b6b70336248e6;hp=c69abfa3e64db3286c323872bb4f03bd5542c5fc;hpb=59f57289959702e528b68bdd0d06488089517a00;p=mesa.git diff --git a/src/util/hash_table.h b/src/util/hash_table.h index c69abfa3e64..40ff041e94b 100644 --- a/src/util/hash_table.h +++ b/src/util/hash_table.h @@ -62,6 +62,8 @@ _mesa_hash_table_create(void *mem_ctx, uint32_t (*key_hash_function)(const void *key), bool (*key_equals_function)(const void *a, const void *b)); +struct hash_table * +_mesa_hash_table_clone(struct hash_table *src, void *dst_mem_ctx); void _mesa_hash_table_destroy(struct hash_table *ht, void (*delete_function)(struct hash_entry *entry)); void _mesa_hash_table_clear(struct hash_table *ht, @@ -86,6 +88,8 @@ _mesa_hash_table_search_pre_hashed(struct hash_table *ht, uint32_t hash, const void *key); void _mesa_hash_table_remove(struct hash_table *ht, struct hash_entry *entry); +void _mesa_hash_table_remove_key(struct hash_table *ht, + const void *key); struct hash_entry *_mesa_hash_table_next_entry(struct hash_table *ht, struct hash_entry *entry); @@ -94,7 +98,7 @@ _mesa_hash_table_random_entry(struct hash_table *ht, bool (*predicate)(struct hash_entry *entry)); uint32_t _mesa_hash_data(const void *data, size_t size); -uint32_t _mesa_hash_string(const char *key); +uint32_t _mesa_hash_string(const void *key); bool _mesa_key_string_equal(const void *a, const void *b); bool _mesa_key_pointer_equal(const void *a, const void *b); @@ -105,7 +109,8 @@ static inline uint32_t _mesa_key_hash_string(const void *key) static inline uint32_t _mesa_hash_pointer(const void *pointer) { - return _mesa_hash_data(&pointer, sizeof(pointer)); + uintptr_t num = (uintptr_t) pointer; + return (uint32_t) ((num >> 2) ^ (num >> 6) ^ (num >> 10) ^ (num >> 14)); } enum { @@ -139,6 +144,44 @@ _mesa_fnv32_1a_accumulate_block(uint32_t hash, const void *data, size_t size) entry != NULL; \ entry = _mesa_hash_table_next_entry(ht, entry)) +static inline void +hash_table_call_foreach(struct hash_table *ht, + void (*callback)(const void *key, + void *data, + void *closure), + void *closure) +{ + struct hash_entry *entry; + + hash_table_foreach(ht, entry) + callback(entry->key, entry->data, closure); +} + +/** + * Hash table wrapper which supports 64-bit keys. + */ +struct hash_table_u64 { + struct hash_table *table; + void *deleted_key_data; +}; + +struct hash_table_u64 * +_mesa_hash_table_u64_create(void *mem_ctx); + +void +_mesa_hash_table_u64_destroy(struct hash_table_u64 *ht, + void (*delete_function)(struct hash_entry *entry)); + +void +_mesa_hash_table_u64_insert(struct hash_table_u64 *ht, uint64_t key, + void *data); + +void * +_mesa_hash_table_u64_search(struct hash_table_u64 *ht, uint64_t key); + +void +_mesa_hash_table_u64_remove(struct hash_table_u64 *ht, uint64_t key); + #ifdef __cplusplus } /* extern C */ #endif