From: Caio Marcelo de Oliveira Filho Date: Thu, 12 Jul 2018 18:17:04 +0000 (-0700) Subject: util/hash_table: add helper to remove entry by key X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4ec8b39fcd8086ff73334dcb31491d907ac08e85;p=mesa.git util/hash_table: add helper to remove entry by key And the corresponding test case. Reviewed-by: Eric Anholt --- diff --git a/src/util/hash_table.c b/src/util/hash_table.c index f8d5d0f88aa..7ee9e18a1fc 100644 --- a/src/util/hash_table.c +++ b/src/util/hash_table.c @@ -420,6 +420,15 @@ _mesa_hash_table_remove(struct hash_table *ht, ht->deleted_entries++; } +/** + * Removes the entry with the corresponding key, if exists. + */ +void _mesa_hash_table_remove_key(struct hash_table *ht, + const void *key) +{ + _mesa_hash_table_remove(ht, _mesa_hash_table_search(ht, key)); +} + /** * This function is an iterator over the hash table. * diff --git a/src/util/hash_table.h b/src/util/hash_table.h index 3846dad4b4a..40ff041e94b 100644 --- a/src/util/hash_table.h +++ b/src/util/hash_table.h @@ -88,6 +88,8 @@ _mesa_hash_table_search_pre_hashed(struct hash_table *ht, uint32_t hash, const void *key); void _mesa_hash_table_remove(struct hash_table *ht, struct hash_entry *entry); +void _mesa_hash_table_remove_key(struct hash_table *ht, + const void *key); struct hash_entry *_mesa_hash_table_next_entry(struct hash_table *ht, struct hash_entry *entry); diff --git a/src/util/tests/hash_table/.gitignore b/src/util/tests/hash_table/.gitignore index a0d50ab82ce..5f2315b32a3 100644 --- a/src/util/tests/hash_table/.gitignore +++ b/src/util/tests/hash_table/.gitignore @@ -6,6 +6,7 @@ insert_and_lookup insert_many null_destroy random_entry +remove_key remove_null replacement clear diff --git a/src/util/tests/hash_table/Makefile.am b/src/util/tests/hash_table/Makefile.am index 6b9221f8589..526454cb1ed 100644 --- a/src/util/tests/hash_table/Makefile.am +++ b/src/util/tests/hash_table/Makefile.am @@ -38,6 +38,7 @@ TESTS = \ insert_many \ null_destroy \ random_entry \ + remove_key \ remove_null \ replacement \ $() diff --git a/src/util/tests/hash_table/meson.build b/src/util/tests/hash_table/meson.build index 4bbc5100ea3..c7b03f19c56 100644 --- a/src/util/tests/hash_table/meson.build +++ b/src/util/tests/hash_table/meson.build @@ -20,7 +20,8 @@ foreach t : ['clear', 'collision', 'delete_and_lookup', 'delete_management', 'destroy_callback', 'insert_and_lookup', 'insert_many', - 'null_destroy', 'random_entry', 'remove_null', 'replacement'] + 'null_destroy', 'random_entry', 'remove_key', 'remove_null', + 'replacement'] test( t, executable( diff --git a/src/util/tests/hash_table/remove_key.c b/src/util/tests/hash_table/remove_key.c new file mode 100644 index 00000000000..906de67998b --- /dev/null +++ b/src/util/tests/hash_table/remove_key.c @@ -0,0 +1,63 @@ +/* + * Copyright © 2018 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include "hash_table.h" + +int +main(int argc, char **argv) +{ + struct hash_table *ht; + const char *str1 = "test1"; + const char *str2 = "test2"; + struct hash_entry *entry; + + (void) argc; + (void) argv; + + ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string, _mesa_key_string_equal); + + _mesa_hash_table_insert(ht, str1, NULL); + _mesa_hash_table_insert(ht, str2, NULL); + + entry = _mesa_hash_table_search(ht, str2); + assert(strcmp(entry->key, str2) == 0); + + entry = _mesa_hash_table_search(ht, str1); + assert(strcmp(entry->key, str1) == 0); + + _mesa_hash_table_remove_key(ht, str1); + + entry = _mesa_hash_table_search(ht, str1); + assert(entry == NULL); + + entry = _mesa_hash_table_search(ht, str2); + assert(strcmp(entry->key, str2) == 0); + + _mesa_hash_table_destroy(ht, NULL); + + return 0; +}