gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r26912 - in gnunet/src: include util


From: gnunet
Subject: [GNUnet-SVN] r26912 - in gnunet/src: include util
Date: Wed, 17 Apr 2013 11:41:59 +0200

Author: harsha
Date: 2013-04-17 11:41:59 +0200 (Wed, 17 Apr 2013)
New Revision: 26912

Added:
   gnunet/src/util/container_multihashmap32.c
   gnunet/src/util/test_container_multihashmap32.c
Modified:
   gnunet/src/include/gnunet_container_lib.h
   gnunet/src/util/Makefile.am
Log:
- 32-bit key hashmap


Modified: gnunet/src/include/gnunet_container_lib.h
===================================================================
--- gnunet/src/include/gnunet_container_lib.h   2013-04-17 00:44:29 UTC (rev 
26911)
+++ gnunet/src/include/gnunet_container_lib.h   2013-04-17 09:41:59 UTC (rev 
26912)
@@ -706,7 +706,197 @@
                                             GNUNET_CONTAINER_HashMapIterator 
it,
                                             void *it_cls);
 
+/* Version of multihashmap with 32 bit keys */
 
+/**
+ * Opaque handle for the 32-bit key HashMap.
+ */
+struct GNUNET_CONTAINER_MultiHashMap32;
+
+
+/**
+ * Iterator over hash map entries.
+ *
+ * @param cls closure
+ * @param key current key code
+ * @param value value in the hash map
+ * @return GNUNET_YES if we should continue to
+ *         iterate,
+ *         GNUNET_NO if not.
+ */
+typedef int (*GNUNET_CONTAINER_HashMapIterator32) (void *cls,
+                                                   uint32_t key,
+                                                   void *value);
+
+
+/**
+ * Create a 32-bit key multi hash map.
+ *
+ * @param len initial size (map will grow as needed)
+ * @return NULL on error
+ */
+struct GNUNET_CONTAINER_MultiHashMap32 *
+GNUNET_CONTAINER_multihashmap32_create (unsigned int len);
+
+
+/**
+ * Destroy a 32-bit key hash map.  Will not free any values
+ * stored in the hash map!
+ *
+ * @param map the map
+ */
+void
+GNUNET_CONTAINER_multihashmap32_destroy (struct GNUNET_CONTAINER_MultiHashMap32
+                                         *map);
+
+
+/**
+ * Get the number of key-value pairs in the map.
+ *
+ * @param map the map
+ * @return the number of key value pairs
+ */
+unsigned int
+GNUNET_CONTAINER_multihashmap32_size (const struct
+                                      GNUNET_CONTAINER_MultiHashMap32 *map);
+
+
+/**
+ * Given a key find a value in the map matching the key.
+ *
+ * @param map the map
+ * @param key what to look for
+ * @return NULL if no value was found; note that
+ *   this is indistinguishable from values that just
+ *   happen to be NULL; use "contains" to test for
+ *   key-value pairs with value NULL
+ */
+void *
+GNUNET_CONTAINER_multihashmap32_get (const struct 
+                                     GNUNET_CONTAINER_MultiHashMap32 *map,
+                                     uint32_t key);
+
+
+/**
+ * Iterate over all entries in the map.
+ *
+ * @param map the map
+ * @param it function to call on each entry
+ * @param it_cls extra argument to it
+ * @return the number of key value pairs processed,
+ *         GNUNET_SYSERR if it aborted iteration
+ */
+int
+GNUNET_CONTAINER_multihashmap32_iterate (const struct
+                                         GNUNET_CONTAINER_MultiHashMap32 *map,
+                                         GNUNET_CONTAINER_HashMapIterator32 it,
+                                         void *it_cls);
+
+
+/**
+ * Remove the given key-value pair from the map.  Note that if the
+ * key-value pair is in the map multiple times, only one of the pairs
+ * will be removed.
+ *
+ * @param map the map
+ * @param key key of the key-value pair
+ * @param value value of the key-value pair
+ * @return GNUNET_YES on success, GNUNET_NO if the key-value pair
+ *  is not in the map
+ */
+int
+GNUNET_CONTAINER_multihashmap32_remove (struct GNUNET_CONTAINER_MultiHashMap32
+                                        *map,
+                                        uint32_t key, void *value);
+
+
+/**
+ * Remove all entries for the given key from the map.
+ * Note that the values would not be "freed".
+ *
+ * @param map the map
+ * @param key identifies values to be removed
+ * @return number of values removed
+ */
+int
+GNUNET_CONTAINER_multihashmap32_remove_all (struct
+                                            GNUNET_CONTAINER_MultiHashMap32
+                                            *map,
+                                            uint32_t key);
+
+
+/**
+ * Check if the map contains any value under the given
+ * key (including values that are NULL).
+ *
+ * @param map the map
+ * @param key the key to test if a value exists for it
+ * @return GNUNET_YES if such a value exists,
+ *         GNUNET_NO if not
+ */
+int
+GNUNET_CONTAINER_multihashmap32_contains (const struct
+                                          GNUNET_CONTAINER_MultiHashMap32 *map,
+                                          uint32_t key);
+
+
+/**
+ * Check if the map contains the given value under the given
+ * key.
+ *
+ * @param map the map
+ * @param key the key to test if a value exists for it
+ * @param value value to test for
+ * @return GNUNET_YES if such a value exists,
+ *         GNUNET_NO if not
+ */
+int
+GNUNET_CONTAINER_multihashmap32_contains_value (const struct
+                                                GNUNET_CONTAINER_MultiHashMap32
+                                                *map, 
+                                                uint32_t key,
+                                                const void *value);
+
+
+/**
+ * Store a key-value pair in the map.
+ *
+ * @param map the map
+ * @param key key to use
+ * @param value value to use
+ * @param opt options for put
+ * @return GNUNET_OK on success,
+ *         GNUNET_NO if a value was replaced (with REPLACE)
+ *         GNUNET_SYSERR if UNIQUE_ONLY was the option and the
+ *                       value already exists
+ */
+int
+GNUNET_CONTAINER_multihashmap32_put (struct GNUNET_CONTAINER_MultiHashMap32
+                                     *map, uint32_t key, void *value,
+                                     enum GNUNET_CONTAINER_MultiHashMapOption
+                                     opt);
+
+
+/**
+ * Iterate over all entries in the map that match a particular key.
+ *
+ * @param map the map
+ * @param key key that the entries must correspond to
+ * @param it function to call on each entry
+ * @param it_cls extra argument to it
+ * @return the number of key value pairs processed,
+ *         GNUNET_SYSERR if it aborted iteration
+ */
+int
+GNUNET_CONTAINER_multihashmap32_get_multiple (const struct
+                                              GNUNET_CONTAINER_MultiHashMap32
+                                              *map, uint32_t key,
+                                              
GNUNET_CONTAINER_HashMapIterator32 
+                                              it, void *it_cls);
+
+
+
+
 /* ******************** doubly-linked list *************** */
 /* To avoid mistakes: head->prev == tail->next == NULL     */
 

Modified: gnunet/src/util/Makefile.am
===================================================================
--- gnunet/src/util/Makefile.am 2013-04-17 00:44:29 UTC (rev 26911)
+++ gnunet/src/util/Makefile.am 2013-04-17 09:41:59 UTC (rev 26912)
@@ -73,6 +73,7 @@
   container_heap.c \
   container_meta_data.c \
   container_multihashmap.c \
+  container_multihashmap32.c \
   container_slist.c \
   crypto_aes.c \
   crypto_crc.c \
@@ -209,6 +210,7 @@
  test_container_bloomfilter \
  test_container_meta_data \
  test_container_multihashmap \
+ test_container_multihashmap32 \
  test_container_heap \
  test_container_slist \
  test_crypto_aes \
@@ -310,8 +312,13 @@
 test_container_multihashmap_SOURCES = \
  test_container_multihashmap.c
 test_container_multihashmap_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la  
+ $(top_builddir)/src/util/libgnunetutil.la
 
+test_container_multihashmap32_SOURCES = \
+ test_container_multihashmap32.c
+test_container_multihashmap32_LDADD = \
+ $(top_builddir)/src/util/libgnunetutil.la
+
 test_container_heap_SOURCES = \
  test_container_heap.c
 test_container_heap_LDADD = \

Copied: gnunet/src/util/container_multihashmap32.c (from rev 21926, 
gnunet/src/util/container_multihashmap.c)
===================================================================
--- gnunet/src/util/container_multihashmap32.c                          (rev 0)
+++ gnunet/src/util/container_multihashmap32.c  2013-04-17 09:41:59 UTC (rev 
26912)
@@ -0,0 +1,497 @@
+/*
+     This file is part of GNUnet.
+     (C) 2008 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+/**
+ * @file util/container_multihashmap32.c
+ * @brief a version of hash map implemented in container_multihashmap.c but 
with
+ *          uint32_t as keys
+ * @author Christian Grothoff
+ * @author Sree Harsha Totakura
+ */
+
+#include "platform.h"
+#include "gnunet_common.h"
+#include "gnunet_container_lib.h"
+#include "gnunet_crypto_lib.h"
+
+#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
+
+/**
+ * An entry in the hash map.
+ */
+struct MapEntry
+{
+
+  /**
+   * Key for the entry.
+   */
+  uint32_t key;
+
+  /**
+   * Value of the entry.
+   */
+  void *value;
+
+  /**
+   * If there is a hash collision, we create a linked list.
+   */
+  struct MapEntry *next;
+
+};
+
+/**
+ * Internal representation of the hash map.
+ */
+struct GNUNET_CONTAINER_MultiHashMap32
+{
+
+  /**
+   * All of our buckets.
+   */
+  struct MapEntry **map;
+
+  /**
+   * Number of entries in the map.
+   */
+  unsigned int size;
+
+  /**
+   * Length of the "map" array.
+   */
+  unsigned int map_length;
+};
+
+
+/**
+ * Create a multi hash map.
+ *
+ * @param len initial size (map will grow as needed)
+ * @return NULL on error
+ */
+struct GNUNET_CONTAINER_MultiHashMap32 *
+GNUNET_CONTAINER_multihashmap32_create (unsigned int len)
+{
+  struct GNUNET_CONTAINER_MultiHashMap32 *ret;
+
+  GNUNET_assert (len > 0);
+  ret = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_MultiHashMap32));
+  ret->map = GNUNET_malloc (len * sizeof (struct MapEntry *));
+  ret->map_length = len;
+  return ret;
+}
+
+
+/**
+ * Destroy a hash map.  Will not free any values
+ * stored in the hash map!
+ *
+ * @param map the map
+ */
+void
+GNUNET_CONTAINER_multihashmap32_destroy (struct GNUNET_CONTAINER_MultiHashMap32
+                                         *map)
+{
+  unsigned int i;
+  struct MapEntry *e;
+
+  for (i = 0; i < map->map_length; i++)
+  {
+    while (NULL != (e = map->map[i]))
+    {
+      map->map[i] = e->next;
+      GNUNET_free (e);
+    }
+  }
+  GNUNET_free (map->map);
+  GNUNET_free (map);
+}
+
+
+/**
+ * Compute the index of the bucket for the given key.
+ *
+ * @param m hash map for which to compute the index
+ * @param key what key should the index be computed for
+ * @return offset into the "map" array of "m"
+ */
+static unsigned int
+idx_of (const struct GNUNET_CONTAINER_MultiHashMap32 *m,
+        const uint32_t key)
+{
+  GNUNET_assert (m != NULL);
+  return ((unsigned int) key) % m->map_length;
+}
+
+
+/**
+ * Get the number of key-value pairs in the map.
+ *
+ * @param map the map
+ * @return the number of key value pairs
+ */
+unsigned int
+GNUNET_CONTAINER_multihashmap32_size (const struct
+                                      GNUNET_CONTAINER_MultiHashMap32 *map)
+{
+  return map->size;
+}
+
+
+/**
+ * Given a key find a value in the map matching the key.
+ *
+ * @param map the map
+ * @param key what to look for
+ * @return NULL if no value was found; note that
+ *   this is indistinguishable from values that just
+ *   happen to be NULL; use "contains" to test for
+ *   key-value pairs with value NULL
+ */
+void *
+GNUNET_CONTAINER_multihashmap32_get (const struct
+                                     GNUNET_CONTAINER_MultiHashMap32 *map,
+                                     uint32_t key)
+{
+  struct MapEntry *e;
+
+  e = map->map[idx_of (map, key)];
+  while (e != NULL)
+  {
+    if (key == e->key)
+      return e->value;
+    e = e->next;
+  }
+  return NULL;
+}
+
+
+/**
+ * Iterate over all entries in the map.
+ *
+ * @param map the map
+ * @param it function to call on each entry
+ * @param it_cls extra argument to it
+ * @return the number of key value pairs processed,
+ *         GNUNET_SYSERR if it aborted iteration
+ */
+int
+GNUNET_CONTAINER_multihashmap32_iterate (const struct
+                                         GNUNET_CONTAINER_MultiHashMap32 *map,
+                                         GNUNET_CONTAINER_HashMapIterator32 it,
+                                         void *it_cls)
+{
+  int count;
+  unsigned int i;
+  struct MapEntry *e;
+  struct MapEntry *n;
+
+  count = 0;
+  GNUNET_assert (map != NULL);
+  for (i = 0; i < map->map_length; i++)
+  {
+    n = map->map[i];
+    while (NULL != (e = n))
+    {
+      n = e->next;
+      if (NULL != it)
+      {
+        if (GNUNET_OK != it (it_cls, e->key, e->value))
+          return GNUNET_SYSERR;
+      }
+      count++;
+    }
+  }
+  return count;
+}
+
+
+/**
+ * Remove the given key-value pair from the map.  Note that if the
+ * key-value pair is in the map multiple times, only one of the pairs
+ * will be removed.
+ *
+ * @param map the map
+ * @param key key of the key-value pair
+ * @param value value of the key-value pair
+ * @return GNUNET_YES on success, GNUNET_NO if the key-value pair
+ *  is not in the map
+ */
+int
+GNUNET_CONTAINER_multihashmap32_remove (struct GNUNET_CONTAINER_MultiHashMap32
+                                        *map,
+                                        uint32_t key, void *value)
+{
+  struct MapEntry *e;
+  struct MapEntry *p;
+  unsigned int i;
+
+  i = idx_of (map, key);
+  p = NULL;
+  e = map->map[i];
+  while (e != NULL)
+  {
+    if ( (key == e->key) && (value == e->value) )
+    {
+      if (p == NULL)
+        map->map[i] = e->next;
+      else
+        p->next = e->next;
+      GNUNET_free (e);
+      map->size--;
+      return GNUNET_YES;
+    }
+    p = e;
+    e = e->next;
+  }
+  return GNUNET_NO;
+}
+
+
+/**
+ * Remove all entries for the given key from the map.
+ * Note that the values would not be "freed".
+ *
+ * @param map the map
+ * @param key identifies values to be removed
+ * @return number of values removed
+ */
+int
+GNUNET_CONTAINER_multihashmap32_remove_all (struct
+                                            GNUNET_CONTAINER_MultiHashMap32
+                                            *map,
+                                            uint32_t key)
+{
+  struct MapEntry *e;
+  struct MapEntry *p;
+  unsigned int i;
+  int ret;
+
+  ret = 0;
+  i = idx_of (map, key);
+  p = NULL;
+  e = map->map[i];
+  while (e != NULL)
+  {
+    if (key == e->key)
+    {
+      if (p == NULL)
+        map->map[i] = e->next;
+      else
+        p->next = e->next;
+      GNUNET_free (e);
+      map->size--;
+      if (p == NULL)
+        e = map->map[i];
+      else
+        e = p->next;
+      ret++;
+    }
+    else
+    {
+      p = e;
+      e = e->next;
+    }
+  }
+  return ret;
+}
+
+
+/**
+ * Check if the map contains any value under the given
+ * key (including values that are NULL).
+ *
+ * @param map the map
+ * @param key the key to test if a value exists for it
+ * @return GNUNET_YES if such a value exists,
+ *         GNUNET_NO if not
+ */
+int
+GNUNET_CONTAINER_multihashmap32_contains (const struct
+                                          GNUNET_CONTAINER_MultiHashMap32 *map,
+                                          uint32_t key)
+{
+  struct MapEntry *e;
+
+  e = map->map[idx_of (map, key)];
+  while (e != NULL)
+  {
+    if (key == e->key)
+      return GNUNET_YES;
+    e = e->next;
+  }
+  return GNUNET_NO;
+}
+
+
+/**
+ * Check if the map contains the given value under the given
+ * key.
+ *
+ * @param map the map
+ * @param key the key to test if a value exists for it
+ * @param value value to test for
+ * @return GNUNET_YES if such a value exists,
+ *         GNUNET_NO if not
+ */
+int
+GNUNET_CONTAINER_multihashmap32_contains_value (const struct
+                                                GNUNET_CONTAINER_MultiHashMap32
+                                                *map, 
+                                                uint32_t key,
+                                                const void *value)
+{
+  struct MapEntry *e;
+
+  e = map->map[idx_of (map, key)];
+  while (e != NULL)
+  {
+    if ( (key == e->key) && (e->value == value) )
+      return GNUNET_YES;
+    e = e->next;
+  }
+  return GNUNET_NO;
+}
+
+
+/**
+ * Grow the given map to a more appropriate size.
+ *
+ * @param map the hash map to grow
+ */
+static void
+grow (struct GNUNET_CONTAINER_MultiHashMap32 *map)
+{
+  struct MapEntry **old_map;
+  struct MapEntry **new_map;
+  struct MapEntry *e;
+  unsigned int old_len;
+  unsigned int new_len;
+  unsigned int idx;
+  unsigned int i;
+
+  old_map = map->map;
+  old_len = map->map_length;
+  new_len = old_len * 2;
+  new_map = GNUNET_malloc (sizeof (struct MapEntry *) * new_len);
+  map->map_length = new_len;
+  map->map = new_map;
+  for (i = 0; i < old_len; i++)
+  {
+    while (NULL != (e = old_map[i]))
+    {
+      old_map[i] = e->next;
+      idx = idx_of (map, e->key);
+      e->next = new_map[idx];
+      new_map[idx] = e;
+    }
+  }
+  GNUNET_free (old_map);
+}
+
+
+/**
+ * Store a key-value pair in the map.
+ *
+ * @param map the map
+ * @param key key to use
+ * @param value value to use
+ * @param opt options for put
+ * @return GNUNET_OK on success,
+ *         GNUNET_NO if a value was replaced (with REPLACE)
+ *         GNUNET_SYSERR if UNIQUE_ONLY was the option and the
+ *                       value already exists
+ */
+int
+GNUNET_CONTAINER_multihashmap32_put (struct GNUNET_CONTAINER_MultiHashMap32
+                                     *map, uint32_t key, void *value,
+                                     enum GNUNET_CONTAINER_MultiHashMapOption
+                                     opt)
+{
+  struct MapEntry *e;
+  unsigned int i;
+
+  i = idx_of (map, key);
+  if ((opt != GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE) &&
+      (opt != GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+  {
+    e = map->map[i];
+    while (e != NULL)
+    {
+      if (key == e->key)
+      {
+        if (opt == GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)
+          return GNUNET_SYSERR;
+        e->value = value;
+        return GNUNET_NO;
+      }
+      e = e->next;
+    }
+  }
+  if (map->size / 3 >= map->map_length / 4)
+  {
+    grow (map);
+    i = idx_of (map, key);
+  }
+  e = GNUNET_malloc (sizeof (struct MapEntry));
+  e->key = key;
+  e->value = value;
+  e->next = map->map[i];
+  map->map[i] = e;
+  map->size++;
+  return GNUNET_OK;
+}
+
+
+/**
+ * Iterate over all entries in the map that match a particular key.
+ *
+ * @param map the map
+ * @param key key that the entries must correspond to
+ * @param it function to call on each entry
+ * @param it_cls extra argument to it
+ * @return the number of key value pairs processed,
+ *         GNUNET_SYSERR if it aborted iteration
+ */
+int
+GNUNET_CONTAINER_multihashmap32_get_multiple (const struct
+                                              GNUNET_CONTAINER_MultiHashMap32
+                                              *map, uint32_t key,
+                                              
GNUNET_CONTAINER_HashMapIterator32 
+                                              it, void *it_cls)
+{
+  int count;
+  struct MapEntry *e;
+  struct MapEntry *n;
+
+  count = 0;
+  n = map->map[idx_of (map, key)];
+  while (NULL != (e = n))
+  {
+    n = e->next;
+    if (key != e->key)
+      continue;
+    if ((it != NULL) && (GNUNET_OK != it (it_cls, key, e->value)))
+      return GNUNET_SYSERR;
+    count++;
+  }
+  return count;
+}
+
+
+/* end of container_multihashmap.c */

Copied: gnunet/src/util/test_container_multihashmap32.c (from rev 26911, 
gnunet/src/util/test_container_multihashmap.c)
===================================================================
--- gnunet/src/util/test_container_multihashmap32.c                             
(rev 0)
+++ gnunet/src/util/test_container_multihashmap32.c     2013-04-17 09:41:59 UTC 
(rev 26912)
@@ -0,0 +1,106 @@
+/*
+     This file is part of GNUnet.
+     (C) 2008 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file util/test_container_multihashmap32.c
+ * @brief Test for container_multihashmap32.c
+ * @author Christian Grothoff
+ * @author Sree Harsha Totakura
+ */
+
+#include "platform.h"
+#include "gnunet_common.h"
+#include "gnunet_container_lib.h"
+
+#define ABORT() { fprintf(stderr, "Error at %s:%d\n", __FILE__, __LINE__); if 
(m != NULL) GNUNET_CONTAINER_multihashmap32_destroy(m); return 1; }
+#define CHECK(c) { if (! (c)) ABORT(); }
+
+static int
+testMap (int i)
+{
+  struct GNUNET_CONTAINER_MultiHashMap32 *m;
+  uint32_t k1;
+  uint32_t k2;
+  const char *ret;
+  int j;
+
+  CHECK (NULL != (m = GNUNET_CONTAINER_multihashmap32_create (i)));
+  k1 = 0;
+  k2 = UINT32_MAX;
+  CHECK (GNUNET_NO == GNUNET_CONTAINER_multihashmap32_contains (m, k1));
+  CHECK (GNUNET_NO == GNUNET_CONTAINER_multihashmap32_contains (m, k2));
+  CHECK (GNUNET_NO == GNUNET_CONTAINER_multihashmap32_remove (m, k1, NULL));
+  CHECK (GNUNET_NO == GNUNET_CONTAINER_multihashmap32_remove (m, k2, NULL));
+  CHECK (NULL == GNUNET_CONTAINER_multihashmap32_get (m, k1));
+  CHECK (NULL == GNUNET_CONTAINER_multihashmap32_get (m, k2));
+  CHECK (0 == GNUNET_CONTAINER_multihashmap32_remove_all (m, k1));
+  CHECK (0 == GNUNET_CONTAINER_multihashmap32_size (m));
+  CHECK (0 == GNUNET_CONTAINER_multihashmap32_iterate (m, NULL, NULL));
+  CHECK (0 == GNUNET_CONTAINER_multihashmap32_get_multiple (m, k1, NULL, 
NULL));
+
+  CHECK (GNUNET_OK ==
+         GNUNET_CONTAINER_multihashmap32_put (m, k1, "v1",
+                                              
GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE));
+  CHECK (1 == GNUNET_CONTAINER_multihashmap32_size (m));
+  ret = GNUNET_CONTAINER_multihashmap32_get (m, k1);
+  GNUNET_assert (ret != NULL);
+  CHECK (0 == strcmp ("v1", ret));
+  CHECK (GNUNET_NO ==
+         GNUNET_CONTAINER_multihashmap32_put (m, k1, "v1",
+                                            
GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE));
+  CHECK (1 == GNUNET_CONTAINER_multihashmap32_size (m));
+  CHECK (GNUNET_OK ==
+         GNUNET_CONTAINER_multihashmap32_put (m, k1, "v2",
+                                            
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
+  CHECK (GNUNET_OK ==
+         GNUNET_CONTAINER_multihashmap32_put (m, k1, "v3",
+                                            
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
+  CHECK (3 == GNUNET_CONTAINER_multihashmap32_size (m));
+  CHECK (GNUNET_OK == GNUNET_CONTAINER_multihashmap32_remove (m, k1, "v3"));
+  CHECK (2 == GNUNET_CONTAINER_multihashmap32_size (m));
+  CHECK (GNUNET_YES == GNUNET_CONTAINER_multihashmap32_contains (m, k1));
+  CHECK (GNUNET_NO == GNUNET_CONTAINER_multihashmap32_contains (m, k2));
+  CHECK (2 == GNUNET_CONTAINER_multihashmap32_get_multiple (m, k1, NULL, 
NULL));
+  CHECK (0 == GNUNET_CONTAINER_multihashmap32_get_multiple (m, k2, NULL, 
NULL));
+  CHECK (2 == GNUNET_CONTAINER_multihashmap32_iterate (m, NULL, NULL));
+  CHECK (2 == GNUNET_CONTAINER_multihashmap32_remove_all (m, k1));
+  for (j = 0; j < 1024; j++)
+    CHECK (GNUNET_OK ==
+           GNUNET_CONTAINER_multihashmap32_put (m, k1, "v2",
+                                                
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
+  GNUNET_CONTAINER_multihashmap32_destroy (m);
+  return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+  int failureCount = 0;
+  int i;
+
+  GNUNET_log_setup ("test-container-multihashmap", "WARNING", NULL);
+  for (i = 1; i < 255; i++)
+    failureCount += testMap (i);
+  if (failureCount != 0)
+    return 1;
+  return 0;
+}
+
+/* end of test_container_multihashmap.c */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]