Generalise bitfield type
authornorly <ny-git@enpas.org>
Sun, 14 Jul 2019 12:22:25 +0000 (14:22 +0200)
committernorly <ny-git@enpas.org>
Sun, 14 Jul 2019 12:22:25 +0000 (14:22 +0200)
No speed improvement to speak of, but this allows further experiments

lookup-incoming.c

index c31251873c72f9f0d3503177da8896025c7327a0..8223feb5618e72d77a3cadeb2689beb3ebd605b4 100644 (file)
@@ -8,16 +8,19 @@
 
 #define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y))
 
+
+typedef __uint32_t bitfield_type;
+
 #define BIT_SET(set, d) \
-  ( (void) ( set[d >> 3] |= (1 << (d & 7)) ) )
+  ( (void) ( set[d >> 5] |= (1 << (d & 31)) ) )
 #define BIT_ISSET(set, d) \
-  (!(! ( set[d >> 3] & (1 << (d & 7)) ) ))
+  (!(! ( set[d >> 5] & (1 << (d & 31)) ) ))
 
-int ANY_BITS_SET(unsigned char *set, size_t bytes)
+int ANY_BITS_SET(bitfield_type *set, size_t elems)
 {
        size_t i;
 
-       for (i = 0; i < bytes; i++)
+       for (i = 0; i < elems; i++)
                if (set[i] != 0)
                        return 1;
 
@@ -61,10 +64,11 @@ int main(int argc, char **argv)
 
        art_id i;
 
-       unsigned char *titles_seen;
-       unsigned char *titles_prev_round;
-       unsigned char *titles_this_round;
-       size_t titles_bitfield_len;
+       bitfield_type *titles_seen;
+       bitfield_type *titles_prev_round;
+       bitfield_type *titles_this_round;
+       size_t titles_bitfield_elems;
+       size_t titles_bitfield_bytes;
 
 
        if (argc < 2) {
@@ -187,18 +191,19 @@ int main(int argc, char **argv)
 
        printf("\n\n\n\nBuilding table of distances...\n\n");
 
-       titles_bitfield_len = ROUNDUP(titles / 8, sizeof(size_t));
+       titles_bitfield_elems = ROUNDUP(titles / 8 / sizeof(bitfield_type), sizeof(bitfield_type));
+       titles_bitfield_bytes = titles_bitfield_elems * sizeof(bitfield_type);
 
-       titles_seen = calloc(titles_bitfield_len, 1);
+       titles_seen = calloc(titles_bitfield_bytes, 1);
        titles_prev_round = NULL;
-       titles_this_round = calloc(titles_bitfield_len, 1);
+       titles_this_round = calloc(titles_bitfield_bytes, 1);
 
        cur_dist = 0;
 
        BIT_SET(titles_seen, title_id);
        BIT_SET(titles_this_round, title_id);
 
-       while (ANY_BITS_SET(titles_this_round, titles_bitfield_len)) {
+       while (ANY_BITS_SET(titles_this_round, titles_bitfield_elems)) {
                art_id i;
 
                cur_dist++;
@@ -206,7 +211,7 @@ int main(int argc, char **argv)
 
                free(titles_prev_round); /* free is safe to call on NULL */
                titles_prev_round = titles_this_round;
-               titles_this_round = calloc(titles_bitfield_len, 1);
+               titles_this_round = calloc(titles_bitfield_bytes, 1);
 
                for (i = 0; i < titles; i++) {
                        int j;
@@ -220,7 +225,7 @@ int main(int argc, char **argv)
                        }
                }
 
-               for (i = 0; i < titles_bitfield_len; i++) {
+               for (i = 0; i < titles_bitfield_elems; i++) {
                        titles_this_round[i] &= ~titles_seen[i];
                        titles_seen[i] |= titles_this_round[i];
                }