@ -46,6 +46,8 @@
# include "util/u_memory.h"
# include "util/u_hash_table.h"
# define XXH_INLINE_ALL
# include "xxhash.h"
struct util_hash_table
{
@ -297,3 +299,96 @@ util_hash_table_destroy(struct util_hash_table *ht)
FREE ( ht ) ;
}
static unsigned hash_func_u64 ( void * key )
{
return XXH32 ( key , sizeof ( uint64_t ) , 0 ) ;
}
static int compare_func_u64 ( void * key1 , void * key2 )
{
return * ( const uint64_t * ) key1 ! = * ( const uint64_t * ) key2 ;
}
struct util_hash_table_u64 *
util_hash_table_create_u64 ( void ( * destroy ) ( void * value ) )
{
return ( struct util_hash_table_u64 * )
util_hash_table_create ( hash_func_u64 ,
compare_func_u64 ,
destroy ) ;
}
enum pipe_error
util_hash_table_set_u64 ( struct util_hash_table_u64 * ht_u64 ,
uint64_t key ,
void * value )
{
struct util_hash_table * ht = ( struct util_hash_table * ) ht_u64 ;
uint64_t * real_key ;
enum pipe_error err ;
real_key = MALLOC ( sizeof ( * real_key ) ) ;
if ( ! real_key )
return PIPE_ERROR_OUT_OF_MEMORY ;
* real_key = key ;
err = util_hash_table_set ( ht , real_key , value ) ;
if ( err ! = PIPE_OK )
FREE ( real_key ) ;
return err ;
}
void *
util_hash_table_get_u64 ( struct util_hash_table_u64 * ht_u64 ,
uint64_t key )
{
struct util_hash_table * ht = ( struct util_hash_table * ) ht_u64 ;
return util_hash_table_get ( ht , & key ) ;
}
void
util_hash_table_remove_u64 ( struct util_hash_table_u64 * ht_u64 ,
uint64_t key )
{
struct util_hash_table * ht = ( struct util_hash_table * ) ht_u64 ;
unsigned key_hash ;
struct cso_hash_iter iter ;
struct util_hash_table_item * item ;
key_hash = ht - > hash ( & key ) ;
iter = util_hash_table_find_iter ( ht , & key , key_hash ) ;
if ( cso_hash_iter_is_null ( iter ) )
return ;
item = util_hash_table_item ( iter ) ;
ht - > destroy ( item - > value ) ;
FREE ( item - > key ) ;
FREE ( item ) ;
cso_hash_erase ( ht - > cso , iter ) ;
}
void
util_hash_table_destroy_u64 ( struct util_hash_table_u64 * ht_u64 )
{
struct util_hash_table * ht = ( struct util_hash_table * ) ht_u64 ;
struct cso_hash_iter iter ;
struct util_hash_table_item * item ;
iter = cso_hash_first_node ( ht - > cso ) ;
while ( ! cso_hash_iter_is_null ( iter ) ) {
item = util_hash_table_item ( iter ) ;
ht - > destroy ( item - > value ) ;
FREE ( item - > key ) ;
FREE ( item ) ;
iter = cso_hash_iter_next ( iter ) ;
}
cso_hash_delete ( ht - > cso ) ;
FREE ( ht ) ;
}