get_match() method added to hashtable_t.
authorTobias Brunner <tobias@strongswan.org>
Thu, 24 May 2012 10:54:38 +0000 (12:54 +0200)
committerTobias Brunner <tobias@strongswan.org>
Thu, 24 May 2012 13:15:34 +0000 (15:15 +0200)
src/libstrongswan/utils/hashtable.c
src/libstrongswan/utils/hashtable.h

index 33f6451..498d107 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2011 Tobias Brunner
+ * Copyright (C) 2008-2012 Tobias Brunner
  * Hochschule fuer Technik Rapperswil
  *
  * 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;
 }
 
-METHOD(hashtable_t, get, void*,
-          private_hashtable_t *this, void *key)
+static void *get_internal(private_hashtable_t *this, void *key,
+                                                 hashtable_equals_t equals)
 {
        void *value = NULL;
        pair_t *pair;
@@ -260,7 +260,7 @@ METHOD(hashtable_t, get, void*,
        pair = this->table[this->hash(key) & this->mask];
        while (pair)
        {
-               if (this->equals(key, pair->key))
+               if (equals(key, pair->key))
                {
                        value = pair->value;
                        break;
@@ -270,6 +270,18 @@ METHOD(hashtable_t, get, void*,
        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*,
           private_hashtable_t *this, void *key)
 {
@@ -409,6 +421,7 @@ hashtable_t *hashtable_create(hashtable_hash_t hash, hashtable_equals_t equals,
                .public = {
                        .put = _put,
                        .get = _get,
+                       .get_match = _get_match,
                        .remove = _remove_,
                        .remove_at = (void*)_remove_at,
                        .get_count = _get_count,
index 27aca9b..0a21ca3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2010 Tobias Brunner
+ * Copyright (C) 2008-2012 Tobias Brunner
  * Hochschule fuer Technik Rapperswil
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -78,6 +78,22 @@ struct hashtable_t {
        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
         * removed value (or NULL if no such value existed).
         *