Skip to content

Commit ea18d64

Browse files
committed
sys: util: Add COND_CASE_1 macro
Add a switch/case like variant of the COND_CODE_1 macro where the first flag that equals 1 has its value expanded, with a default fallback. Signed-off-by: Pieter De Gendt <[email protected]>
1 parent 1a49b41 commit ea18d64

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

include/zephyr/sys/util_internal.h

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,66 @@
7171
/* Used to remove brackets from around a single argument. */
7272
#define __DEBRACKET(...) __VA_ARGS__
7373

74+
/* Used by COND_CASE_1(); supports up to 16 flag/value pairs */
75+
#define Z_COND_CASE_1(...) \
76+
Z_COND_CASE_1_SELECT(NUM_VA_ARGS_LESS_1(__VA_ARGS__), __VA_ARGS__)
77+
78+
#define Z_COND_CASE_1_SELECT(count_minus_one, ...) \
79+
UTIL_CAT(Z_COND_CASE_1_LEVEL_, count_minus_one)(__VA_ARGS__)
80+
81+
#define Z_COND_CASE_1_LEVEL_0(_default) __DEBRACKET _default
82+
#define Z_COND_CASE_1_LEVEL_1(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
83+
#define Z_COND_CASE_1_LEVEL_2(flag0, value0, _default) \
84+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (__DEBRACKET _default))
85+
#define Z_COND_CASE_1_LEVEL_3(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
86+
#define Z_COND_CASE_1_LEVEL_4(flag0, value0, ...) \
87+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_2(__VA_ARGS__)))
88+
#define Z_COND_CASE_1_LEVEL_5(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
89+
#define Z_COND_CASE_1_LEVEL_6(flag0, value0, ...) \
90+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_4(__VA_ARGS__)))
91+
#define Z_COND_CASE_1_LEVEL_7(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
92+
#define Z_COND_CASE_1_LEVEL_8(flag0, value0, ...) \
93+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_6(__VA_ARGS__)))
94+
#define Z_COND_CASE_1_LEVEL_9(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
95+
#define Z_COND_CASE_1_LEVEL_10(flag0, value0, ...) \
96+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_8(__VA_ARGS__)))
97+
#define Z_COND_CASE_1_LEVEL_11(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
98+
#define Z_COND_CASE_1_LEVEL_12(flag0, value0, ...) \
99+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_10(__VA_ARGS__)))
100+
#define Z_COND_CASE_1_LEVEL_13(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
101+
#define Z_COND_CASE_1_LEVEL_14(flag0, value0, ...) \
102+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_12(__VA_ARGS__)))
103+
#define Z_COND_CASE_1_LEVEL_15(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
104+
#define Z_COND_CASE_1_LEVEL_16(flag0, value0, ...) \
105+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_14(__VA_ARGS__)))
106+
#define Z_COND_CASE_1_LEVEL_17(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
107+
#define Z_COND_CASE_1_LEVEL_18(flag0, value0, ...) \
108+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_16(__VA_ARGS__)))
109+
#define Z_COND_CASE_1_LEVEL_19(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
110+
#define Z_COND_CASE_1_LEVEL_20(flag0, value0, ...) \
111+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_18(__VA_ARGS__)))
112+
#define Z_COND_CASE_1_LEVEL_21(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
113+
#define Z_COND_CASE_1_LEVEL_22(flag0, value0, ...) \
114+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_20(__VA_ARGS__)))
115+
#define Z_COND_CASE_1_LEVEL_23(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
116+
#define Z_COND_CASE_1_LEVEL_24(flag0, value0, ...) \
117+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_22(__VA_ARGS__)))
118+
#define Z_COND_CASE_1_LEVEL_25(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
119+
#define Z_COND_CASE_1_LEVEL_26(flag0, value0, ...) \
120+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_24(__VA_ARGS__)))
121+
#define Z_COND_CASE_1_LEVEL_27(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
122+
#define Z_COND_CASE_1_LEVEL_28(flag0, value0, ...) \
123+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_26(__VA_ARGS__)))
124+
#define Z_COND_CASE_1_LEVEL_29(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
125+
#define Z_COND_CASE_1_LEVEL_30(flag0, value0, ...) \
126+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_28(__VA_ARGS__)))
127+
#define Z_COND_CASE_1_LEVEL_31(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
128+
#define Z_COND_CASE_1_LEVEL_32(flag0, value0, ...) \
129+
Z_COND_CODE_1(flag0, (__DEBRACKET value0), (Z_COND_CASE_1_LEVEL_30(__VA_ARGS__)))
130+
#define Z_COND_CASE_1_LEVEL_33(...) Z_COND_SWITCH_REQUIRES_FLAG_VALUE_PAIRS
131+
132+
#define Z_COND_CASE_1_REQUIRES_FLAG_VALUE_PAIRS Z_COND_CASE_1_REQUIRES_FLAG_VALUE_PAIRS
133+
74134
/* Used by IS_EMPTY() */
75135
/* reference: https://gustedt.wordpress.com/2010/06/08/detect-empty-macro-arguments/ */
76136
#define Z_HAS_COMMA(...) \

include/zephyr/sys/util_macro.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,31 @@ extern "C" {
219219
#define COND_CODE_0(_flag, _if_0_code, _else_code) \
220220
Z_COND_CODE_0(_flag, _if_0_code, _else_code)
221221

222+
/**
223+
* @brief Evaluate a list of COND_CODE_1-style cases.
224+
*
225+
* Each case consists of a flag and a value wrapped in parentheses. The
226+
* arguments are processed from left to right until a flag expands to the
227+
* literal 1, in which case the corresponding value is expanded. If no flags
228+
* expand to 1, the last argument (which must also be wrapped in parentheses)
229+
* is used as the default value. Supplying only the default argument is also
230+
* supported.
231+
*
232+
* Example:
233+
*
234+
* int foo = COND_CASE_1(CONFIG_SOME_BOOL, (handle_a()),
235+
* CONFIG_SOME_OTHER_BOOL, (handle_b()),
236+
* (handle_default()));
237+
*
238+
* Supports up to 16 flag/value pairs before the default.
239+
*
240+
* @param ... Flag/value pairs followed by the default value. Each value must
241+
* be provided in parentheses to avoid comma handling issues.
242+
* @see COND_CODE_1()
243+
*/
244+
#define COND_CASE_1(...) \
245+
Z_COND_CASE_1(__VA_ARGS__)
246+
222247
/**
223248
* @brief Insert code if @p _flag is defined and equals 1.
224249
*

0 commit comments

Comments
 (0)