hashtable: Add destroy_function method
authorTobias Brunner <tobias@strongswan.org>
Tue, 27 Aug 2013 14:37:41 +0000 (16:37 +0200)
committerTobias Brunner <tobias@strongswan.org>
Thu, 19 Jun 2014 12:00:48 +0000 (14:00 +0200)
src/libstrongswan/collections/hashtable.c
src/libstrongswan/collections/hashtable.h

index ca31d83..2b77a37 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2012 Tobias Brunner
+ * Copyright (C) 2008-2014 Tobias Brunner
  * Hochschule fuer Technik Rapperswil
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -250,7 +250,7 @@ static void rehash(private_hashtable_t *this)
 }
 
 METHOD(hashtable_t, put, void*,
-          private_hashtable_t *this, const void *key, void *value)
+       private_hashtable_t *this, const void *key, void *value)
 {
        void *old_value = NULL;
        pair_t *pair;
@@ -309,19 +309,19 @@ static void *get_internal(private_hashtable_t *this, const void *key,
 }
 
 METHOD(hashtable_t, get, void*,
-          private_hashtable_t *this, const void *key)
+       private_hashtable_t *this, const void *key)
 {
        return get_internal(this, key, this->equals);
 }
 
 METHOD(hashtable_t, get_match, void*,
-          private_hashtable_t *this, const void *key, hashtable_equals_t match)
+       private_hashtable_t *this, const void *key, hashtable_equals_t match)
 {
        return get_internal(this, key, match);
 }
 
 METHOD(hashtable_t, remove_, void*,
-          private_hashtable_t *this, const void *key)
+       private_hashtable_t *this, const void *key)
 {
        void *value = NULL;
        pair_t *pair, *prev = NULL;
@@ -353,7 +353,7 @@ METHOD(hashtable_t, remove_, void*,
 }
 
 METHOD(hashtable_t, remove_at, void,
-          private_hashtable_t *this, private_enumerator_t *enumerator)
+       private_hashtable_t *this, private_enumerator_t *enumerator)
 {
        if (enumerator->table == this && enumerator->current)
        {
@@ -373,13 +373,13 @@ METHOD(hashtable_t, remove_at, void,
 }
 
 METHOD(hashtable_t, get_count, u_int,
-          private_hashtable_t *this)
+       private_hashtable_t *this)
 {
        return this->count;
 }
 
 METHOD(enumerator_t, enumerate, bool,
-          private_enumerator_t *this, const void **key, void **value)
+       private_enumerator_t *this, const void **key, void **value)
 {
        while (this->count && this->row < this->table->capacity)
        {
@@ -411,7 +411,7 @@ METHOD(enumerator_t, enumerate, bool,
 }
 
 METHOD(hashtable_t, create_enumerator, enumerator_t*,
-          private_hashtable_t *this)
+       private_hashtable_t *this)
 {
        private_enumerator_t *enumerator;
 
@@ -427,8 +427,8 @@ METHOD(hashtable_t, create_enumerator, enumerator_t*,
        return &enumerator->enumerator;
 }
 
-METHOD(hashtable_t, destroy, void,
-          private_hashtable_t *this)
+static void destroy_internal(private_hashtable_t *this,
+                                                        void (*fn)(void*,const void*))
 {
        pair_t *pair, *next;
        u_int row;
@@ -438,6 +438,10 @@ METHOD(hashtable_t, destroy, void,
                pair = this->table[row];
                while (pair)
                {
+                       if (fn)
+                       {
+                               fn(pair->value, pair->key);
+                       }
                        next = pair->next;
                        free(pair);
                        pair = next;
@@ -447,6 +451,18 @@ METHOD(hashtable_t, destroy, void,
        free(this);
 }
 
+METHOD(hashtable_t, destroy, void,
+       private_hashtable_t *this)
+{
+       destroy_internal(this, NULL);
+}
+
+METHOD(hashtable_t, destroy_function, void,
+       private_hashtable_t *this, void (*fn)(void*,const void*))
+{
+       destroy_internal(this, fn);
+}
+
 /*
  * Described in header.
  */
@@ -465,6 +481,7 @@ hashtable_t *hashtable_create(hashtable_hash_t hash, hashtable_equals_t equals,
                        .get_count = _get_count,
                        .create_enumerator = _create_enumerator,
                        .destroy = _destroy,
+                       .destroy_function = _destroy_function,
                },
                .hash = hash,
                .equals = equals,
index 0a7ebeb..f60564a 100644 (file)
@@ -156,6 +156,15 @@ struct hashtable_t {
         * Destroys a hash table object.
         */
        void (*destroy) (hashtable_t *this);
+
+       /**
+        * Destroys a hash table object and calls the given function for each
+        * item and its key in the hash table.
+        *
+        * @param function      function to call on each item and key
+        */
+       void (*destroy_function)(hashtable_t *this,
+                                                        void (*)(void *val, const void *key));
 };
 
 /**