PER Firmware
Loading...
Searching...
No Matches
max.h
Go to the documentation of this file.
1#ifndef MAX_H
2#define MAX_H
3
15[[gnu::always_inline]]
16static inline signed int max2_signed(signed int a, signed int b) {
17 return (a > b) ? a : b;
18}
19
20[[gnu::always_inline]]
21static inline unsigned int max2_unsigned(unsigned int a, unsigned int b) {
22 return (a > b) ? a : b;
23}
24
25[[gnu::always_inline]]
26static inline float max2_float(float a, float b) {
27 return (a > b) ? a : b;
28}
29
30#define MAXOF2(a, b) _Generic((a) + (b), \
31 signed int: max2_signed, \
32 unsigned int: max2_unsigned, \
33 float: max2_float \
34)(a, b)
35
36#define MAXOF3(a, b, c) MAXOF2(MAXOF2(a, b), c)
37#define MAXOF4(a, b, c, d) MAXOF2(MAXOF2(a, b), MAXOF2(c, d))
38// if you need more than four arguments, just add them here
39
40// dispatcher macro selects the correct MAXOF function based on the number of arguments
41#define DISPATCH_MAXOF(_1, _2, _3, _4, NAME, ...) NAME
42#define MAXOF(...) DISPATCH_MAXOF(__VA_ARGS__, MAXOF4, MAXOF3, MAXOF2)(__VA_ARGS__)
43
44#endif // MAX_H