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
+ 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
*/
/**
- * @file consensus/ibf.h
+ * @file set/ibf.h
* @brief invertible bloom filter
* @author Florian Dold
*/
#include "platform.h"
-#include "gnunet_common.h"
+#include "gnunet_util_lib.h"
#include "ibf.h"
#include "strata_estimator.h"
strata_estimator_write (const struct StrataEstimator *se, void *buf)
{
int i;
+
+ GNUNET_assert (NULL != se);
for (i = 0; i < se->strata_count; i++)
{
ibf_write_slice (se->strata[i], 0, se->ibf_size, buf);
void
-strata_estimator_insert (struct StrataEstimator *se, struct GNUNET_HashCode *key)
+strata_estimator_insert (struct StrataEstimator *se, struct IBF_Key key)
{
- uint32_t v;
+ uint64_t v;
int i;
- v = key->bits[0];
+ v = key.key_val;
/* count trailing '1'-bits of v */
for (i = 0; v & 1; v>>=1, i++)
/* empty */;
- ibf_insert (se->strata[i], ibf_key_from_hashcode (key));
+ ibf_insert (se->strata[i], key);
}
struct InvertibleBloomFilter *diff;
/* number of keys decoded from the ibf */
int ibf_count;
- int more;
- ibf_count = 0;
/* FIXME: implement this without always allocating new IBFs */
diff = ibf_dup (se1->strata[i]);
ibf_subtract (diff, se2->strata[i]);
- for (;;)
+ for (ibf_count = 0; GNUNET_YES; ibf_count++)
{
+ int more;
+
more = ibf_decode (diff, NULL, NULL);
if (GNUNET_NO == more)
{
count += ibf_count;
break;
}
- if (GNUNET_SYSERR == more)
+ /* Estimate if decoding fails or would not terminate */
+ if ((GNUNET_SYSERR == more) || (ibf_count > diff->size))
{
ibf_destroy (diff);
return count * (1 << (i + 1));
}
- ibf_count++;
}
ibf_destroy (diff);
}
return count;
}
+/**
+ * Make a copy of a strata estimator.
+ *
+ * @param se the strata estimator to copy
+ * @return the copy
+ */
+struct StrataEstimator *
+strata_estimator_dup (struct StrataEstimator *se)
+{
+ struct StrataEstimator *c;
+ int i;
+
+ c = GNUNET_malloc (sizeof (struct StrataEstimator));
+ c->strata_count = se->strata_count;
+ c->ibf_size = se->ibf_size;
+ c->strata = GNUNET_malloc (sizeof (struct InvertibleBloomFilter *) * se->strata_count);
+ for (i = 0; i < se->strata_count; i++)
+ c->strata[i] = ibf_dup (se->strata[i]);
+ return c;
+}
+
void
strata_estimator_destroy (struct StrataEstimator *se)