diff options
-rw-r--r-- | utils.h | 28 |
1 files changed, 22 insertions, 6 deletions
@@ -15,6 +15,17 @@ #define static_assert(exp, msg) _Static_assert(exp, msg) #endif +/** + * BUILD_BUG_ON_ZERO - throws compilation error if true, expressions returns 0. + * @cond: condition + * + * Force a compilation error if condition is true, but also produce a + * result (of value 0 and type int), so the expression can be used + * e.g. in a structure initializer (or where-ever else comma expressions + * aren't permitted). + */ +#define BUILD_BUG_ON_ZERO(cond) ((int)(sizeof(struct { int : (-!!(cond)); }))) + #define same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) #define container_of(ptr, T, member) \ @@ -25,11 +36,16 @@ (T *)((void *)(ptr)-offsetof(T, member)); \ }) -#define ARRAY_SIZE(arr) \ - ({ \ - static_assert(!same_type((arr), &(arr)[0]), \ - "variable is not an array"); \ - sizeof(arr) / sizeof(*arr); \ - }) +/** + * __ASSERT_IS_ARRAY - throw a compilation error if @arr is not an array. + * @arr: variable to check. + */ +#define __ASSERT_IS_ARRAY(arr) BUILD_BUG_ON_ZERO(same_type((arr), &(arr)[0])) + +/** + * ARRAY_SIZE - return the number of elements in @arr. + * @arr: array of any type. + */ +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*arr) + __ASSERT_IS_ARRAY(arr)) #endif |