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);
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)