On 09/29/2011 10:51 AM, Ian Romanick wrote: > From: Ian Romanick <ian.d.roman...@intel.com> > > Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> > --- > src/mesa/program/hash_table.c | 25 +++++++++++++++++++++++++ > src/mesa/program/hash_table.h | 15 +++++++++++++++ > 2 files changed, 40 insertions(+), 0 deletions(-) > > diff --git a/src/mesa/program/hash_table.c b/src/mesa/program/hash_table.c > index 2b09462..dc8563a 100644 > --- a/src/mesa/program/hash_table.c > +++ b/src/mesa/program/hash_table.c > @@ -150,6 +150,31 @@ hash_table_insert(struct hash_table *ht, void *data, > const void *key) > } > > void > +hash_table_replace(struct hash_table *ht, void *data, const void *key) > +{ > + const unsigned hash_value = (*ht->hash)(key); > + const unsigned bucket = hash_value % ht->num_buckets; > + struct node *node; > + struct hash_node *hn; > + > + foreach(node, & ht->buckets[bucket]) { > + hn = (struct hash_node *) node; > + > + if ((*ht->compare)(hn->key, key) == 0) { > + hn->data = data; > + return; > + } > + }
I'm pretty sure you mean: struct hash_node *hn = get_node(ht, key); if (hn != NULL) { hn->data = data; return; } You just refactored that out in the previous patch to avoid doing things like this. Right? > + > + hn = calloc(1, sizeof(*hn)); > + > + hn->data = data; > + hn->key = key; > + > + insert_at_head(& ht->buckets[bucket], & hn->link); > +} > + > +void > hash_table_remove(struct hash_table *ht, const void *key) > { > struct node *node = (struct node *) get_node(ht, key); > diff --git a/src/mesa/program/hash_table.h b/src/mesa/program/hash_table.h > index 746939c..e7ab067 100644 > --- a/src/mesa/program/hash_table.h > +++ b/src/mesa/program/hash_table.h > @@ -93,11 +93,26 @@ extern void *hash_table_find(struct hash_table *ht, const > void *key); > * If \c key is already in the hash table, it will be added again. Future > * calls to \c hash_table_find and \c hash_table_remove will return or > remove, > * repsectively, the most recently added instance of \c key. > + * > + * \sa hash_table_replace > */ > extern void hash_table_insert(struct hash_table *ht, void *data, > const void *key); > > /** > + * Add an element to a hash table with replacement > + * > + * \warning > + * If \c key is already in the hash table, \c data will \b replace the most > + * recently inserted \c data (see the warning in \c hash_table_insert) for > + * that key. > + * > + * \sa hash_table_insert > + */ > +extern void hash_table_replace(struct hash_table *ht, void *data, > + const void *key); > + > +/** > * Remove a specific element from a hash table. > */ > extern void hash_table_remove(struct hash_table *ht, const void *key); _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev