-indentation, code cleanup
[oweals/gnunet.git] / src / set / strata_estimator.c
index 685c50f0fd26bcc2d704a0ba825fd5c2cc6df9a9..0f92ea4d98a5a7eeb21be7b3f28dbc98a8adc0d0 100644 (file)
@@ -4,7 +4,7 @@
 
       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"
 
@@ -33,6 +33,8 @@ void
 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);
@@ -53,15 +55,15 @@ strata_estimator_read (const void *buf, struct StrataEstimator *se)
 
 
 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);
 }
 
 
@@ -107,31 +109,52 @@ strata_estimator_difference (const struct StrataEstimator *se1,
     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)