Add hash table helper functions for using pointers as hash keys
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 6 Jul 2010 21:49:14 +0000 (14:49 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 6 Jul 2010 22:00:46 +0000 (15:00 -0700)
src/glsl/ir_function_inlining.cpp
src/glsl/ir_validate.cpp
src/mesa/shader/hash_table.c
src/mesa/shader/hash_table.h

index 1adf67868ee4b0ef97386202c7ddc6bedca5609f..b3d1f1d1674ac37a227d3a172151fb61c0f3880b 100644 (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)
index 1953852487980060bf0666005c5ddec6a1d05bba..7582d57e7c3233664d5107eaf6f3ee6962ecfcad 100644 (file)
 #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;
index fa6ba2bfdfcd8a27fba1a845711a81857016a50d..933e300abddf0821b76cb3df5fbd07f475cece3a 100644 (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;
+}
index 881e756f0876ace99337c7bf7d484c2f509b92e1..05526914643f6627a0cf8e3565a6743d31d90576 100644 (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