gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r35680 - in gnunet/src: include util
Date: Thu, 30 Apr 2015 09:29:31 +0200

Author: grothoff
Date: 2015-04-30 09:29:31 +0200 (Thu, 30 Apr 2015)
New Revision: 35680

Modified:
   gnunet/src/include/gnunet_container_lib.h
   gnunet/src/util/container_multihashmap.c
   gnunet/src/util/container_multipeermap.c
Log:
adding GNUNET_CONTAINER_multipeermap_get_random

Modified: gnunet/src/include/gnunet_container_lib.h
===================================================================
--- gnunet/src/include/gnunet_container_lib.h   2015-04-29 22:09:21 UTC (rev 
35679)
+++ gnunet/src/include/gnunet_container_lib.h   2015-04-30 07:29:31 UTC (rev 
35680)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2001-2013 Christian Grothoff (and other contributing 
authors)
+     Copyright (C) 2001-2015 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
@@ -857,7 +857,8 @@
 /**
  * @ingroup hashmap
  * Call @a it on a random value from the map, or not at all
- * if the map is empty.
+ * if the map is empty.  Note that this function has linear
+ * complexity (in the size of the map).
  *
  * @param map the map
  * @param it function to call on a random entry
@@ -1115,7 +1116,23 @@
                                             void *it_cls);
 
 
+/**
+ * @ingroup hashmap
+ * Call @a it on a random value from the map, or not at all
+ * if the map is empty.  Note that this function has linear
+ * complexity (in the size of the map).
+ *
+ * @param map the map
+ * @param it function to call on a random entry
+ * @param it_cls extra argument to @a it
+ * @return the number of key value pairs processed, zero or one.
+ */
+unsigned int
+GNUNET_CONTAINER_multipeermap_get_random (const struct 
GNUNET_CONTAINER_MultiPeerMap *map,
+                                          GNUNET_CONTAINER_PeerMapIterator it,
+                                          void *it_cls);
 
+
 /* Version of multihashmap with 32 bit keys */
 
 /**

Modified: gnunet/src/util/container_multihashmap.c
===================================================================
--- gnunet/src/util/container_multihashmap.c    2015-04-29 22:09:21 UTC (rev 
35679)
+++ gnunet/src/util/container_multihashmap.c    2015-04-30 07:29:31 UTC (rev 
35680)
@@ -841,7 +841,8 @@
 /**
  * @ingroup hashmap
  * Call @a it on a random value from the map, or not at all
- * if the map is empty.
+ * if the map is empty. Note that this function has linear
+ * complexity (in the size of the map).
  *
  * @param map the map
  * @param it function to call on a random entry

Modified: gnunet/src/util/container_multipeermap.c
===================================================================
--- gnunet/src/util/container_multipeermap.c    2015-04-29 22:09:21 UTC (rev 
35679)
+++ gnunet/src/util/container_multipeermap.c    2015-04-30 07:29:31 UTC (rev 
35680)
@@ -482,7 +482,7 @@
          sme = map->map[i].sme;
        else
          sme = p->next;
-       ret++;  
+       ret++;
       }
       else
       {
@@ -645,7 +645,7 @@
       struct BigMapEntry *bme;
 
       while (NULL != (bme = old_map[i].bme))
-      {        
+      {
        old_map[i].bme = bme->next;
        idx = idx_of (map, &bme->key);
        bme->next = new_map[idx].bme;
@@ -798,6 +798,80 @@
 
 
 /**
+ * @ingroup hashmap
+ * Call @a it on a random value from the map, or not at all
+ * if the map is empty.  Note that this function has linear
+ * complexity (in the size of the map).
+ *
+ * @param map the map
+ * @param it function to call on a random entry
+ * @param it_cls extra argument to @a it
+ * @return the number of key value pairs processed, zero or one.
+ */
+unsigned int
+GNUNET_CONTAINER_multipeermap_get_random (const struct 
GNUNET_CONTAINER_MultiPeerMap *map,
+                                          GNUNET_CONTAINER_PeerMapIterator it,
+                                          void *it_cls)
+{
+  unsigned int off;
+  unsigned int idx;
+  union MapEntry me;
+
+  if (0 == map->size)
+    return 0;
+  if (NULL == it)
+    return 1;
+  off = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE,
+                                  map->size);
+  for (idx = 0; idx < map->map_length; idx++)
+  {
+    me = map->map[idx];
+    if (map->use_small_entries)
+    {
+      struct SmallMapEntry *sme;
+      struct SmallMapEntry *nxt;
+
+      nxt = me.sme;
+      while (NULL != (sme = nxt))
+      {
+        nxt = sme->next;
+        if (0 == off)
+        {
+          if (GNUNET_OK != it (it_cls,
+                               sme->key,
+                               sme->value))
+            return GNUNET_SYSERR;
+          return 1;
+        }
+        off--;
+      }
+    }
+    else
+    {
+      struct BigMapEntry *bme;
+      struct BigMapEntry *nxt;
+
+      nxt = me.bme;
+      while (NULL != (bme = nxt))
+      {
+        nxt = bme->next;
+        if (0 == off)
+        {
+          if (GNUNET_OK != it (it_cls,
+                               &bme->key, bme->value))
+            return GNUNET_SYSERR;
+          return 1;
+        }
+        off--;
+      }
+    }
+  }
+  GNUNET_break (0);
+  return GNUNET_SYSERR;
+}
+
+
+/**
  * Create an iterator for a multipeermap.
  * The iterator can be used to retrieve all the elements in the multipeermap
  * one by one, without having to handle all elements at once (in contrast to




reply via email to

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