get_match() method added to hashtable_t.

This commit is contained in:
Tobias Brunner
2012-05-24 15:15:34 +02:00
parent fa50a89c95
commit 0e5d587df7
2 changed files with 34 additions and 5 deletions
+17 -4
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2008-2011 Tobias Brunner * Copyright (C) 2008-2012 Tobias Brunner
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@@ -251,8 +251,8 @@ METHOD(hashtable_t, put, void*,
return old_value; return old_value;
} }
METHOD(hashtable_t, get, void*, static void *get_internal(private_hashtable_t *this, void *key,
private_hashtable_t *this, void *key) hashtable_equals_t equals)
{ {
void *value = NULL; void *value = NULL;
pair_t *pair; pair_t *pair;
@@ -260,7 +260,7 @@ METHOD(hashtable_t, get, void*,
pair = this->table[this->hash(key) & this->mask]; pair = this->table[this->hash(key) & this->mask];
while (pair) while (pair)
{ {
if (this->equals(key, pair->key)) if (equals(key, pair->key))
{ {
value = pair->value; value = pair->value;
break; break;
@@ -270,6 +270,18 @@ METHOD(hashtable_t, get, void*,
return value; return value;
} }
METHOD(hashtable_t, get, void*,
private_hashtable_t *this, void *key)
{
return get_internal(this, key, this->equals);
}
METHOD(hashtable_t, get_match, void*,
private_hashtable_t *this, void *key, hashtable_equals_t match)
{
return get_internal(this, key, match);
}
METHOD(hashtable_t, remove_, void*, METHOD(hashtable_t, remove_, void*,
private_hashtable_t *this, void *key) private_hashtable_t *this, void *key)
{ {
@@ -409,6 +421,7 @@ hashtable_t *hashtable_create(hashtable_hash_t hash, hashtable_equals_t equals,
.public = { .public = {
.put = _put, .put = _put,
.get = _get, .get = _get,
.get_match = _get_match,
.remove = _remove_, .remove = _remove_,
.remove_at = (void*)_remove_at, .remove_at = (void*)_remove_at,
.get_count = _get_count, .get_count = _get_count,
+17 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2008-2010 Tobias Brunner * Copyright (C) 2008-2012 Tobias Brunner
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@@ -77,6 +77,22 @@ struct hashtable_t {
*/ */
void *(*get) (hashtable_t *this, void *key); void *(*get) (hashtable_t *this, void *key);
/**
* Returns the value with a matching key, if the hash table contains such an
* entry, otherwise NULL is returned.
*
* Compared to get() the given match function is used to compare the keys
* for equality. The hash function does have to be deviced properly in
* order to make this work if the match function compares keys differently
* than the equals function provided to the constructor. This basically
* allows to enumerate all entries with the same hash value.
*
* @param key the key to match against
* @param match match function to be used when comparing keys
* @return the value, NULL if not found
*/
void *(*get_match) (hashtable_t *this, void *key, hashtable_equals_t match);
/** /**
* Removes the value with the given key from the hash table and returns the * Removes the value with the given key from the hash table and returns the
* removed value (or NULL if no such value existed). * removed value (or NULL if no such value existed).