Add hash table helper functions for using pointers as hash keys

This commit is contained in:
Ian Romanick
2010-07-06 14:49:14 -07:00
parent e45a982313
commit d1a1ee583e
4 changed files with 41 additions and 26 deletions

View File

@@ -33,9 +33,7 @@
#include "ir_function_inlining.h"
#include "ir_expression_flattening.h"
#include "glsl_types.h"
extern "C" {
#include "hash_table.h"
}
class ir_function_inlining_visitor : public ir_hierarchical_visitor {
public:
@@ -60,16 +58,6 @@ public:
};
unsigned int hash_func(const void *key)
{
return (unsigned int)(uintptr_t)key;
}
int hash_compare_func(const void *key1, const void *key2)
{
return key1 == key2 ? 0 : 1;
}
bool
automatic_inlining_predicate(ir_instruction *ir)
{
@@ -124,7 +112,7 @@ ir_call::generate_inline(ir_instruction *next_ir)
ir_variable *retval = NULL;
struct hash_table *ht;
ht = hash_table_ctor(0, hash_func, hash_compare_func);
ht = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare);
num_parameters = 0;
foreach_iter(exec_list_iterator, iter_sig, this->callee->parameters)

View File

@@ -36,26 +36,15 @@
#include <inttypes.h>
#include "ir.h"
#include "ir_hierarchical_visitor.h"
extern "C" {
#include "hash_table.h"
}
static unsigned int hash_func(const void *key)
{
return (unsigned int)(uintptr_t)key;
}
static int hash_compare_func(const void *key1, const void *key2)
{
return key1 == key2 ? 0 : 1;
}
class ir_validate : public ir_hierarchical_visitor {
public:
ir_validate()
{
this->ht = hash_table_ctor(0, hash_func, hash_compare_func);
this->ht = hash_table_ctor(0, hash_table_pointer_hash,
hash_table_pointer_compare);
this->callback = ir_validate::validate_ir;
this->data = ht;

View File

@@ -157,3 +157,17 @@ hash_table_string_hash(const void *key)
return hash;
}
unsigned
hash_table_pointer_hash(const void *key)
{
return (unsigned)((uintptr_t) key / sizeof(void *));
}
int
hash_table_pointer_compare(const void *key1, const void *key2)
{
return key1 == key2 ? 0 : 1;
}

View File

@@ -118,6 +118,30 @@ extern unsigned hash_table_string_hash(const void *key);
*/
#define hash_table_string_compare ((hash_compare_func_t) strcmp)
/**
* Compute hash value of a pointer
*
* \param key Pointer to be used as a hash key
*
* \note
* The memory pointed to by \c key is \b never accessed. The value of \c key
* itself is used as the hash key
*
* \sa hash_table_pointer_compare
*/
unsigned
hash_table_pointer_hash(const void *key);
/**
* Compare two pointers used as keys
*
* \sa hash_table_pointer_hash
*/
int
hash_table_pointer_compare(const void *key1, const void *key2);
#ifdef __cplusplus
};
#endif