1/* @title: Min and Max macros */
2#pragma once
3#include <compiler.h>
4
5#define _MIN_1(a) (a)
6
7#define _MIN_2(a, b) \
8 ({ \
9 __auto_type _a = (a); \
10 __auto_type _b = (b); \
11 _a < _b ? _a : _b; \
12 })
13
14#define _MIN_3(a, b, c) \
15 ({ \
16 __auto_type _m = _MIN_2(a, b); \
17 __auto_type _c = (c); \
18 _m < _c ? _m : _c; \
19 })
20
21#define _MIN_4(a, b, c, d) \
22 ({ \
23 __auto_type _m = _MIN_3(a, b, c); \
24 __auto_type _d = (d); \
25 _m < _d ? _m : _d; \
26 })
27
28#define _MIN_5(a, b, c, d, e) \
29 ({ \
30 __auto_type _m = _MIN_4(a, b, c, d); \
31 __auto_type _e = (e); \
32 _m < _e ? _m : _e; \
33 })
34
35#define _MIN_6(a, b, c, d, e, f) \
36 ({ \
37 __auto_type _m = _MIN_5(a, b, c, d, e); \
38 __auto_type _f = (f); \
39 _m < _f ? _m : _f; \
40 })
41
42#define _MIN_7(a, b, c, d, e, f, g) \
43 ({ \
44 __auto_type _m = _MIN_6(a, b, c, d, e, f); \
45 __auto_type _g = (g); \
46 _m < _g ? _m : _g; \
47 })
48
49#define _MIN_8(a, b, c, d, e, f, g, h) \
50 ({ \
51 __auto_type _m = _MIN_7(a, b, c, d, e, f, g); \
52 __auto_type _h = (h); \
53 _m < _h ? _m : _h; \
54 })
55
56#define MIN(...) _DISPATCH(_MIN, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
57
58#define _MAX_1(a) (a)
59
60#define _MAX_2(a, b) \
61 ({ \
62 __auto_type _a = (a); \
63 __auto_type _b = (b); \
64 _a > _b ? _a : _b; \
65 })
66
67#define _MAX_3(a, b, c) \
68 ({ \
69 __auto_type _m = _MAX_2(a, b); \
70 __auto_type _c = (c); \
71 _m > _c ? _m : _c; \
72 })
73
74#define _MAX_4(a, b, c, d) \
75 ({ \
76 __auto_type _m = _MAX_3(a, b, c); \
77 __auto_type _d = (d); \
78 _m > _d ? _m : _d; \
79 })
80
81#define _MAX_5(a, b, c, d, e) \
82 ({ \
83 __auto_type _m = _MAX_4(a, b, c, d); \
84 __auto_type _e = (e); \
85 _m > _e ? _m : _e; \
86 })
87
88#define _MAX_6(a, b, c, d, e, f) \
89 ({ \
90 __auto_type _m = _MAX_5(a, b, c, d, e); \
91 __auto_type _f = (f); \
92 _m > _f ? _m : _f; \
93 })
94
95#define _MAX_7(a, b, c, d, e, f, g) \
96 ({ \
97 __auto_type _m = _MAX_6(a, b, c, d, e, f); \
98 __auto_type _g = (g); \
99 _m > _g ? _m : _g; \
100 })
101
102#define _MAX_8(a, b, c, d, e, f, g, h) \
103 ({ \
104 __auto_type _m = _MAX_7(a, b, c, d, e, f, g); \
105 __auto_type _h = (h); \
106 _m > _h ? _m : _h; \
107 })
108
109#define MAX(...) _DISPATCH(_MAX, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
110