From: Mathieu Desnoyers Date: Thu, 21 Sep 2023 10:25:25 +0000 (+0100) Subject: macros.h: Implement side_enum_t X-Git-Url: http://git.efficios.com/?p=libside.git;a=commitdiff_plain;h=f2a90e2a12b976abb0052229b5ce3f6163508a8f macros.h: Implement side_enum_t side_enum_t allows defining fixed-sized enumerations while preserving typing information. Signed-off-by: Mathieu Desnoyers --- diff --git a/include/side/macros.h b/include/side/macros.h index 20fa97e..3915374 100644 --- a/include/side/macros.h +++ b/include/side/macros.h @@ -123,4 +123,24 @@ #define SIDE_PTR_INIT(...) { .v = (uintptr_t) (__VA_ARGS__) } +/* + * side_enum_t allows defining fixed-sized enumerations while preserving + * typing information. + */ +#define side_enum_t(_enum_type, _size_type) \ + union { \ + _size_type v; \ + _enum_type t[0]; \ + } + +#define side_enum_get(_field) \ + ((__typeof__((_field).t[0]))(_field).v) + +#define side_enum_set(_field, _v) \ + do { \ + (_field).v = (_v); \ + } while (0) + +#define SIDE_ENUM_INIT(...) { .v = (__VA_ARGS__) } + #endif /* _SIDE_MACROS_H */