Adding a remove_at method to the hash table.
This allows to remove key-value pairs while enumerating them.
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user