htable: add htable_count(). master origin/master
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 13 Aug 2019 03:02:42 +0000 (12:32 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 13 Aug 2019 03:02:42 +0000 (12:32 +0930)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/htable/htable.h
ccan/htable/htable_type.h
ccan/htable/test/run-type.c
ccan/htable/test/run.c

index 938b43afc89ce5a6603c45761da17d26b748475e..0ecae726c0bd560a5a1ba598e4d544d7480041a4 100644 (file)
@@ -75,6 +75,15 @@ bool htable_init_sized(struct htable *ht,
                       size_t (*rehash)(const void *elem, void *priv),
                       void *priv, size_t size);
 
+/**
+ * htable_count - count number of entries in a hash table.
+ * @ht: the hash table
+ */
+static inline size_t htable_count(const struct htable *ht)
+{
+       return ht->elems;
+}
+
 /**
  * htable_clear - empty a hash table.
  * @ht: the hash table to clear
index 14011676903807fed252318ef5884b55f14e9556..9dad4b3927186ab661f6099eeb7e801ed9204277 100644 (file)
@@ -25,6 +25,9 @@
  *     void <name>_clear(struct <name> *);
  *     bool <name>_copy(struct <name> *dst, const struct <name> *src);
  *
+ * Count entries:
+ *     size_t <name>_count(const struct <name> *ht);
+ *
  * Add function only fails if we run out of memory:
  *     bool <name>_add(struct <name> *ht, const <type> *e);
  *
        {                                                               \
                return htable_init_sized(&ht->raw, name##_hash, NULL, s); \
        }                                                               \
+       static inline UNNEEDED size_t name##_count(const struct name *ht) \
+       {                                                               \
+               return htable_count(&ht->raw);                          \
+       }                                                               \
        static inline UNNEEDED void name##_clear(struct name *ht)       \
        {                                                               \
                htable_clear(&ht->raw);                                 \
index f097acb69fdec375acb8472fdc0034a452cd05ca..2fc38c3ac0a8d81530b199cf6ca575f46c3eb5ae 100644 (file)
@@ -65,7 +65,7 @@ static void find_vals(const struct htable_obj *ht,
                        return;
                }
        }
-       pass("Found %u numbers in hash", i);
+       ok1(htable_obj_count(ht) == i);
 }
 
 static void del_vals(struct htable_obj *ht,
@@ -116,12 +116,13 @@ int main(void)
        void *p;
        struct htable_obj_iter iter;
 
-       plan_tests(29);
+       plan_tests(32);
        for (i = 0; i < NUM_VALS; i++)
                val[i].key = i;
        dne = i;
 
        htable_obj_init(&ht);
+       ok1(htable_obj_count(&ht) == 0);
        ok1(ht_max(&ht.raw) == 0);
        ok1(ht.raw.bits == 0);
 
@@ -205,6 +206,8 @@ int main(void)
        }
 
        htable_obj_clear(&ht);
+       ok1(htable_obj_count(&ht) == 0);
        htable_obj_clear(&ht2);
+       ok1(htable_obj_count(&ht2) == 0);
        return exit_status();
 }
index 85502c4ab1f8d3dbeb6e69cde0ecaa2cb4560b7e..3608941d97a9de42fde9a96d60d761e00662fc8e 100644 (file)
@@ -67,7 +67,7 @@ static void find_vals(struct htable *ht,
                        return;
                }
        }
-       pass("Found %llu numbers in hash", (long long)i);
+       ok1(htable_count(ht) == i);
 }
 
 static void del_vals(struct htable *ht,
@@ -105,12 +105,13 @@ int main(void)
        void *p;
        struct htable_iter iter;
 
-       plan_tests(36);
+       plan_tests(38);
        for (i = 0; i < NUM_VALS; i++)
                val[i] = i;
        dne = i;
 
        htable_init(&ht, hash, NULL);
+       ok1(htable_count(&ht) == 0);
        ok1(ht_max(&ht) == 0);
        ok1(ht.bits == 0);
 
@@ -207,6 +208,8 @@ int main(void)
        ok1(htable_init_sized(&ht, hash, NULL, 1025));
        ok1(ht_max(&ht) >= 1025);
        htable_clear(&ht);
-       
+
+       ok1(htable_count(&ht) == 0);
+
        return exit_status();
 }