mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
mesa: Add iterate method for string_to_uint_map
The upcoming shader cache needs this to be able to cache hash data from the gl_shader_program structure. Edited-by: Carl Worth <cworth@cworth.org>: There is an internal implementation detail that the hash table underlying the struct string_to_uint_map stores each value internally as (value+1). The user needn't be very concerned with this (other than knowing that a value of UINT_MAX cannot be stored) since put() adds 1 and get() subtracts 1. So in this commit, rather than call the user's function directly with hash_table_call_foreach, we call through a wrapper that fixes up the off-by-one values before the caller's callback sees them. And with this wrapper in place, we also give a better signature to the callback function being passed to iterate(), so that this callback function can actually expect a char* and an unsigned argument, (rather than a couple of void* ). Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:
parent
62d5b4b03a
commit
165575d0a8
1 changed files with 34 additions and 0 deletions
|
|
@ -198,6 +198,11 @@ string_to_uint_map_dtor(struct string_to_uint_map *);
|
|||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
struct string_map_iterate_wrapper_closure {
|
||||
void (*callback)(const char *key, unsigned value, void *closure);
|
||||
void *closure;
|
||||
};
|
||||
|
||||
/**
|
||||
* Map from a string (name) to an unsigned integer value
|
||||
*
|
||||
|
|
@ -228,6 +233,24 @@ public:
|
|||
hash_table_clear(this->ht);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a passed callback for the hash
|
||||
*/
|
||||
void iterate(void (*func)(const char *, unsigned, void *), void *closure)
|
||||
{
|
||||
struct string_map_iterate_wrapper_closure *wrapper;
|
||||
|
||||
wrapper = (struct string_map_iterate_wrapper_closure *)
|
||||
malloc(sizeof(struct string_map_iterate_wrapper_closure));
|
||||
if (wrapper == NULL)
|
||||
return;
|
||||
|
||||
wrapper->callback = func;
|
||||
wrapper->closure = closure;
|
||||
|
||||
hash_table_call_foreach(this->ht, subtract_one_wrapper, wrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the value associated with a particular key
|
||||
*
|
||||
|
|
@ -281,6 +304,17 @@ private:
|
|||
free((char *)key);
|
||||
}
|
||||
|
||||
static void subtract_one_wrapper(const void *key, void *data, void *closure)
|
||||
{
|
||||
struct string_map_iterate_wrapper_closure *wrapper =
|
||||
(struct string_map_iterate_wrapper_closure *) closure;
|
||||
unsigned value = (intptr_t) data;
|
||||
|
||||
value -= 1;
|
||||
|
||||
wrapper->callback((const char *) key, value, wrapper->closure);
|
||||
}
|
||||
|
||||
struct hash_table *ht;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue