From ac22f535bcd14f8e201d410265aab268899d7753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yaroslav=20de=20la=20Pe=C3=B1a=20Smirnov?= Date: Mon, 15 Apr 2024 22:44:46 +0300 Subject: utils.h: update ARRAY_SIZE Update ARRAY_SIZE macro so that we can use it in more places, including where comma expressions aren't allowed. --- utils.h | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/utils.h b/utils.h index cb7d795..66430ab 100644 --- a/utils.h +++ b/utils.h @@ -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 -- cgit v1.2.3