{
struct GNUNET_CONTAINER_MultiHashMap *ret;
+ GNUNET_assert (len > 0);
ret = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_MultiHashMap));
ret->map = GNUNET_malloc (len * sizeof (struct MapEntry *));
ret->map_length = len;
idx_of (const struct GNUNET_CONTAINER_MultiHashMap *m,
const GNUNET_HashCode * key)
{
+ GNUNET_assert (m!=NULL);
return (*(unsigned int *) key) % m->map_length;
}
unsigned int i;
struct MapEntry *e;
struct MapEntry *n;
+ GNUNET_HashCode kc;
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) && (GNUNET_OK != it (it_cls, &e->key, e->value)))
- return GNUNET_SYSERR;
+ if (NULL != it)
+ {
+ kc = e->key;
+ if (GNUNET_OK != it (it_cls, &kc, e->value))
+ return GNUNET_SYSERR;
+ }
count++;
}
}
}
+/**
+ * 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_multihashmap_contains_value (const struct
+ GNUNET_CONTAINER_MultiHashMap
+ *map,
+ const GNUNET_HashCode * key,
+ const void *value)
+{
+ struct MapEntry *e;
+
+ e = map->map[idx_of (map, key)];
+ while (e != NULL)
+ {
+ if ( (0 == memcmp (key, &e->key, sizeof (GNUNET_HashCode))) &&
+ (e->value == value) )
+ return GNUNET_YES;
+ e = e->next;
+ }
+ return GNUNET_NO;
+}
+
+
/**
* Grow the given map to a more appropriate size.
*
n = e->next;
if (0 != memcmp (key, &e->key, sizeof (GNUNET_HashCode)))
continue;
- if ((it != NULL) && (GNUNET_OK != it (it_cls, &e->key, e->value)))
+ if ((it != NULL) && (GNUNET_OK != it (it_cls, key, e->value)))
return GNUNET_SYSERR;
count++;
}