get_match() method added to hashtable_t.
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
Reference in New Issue
Block a user