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