Adding a remove_at method to the hash table.

This allows to remove key-value pairs while enumerating them.
This commit is contained in:
Tobias Brunner
2010-06-07 16:36:26 +02:00
parent 88b6f14143
commit b2ddaf0775
2 changed files with 36 additions and 9 deletions
+25 -6
View File
@@ -128,6 +128,11 @@ struct private_enumerator_t {
*/ */
u_int row; u_int row;
/**
* current pair
*/
pair_t *pair;
/** /**
* enumerator for the current row * enumerator for the current row
*/ */
@@ -313,6 +318,22 @@ METHOD(hashtable_t, remove_, void*,
return value; return value;
} }
METHOD(hashtable_t, remove_at, void,
private_hashtable_t *this, private_enumerator_t *enumerator)
{
if (enumerator->table == this && enumerator->current)
{
linked_list_t *list;
list = this->table[enumerator->row];
if (list)
{
list->remove_at(list, enumerator->current);
free(enumerator->pair);
this->count--;
}
}
}
METHOD(hashtable_t, get_count, u_int, METHOD(hashtable_t, get_count, u_int,
private_hashtable_t *this) private_hashtable_t *this)
{ {
@@ -326,17 +347,15 @@ METHOD(enumerator_t, enumerate, bool,
{ {
if (this->current) if (this->current)
{ {
pair_t *pair; if (this->current->enumerate(this->current, &this->pair))
if (this->current->enumerate(this->current, &pair))
{ {
if (key) if (key)
{ {
*key = pair->key; *key = this->pair->key;
} }
if (value) if (value)
{ {
*value = pair->value; *value = this->pair->value;
} }
return TRUE; return TRUE;
} }
@@ -346,7 +365,6 @@ METHOD(enumerator_t, enumerate, bool,
else else
{ {
linked_list_t *list; linked_list_t *list;
list = this->table->table[this->row]; list = this->table->table[this->row];
if (list) if (list)
{ {
@@ -416,6 +434,7 @@ hashtable_t *hashtable_create(hashtable_hash_t hash, hashtable_equals_t equals,
.put = _put, .put = _put,
.get = _get, .get = _get,
.remove = _remove_, .remove = _remove_,
.remove_at = (void*)_remove_at,
.get_count = _get_count, .get_count = _get_count,
.create_enumerator = _create_enumerator, .create_enumerator = _create_enumerator,
.destroy = _destroy, .destroy = _destroy,
+11 -3
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2008 Tobias Brunner * Copyright (C) 2008-2010 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
@@ -86,10 +86,18 @@ struct hashtable_t {
*/ */
void *(*remove) (hashtable_t *this, void *key); void *(*remove) (hashtable_t *this, void *key);
/**
* Removes the key and value pair from the hash table at which the given
* enumerator currently points.
*
* @param enumerator enumerator, from create_enumerator
*/
void (*remove_at) (hashtable_t *this, enumerator_t *enumerator);
/** /**
* Gets the number of items in the hash table. * Gets the number of items in the hash table.
* *
* @return number of items * @return number of items
*/ */
u_int (*get_count) (hashtable_t *this); u_int (*get_count) (hashtable_t *this);
@@ -106,7 +114,7 @@ struct hashtable_t {
* @param hash hash function * @param hash hash function
* @param equals equals function * @param equals equals function
* @param capacity initial capacity * @param capacity initial capacity
* @return hashtable_t object. * @return hashtable_t object.
*/ */
hashtable_t *hashtable_create(hashtable_hash_t hash, hashtable_equals_t equals, hashtable_t *hashtable_create(hashtable_hash_t hash, hashtable_equals_t equals,
u_int capacity); u_int capacity);