[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r35680 - in gnunet/src: include util,
gnunet <=