jset: Use TCON_WRAP instead of TCON
authorDavid Gibson <david@gibson.dropbear.id.au>
Sun, 23 Jul 2017 04:54:13 +0000 (14:54 +1000)
committerDavid Gibson <david@gibson.dropbear.id.au>
Sun, 23 Jul 2017 11:29:29 +0000 (21:29 +1000)
TCON() uses flexible-array members which aren't allowed in the middle
of structures, except as a gcc extension.  TCON_WRAP() avoids this and so
is more portable.

This doesn't change the jset interface, only its internals.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
ccan/jset/jset.h
ccan/jset/test/run.c

index ba72f097193815851bbaaae35c55502cdcc88211..904982d6b01976e624941d774f394c9042022be6 100644 (file)
@@ -30,8 +30,7 @@ struct jset {
  *     };
  */
 #define JSET_MEMBERS(type)                     \
-       struct jset raw;                        \
-       TCON(type canary)
+       TCON_WRAP(struct jset, type canary) jset_
 
 /**
  * jset_new - create a new, empty jset.
@@ -47,6 +46,14 @@ struct jset {
  */
 #define jset_new(type) ((type *)jset_new_(sizeof(type)))
 
+
+/**
+ * jset_raw_ - unwrap the typed set (without type checking)
+ * @set: the typed jset
+ */
+#define jset_raw_(set) (tcon_unwrap(&(set)->jset_))
+
+
 /**
  * jset_free - destroy a jset.
  * @set: the set returned from jset_new.
@@ -54,7 +61,7 @@ struct jset {
  * Example:
  *     jset_free(set);
  */
-#define jset_free(set) jset_free_(&(set)->raw)
+#define jset_free(set) jset_free_(jset_raw_(set))
 
 /**
  * jset_error - test for an error in the a previous jset_ operation.
@@ -74,8 +81,8 @@ struct jset {
  *     if (errstr)
  *             errx(1, "Woah, error on newly created set?! %s", errstr);
  */
-#define jset_error(set) \
-       jset_error_(&(set)->raw)
+#define jset_error(set) jset_error_(jset_raw_(set))
+
 
 /**
  * jset_raw - unwrap the typed set and check the type
@@ -86,7 +93,9 @@ struct jset {
  * variable is of an unexpected type.  It is used internally where we
  * need to access the raw underlying jset.
  */
-#define jset_raw(set, expr) (&tcon_check((set), canary, (expr))->raw)
+#define jset_raw(set, expr) \
+       (tcon_unwrap(tcon_check(&(set)->jset_, canary, (expr))))
+
 
 /**
  * jset_test - test a bit in the bitset.
@@ -137,8 +146,8 @@ struct jset {
  *     // We expect 1000 entries.
  *     assert(jset_count(set) == 1000);
  */
-#define jset_count(set)                                \
-       jset_popcount_(&(set)->raw, 0, -1UL)
+#define jset_count(set)        \
+       jset_popcount_(jset_raw_(set), 0, -1UL)
 
 /**
  * jset_popcount - get population of (some part of) bitset.
@@ -186,7 +195,7 @@ struct jset {
  *     }
  */
 #define jset_nth(set, n, invalid)                                      \
-       tcon_cast((set), canary,                                        \
+       tcon_cast(&(set)->jset_, canary,                                \
                  jset_nth_(jset_raw((set), (invalid)),                 \
                            (n), (unsigned long)(invalid)))
 
@@ -205,7 +214,7 @@ struct jset {
  *     printf("\n");
  */
 #define jset_first(set)                                                \
-       tcon_cast((set), canary, jset_first_(&(set)->raw))
+       tcon_cast(&(set)->jset_, canary, jset_first_(jset_raw_(set)))
 
 /**
  * jset_next - return the next bit which is set (must not contain 0).
@@ -216,7 +225,8 @@ struct jset {
  * jset_first.
  */
 #define jset_next(set, prev)                                           \
-       tcon_cast((set), canary, jset_next_(&(set)->raw, (unsigned long)(prev)))
+       tcon_cast(&(set)->jset_, canary,                                \
+                 jset_next_(jset_raw_(set), (unsigned long)(prev)))
 
 /**
  * jset_last - return the last bit which is set (must not contain 0).
@@ -230,7 +240,7 @@ struct jset {
  *     printf("\n");
  */
 #define jset_last(set)                                         \
-       tcon_cast((set), canary, jset_last_(&(set)->raw))
+       tcon_cast(&(set)->jset_, canary, jset_last_(jset_raw_(set)))
 
 /**
  * jset_prev - return the previous bit which is set (must not contain 0).
@@ -241,7 +251,8 @@ struct jset {
  * jset_last.
  */
 #define jset_prev(set, prev)                                           \
-       tcon_cast((set), canary, jset_prev_(&(set)->raw, (unsigned long)(prev)))
+       tcon_cast(&(set)->jset_, canary,                                \
+                 jset_prev_(jset_raw_(set), (unsigned long)(prev)))
 
 /**
  * jset_first_clear - return the first bit which is unset
@@ -251,17 +262,17 @@ struct jset {
  * set is full.
  */
 #define jset_first_clear(set)                                          \
-       tcon_cast((set), canary, jset_next_clear_(&(set)->raw, 0))
+       tcon_cast(&(set)->jset_, canary, jset_next_clear_(jset_raw_(set), 0))
 
 #define jset_next_clear(set, prev)                                     \
-       tcon_cast((set), canary, jset_next_clear_(&(set)->raw,          \
+       tcon_cast(&(set)->jset_, canary, jset_next_clear_(jset_raw_(set), \
                                                  (unsigned long)(prev)))
 
 #define jset_last_clear(set)                                   \
-       tcon_cast((set), canary, jset_last_clear_(&(set)->raw))
+       tcon_cast(&(set)->jset_, canary, jset_last_clear_(jset_raw_(set)))
 
 #define jset_prev_clear(set, prev)                                     \
-       tcon_cast((set), canary, jset_prev_clear_(&(set)->raw,          \
+       tcon_cast(&(set)->jset_, canary, jset_prev_clear_(jset_raw_(set), \
                                                  (unsigned long)(prev)))
 
 /* Raw functions */
index a0fb8a8c325d0dd967e23cad894923101ba59798..425546fd20955dbe283daf8c0efa05e36d3167e9 100644 (file)
@@ -34,7 +34,8 @@ int main(int argc, char *argv[])
                jset_set(set, 1 + (i << 4));
 
        /* This only take 1.7MB on my 32-bit system. */
-       diag("%u bytes memory used\n", (unsigned)Judy1MemUsed(set->raw.judy));
+       diag("%u bytes memory used\n",
+            (unsigned)Judy1MemUsed(jset_raw_(set)->judy));
 
        ok1(jset_popcount(set, 0, -1) == 1000000);
        ok1(jset_nth(set, 0, -1) == 1);
@@ -53,13 +54,13 @@ int main(int argc, char *argv[])
        ok1(jset_error(set) == NULL);
 
        /* Test error handling */
-       JU_ERRNO(&set->raw.err) = 100;
-       JU_ERRID(&set->raw.err) = 991;
+       JU_ERRNO(&jset_raw_(set)->err) = 100;
+       JU_ERRID(&jset_raw_(set)->err) = 991;
        err = jset_error(set);
        ok1(err);
        ok1(strstr(err, "100"));
        ok1(strstr(err, "991"));
-       ok1(err == set->raw.errstr);
+       ok1(err == jset_raw_(set)->errstr);
        jset_free(set);
 
        return exit_status();