Blender  V3.3
GHOST_utildefines.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
9 #pragma once
10 
12 
13 /* -------------------------------------------------------------------- */
17 /* hints for branch prediction, only use in code that runs a _lot_ where */
18 #ifdef __GNUC__
19 # define LIKELY(x) __builtin_expect(!!(x), 1)
20 # define UNLIKELY(x) __builtin_expect(!!(x), 0)
21 #else
22 # define LIKELY(x) (x)
23 # define UNLIKELY(x) (x)
24 #endif
25 
28 /* -------------------------------------------------------------------- */
32 /* unpack vector for args */
33 #define UNPACK2(a) ((a)[0]), ((a)[1])
34 #define UNPACK3(a) UNPACK2(a), ((a)[2])
35 #define UNPACK4(a) UNPACK3(a), ((a)[3])
36 /* pre may be '&', '*' or func, post may be '->member' */
37 #define UNPACK2_EX(pre, a, post) (pre((a)[0]) post), (pre((a)[1]) post)
38 #define UNPACK3_EX(pre, a, post) UNPACK2_EX(pre, a, post), (pre((a)[2]) post)
39 #define UNPACK4_EX(pre, a, post) UNPACK3_EX(pre, a, post), (pre((a)[3]) post)
40 
43 /* -------------------------------------------------------------------- */
47 /* Assuming a static array. */
48 #if defined(__GNUC__) && !defined(__cplusplus) && !defined(__clang__) && !defined(__INTEL_COMPILER)
49 # define ARRAY_SIZE(arr) \
50  ((sizeof(struct { int isnt_array : ((const void *)&(arr) == &(arr)[0]); }) * 0) + \
51  (sizeof(arr) / sizeof(*(arr))))
52 #else
53 # define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*(arr)))
54 #endif
55 
58 /* -------------------------------------------------------------------- */
62 /* Manual line breaks for readability. */
63 /* clang-format off */
64 
65 /* ELEM#(v, ...): is the first arg equal any others? */
66 /* internal helpers. */
67 #define _VA_ELEM2(v, a) ((v) == (a))
68 #define _VA_ELEM3(v, a, b) \
69  (_VA_ELEM2(v, a) || _VA_ELEM2(v, b))
70 #define _VA_ELEM4(v, a, b, c) \
71  (_VA_ELEM3(v, a, b) || _VA_ELEM2(v, c))
72 #define _VA_ELEM5(v, a, b, c, d) \
73  (_VA_ELEM4(v, a, b, c) || _VA_ELEM2(v, d))
74 #define _VA_ELEM6(v, a, b, c, d, e) \
75  (_VA_ELEM5(v, a, b, c, d) || _VA_ELEM2(v, e))
76 #define _VA_ELEM7(v, a, b, c, d, e, f) \
77  (_VA_ELEM6(v, a, b, c, d, e) || _VA_ELEM2(v, f))
78 #define _VA_ELEM8(v, a, b, c, d, e, f, g) \
79  (_VA_ELEM7(v, a, b, c, d, e, f) || _VA_ELEM2(v, g))
80 #define _VA_ELEM9(v, a, b, c, d, e, f, g, h) \
81  (_VA_ELEM8(v, a, b, c, d, e, f, g) || _VA_ELEM2(v, h))
82 #define _VA_ELEM10(v, a, b, c, d, e, f, g, h, i) \
83  (_VA_ELEM9(v, a, b, c, d, e, f, g, h) || _VA_ELEM2(v, i))
84 #define _VA_ELEM11(v, a, b, c, d, e, f, g, h, i, j) \
85  (_VA_ELEM10(v, a, b, c, d, e, f, g, h, i) || _VA_ELEM2(v, j))
86 #define _VA_ELEM12(v, a, b, c, d, e, f, g, h, i, j, k) \
87  (_VA_ELEM11(v, a, b, c, d, e, f, g, h, i, j) || _VA_ELEM2(v, k))
88 #define _VA_ELEM13(v, a, b, c, d, e, f, g, h, i, j, k, l) \
89  (_VA_ELEM12(v, a, b, c, d, e, f, g, h, i, j, k) || _VA_ELEM2(v, l))
90 #define _VA_ELEM14(v, a, b, c, d, e, f, g, h, i, j, k, l, m) \
91  (_VA_ELEM13(v, a, b, c, d, e, f, g, h, i, j, k, l) || _VA_ELEM2(v, m))
92 #define _VA_ELEM15(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n) \
93  (_VA_ELEM14(v, a, b, c, d, e, f, g, h, i, j, k, l, m) || _VA_ELEM2(v, n))
94 #define _VA_ELEM16(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) \
95  (_VA_ELEM15(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n) || _VA_ELEM2(v, o))
96 #define _VA_ELEM17(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) \
97  (_VA_ELEM16(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) || _VA_ELEM2(v, p))
98 /* clang-format on */
99 
100 /* reusable ELEM macro */
101 #define ELEM(...) VA_NARGS_CALL_OVERLOAD(_VA_ELEM, __VA_ARGS__)
102 
105 /* -------------------------------------------------------------------- */
109 #define CLAMPIS(a, b, c) ((a) < (b) ? (b) : (a) > (c) ? (c) : (a))
110 
111 #define CLAMP(a, b, c) \
112  { \
113  if ((a) < (b)) { \
114  (a) = (b); \
115  } \
116  else if ((a) > (c)) { \
117  (a) = (c); \
118  } \
119  } \
120  (void)0
121 
122 #define CLAMP_MAX(a, c) \
123  { \
124  if ((a) > (c)) { \
125  (a) = (c); \
126  } \
127  } \
128  (void)0
129 
130 #define CLAMP_MIN(a, b) \
131  { \
132  if ((a) < (b)) { \
133  (a) = (b); \
134  } \
135  } \
136  (void)0
137 
138 #define CLAMP2(vec, b, c) \
139  { \
140  CLAMP((vec)[0], b, c); \
141  CLAMP((vec)[1], b, c); \
142  } \
143  (void)0
144 
145 #define CLAMP2_MIN(vec, b) \
146  { \
147  CLAMP_MIN((vec)[0], b); \
148  CLAMP_MIN((vec)[1], b); \
149  } \
150  (void)0
151 
152 #define CLAMP2_MAX(vec, b) \
153  { \
154  CLAMP_MAX((vec)[0], b); \
155  CLAMP_MAX((vec)[1], b); \
156  } \
157  (void)0
158 
159 #define CLAMP3(vec, b, c) \
160  { \
161  CLAMP((vec)[0], b, c); \
162  CLAMP((vec)[1], b, c); \
163  CLAMP((vec)[2], b, c); \
164  } \
165  (void)0
166 
167 #define CLAMP3_MIN(vec, b) \
168  { \
169  CLAMP_MIN((vec)[0], b); \
170  CLAMP_MIN((vec)[1], b); \
171  CLAMP_MIN((vec)[2], b); \
172  } \
173  (void)0
174 
175 #define CLAMP3_MAX(vec, b) \
176  { \
177  CLAMP_MAX((vec)[0], b); \
178  CLAMP_MAX((vec)[1], b); \
179  CLAMP_MAX((vec)[2], b); \
180  } \
181  (void)0
182 
183 #define CLAMP4(vec, b, c) \
184  { \
185  CLAMP((vec)[0], b, c); \
186  CLAMP((vec)[1], b, c); \
187  CLAMP((vec)[2], b, c); \
188  CLAMP((vec)[3], b, c); \
189  } \
190  (void)0
191 
192 #define CLAMP4_MIN(vec, b) \
193  { \
194  CLAMP_MIN((vec)[0], b); \
195  CLAMP_MIN((vec)[1], b); \
196  CLAMP_MIN((vec)[2], b); \
197  CLAMP_MIN((vec)[3], b); \
198  } \
199  (void)0
200 
201 #define CLAMP4_MAX(vec, b) \
202  { \
203  CLAMP_MAX((vec)[0], b); \
204  CLAMP_MAX((vec)[1], b); \
205  CLAMP_MAX((vec)[2], b); \
206  CLAMP_MAX((vec)[3], b); \
207  } \
208  (void)0
209