Open Broadcaster Software
Free, open source software for live streaming and recording
check.h
Go to the documentation of this file.
1
/* Check (assertions)
2
* Portable Snippets - https://gitub.com/nemequ/portable-snippets
3
* Created by Evan Nemerson <evan@nemerson.com>
4
*
5
* To the extent possible under law, the authors have waived all
6
* copyright and related or neighboring rights to this code. For
7
* details, see the Creative Commons Zero 1.0 Universal license at
8
* https://creativecommons.org/publicdomain/zero/1.0/
9
*/
10
11
#if !defined(SIMDE_CHECK_H)
12
#define SIMDE_CHECK_H
13
14
#if !defined(SIMDE_NDEBUG) && !defined(SIMDE_DEBUG)
15
#define SIMDE_NDEBUG 1
16
#endif
17
18
#include <stdint.h>
19
20
#if !defined(_WIN32)
21
#define SIMDE_SIZE_MODIFIER "z"
22
#define SIMDE_CHAR_MODIFIER "hh"
23
#define SIMDE_SHORT_MODIFIER "h"
24
#else
25
#if defined(_M_X64) || defined(__amd64__)
26
#define SIMDE_SIZE_MODIFIER "I64"
27
#else
28
#define SIMDE_SIZE_MODIFIER ""
29
#endif
30
#define SIMDE_CHAR_MODIFIER ""
31
#define SIMDE_SHORT_MODIFIER ""
32
#endif
33
34
#if defined(_MSC_VER) && (_MSC_VER >= 1500)
35
#define SIMDE__PUSH_DISABLE_MSVC_C4127 \
36
__pragma(warning(push)) __pragma(warning(disable : 4127))
37
#define SIMDE__POP_DISABLE_MSVC_C4127 __pragma(warning(pop))
38
#else
39
#define SIMDE__PUSH_DISABLE_MSVC_C4127
40
#define SIMDE__POP_DISABLE_MSVC_C4127
41
#endif
42
43
#if !defined(simde_errorf)
44
#include <stdio.h>
45
#include <stdlib.h>
46
#define simde_errorf(format, ...) \
47
(fprintf(stderr, format, __VA_ARGS__), abort())
48
#endif
49
50
#define simde_error(msg) simde_errorf("%s", msg)
51
52
#if defined(SIMDE_NDEBUG)
53
#if defined(SIMDE_CHECK_FAIL_DEFINED)
54
#define simde_assert(expr)
55
#else
56
#if defined(HEDLEY_ASSUME)
57
#define simde_assert(expr) HEDLEY_ASSUME(expr)
58
#elif HEDLEY_GCC_VERSION_CHECK(4, 5, 0)
59
#define simde_assert(expr) ((void)(!!(expr) ? 1 : (__builtin_unreachable(), 1)))
60
#elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0)
61
#define simde_assert(expr) __assume(expr)
62
#else
63
#define simde_assert(expr)
64
#endif
65
#endif
66
#define simde_assert_true(expr) simde_assert(expr)
67
#define simde_assert_false(expr) simde_assert(!(expr))
68
#define simde_assert_type_full(prefix, suffix, T, fmt, a, op, b) \
69
simde_assert(((a)op(b)))
70
#define simde_assert_double_equal(a, b, precision)
71
#define simde_assert_string_equal(a, b)
72
#define simde_assert_string_not_equal(a, b)
73
#define simde_assert_memory_equal(size, a, b)
74
#define simde_assert_memory_not_equal(size, a, b)
75
#else
76
#define simde_assert(expr) \
77
do { \
78
if (!HEDLEY_LIKELY(expr)) { \
79
simde_error("assertion failed: " #expr "\n"); \
80
} \
81
SIMDE__PUSH_DISABLE_MSVC_C4127 \
82
} while (0) SIMDE__POP_DISABLE_MSVC_C4127
83
84
#define simde_assert_true(expr) \
85
do { \
86
if (!HEDLEY_LIKELY(expr)) { \
87
simde_error("assertion failed: " #expr \
88
" is not true\n"); \
89
} \
90
SIMDE__PUSH_DISABLE_MSVC_C4127 \
91
} while (0) SIMDE__POP_DISABLE_MSVC_C4127
92
93
#define simde_assert_false(expr) \
94
do { \
95
if (!HEDLEY_LIKELY(!(expr))) { \
96
simde_error("assertion failed: " #expr \
97
" is not false\n"); \
98
} \
99
SIMDE__PUSH_DISABLE_MSVC_C4127 \
100
} while (0) SIMDE__POP_DISABLE_MSVC_C4127
101
102
#define simde_assert_type_full(prefix, suffix, T, fmt, a, op, b) \
103
do { \
104
T simde_tmp_a_ = (a); \
105
T simde_tmp_b_ = (b); \
106
if (!(simde_tmp_a_ op simde_tmp_b_)) { \
107
simde_errorf("assertion failed: %s %s %s (" prefix \
108
"%" fmt suffix " %s " prefix \
109
"%" fmt suffix ")\n", \
110
#a, #op, #b, simde_tmp_a_, #op, \
111
simde_tmp_b_); \
112
} \
113
SIMDE__PUSH_DISABLE_MSVC_C4127 \
114
} while (0) SIMDE__POP_DISABLE_MSVC_C4127
115
116
#define simde_assert_double_equal(a, b, precision) \
117
do { \
118
const double simde_tmp_a_ = (a); \
119
const double simde_tmp_b_ = (b); \
120
const double simde_tmp_diff_ = \
121
((simde_tmp_a_ - simde_tmp_b_) < 0) \
122
? -(simde_tmp_a_ - simde_tmp_b_) \
123
: (simde_tmp_a_ - simde_tmp_b_); \
124
if (HEDLEY_UNLIKELY(simde_tmp_diff_ > 1e-##precision)) { \
125
simde_errorf( \
126
"assertion failed: %s == %s (%0." #precision \
127
"g == %0." #precision "g)\n", \
128
#a, #b, simde_tmp_a_, simde_tmp_b_); \
129
} \
130
SIMDE__PUSH_DISABLE_MSVC_C4127 \
131
} while (0) SIMDE__POP_DISABLE_MSVC_C4127
132
133
#include <string.h>
134
#define simde_assert_string_equal(a, b) \
135
do { \
136
const char *simde_tmp_a_ = a; \
137
const char *simde_tmp_b_ = b; \
138
if (HEDLEY_UNLIKELY(strcmp(simde_tmp_a_, simde_tmp_b_) != \
139
0)) { \
140
simde_errorf( \
141
"assertion failed: string %s == %s (\"%s\" == \"%s\")\n", \
142
#a, #b, simde_tmp_a_, simde_tmp_b_); \
143
} \
144
SIMDE__PUSH_DISABLE_MSVC_C4127 \
145
} while (0) SIMDE__POP_DISABLE_MSVC_C4127
146
147
#define simde_assert_string_not_equal(a, b) \
148
do { \
149
const char *simde_tmp_a_ = a; \
150
const char *simde_tmp_b_ = b; \
151
if (HEDLEY_UNLIKELY(strcmp(simde_tmp_a_, simde_tmp_b_) == \
152
0)) { \
153
simde_errorf( \
154
"assertion failed: string %s != %s (\"%s\" == \"%s\")\n", \
155
#a, #b, simde_tmp_a_, simde_tmp_b_); \
156
} \
157
SIMDE__PUSH_DISABLE_MSVC_C4127 \
158
} while (0) SIMDE__POP_DISABLE_MSVC_C4127
159
160
#define simde_assert_memory_equal(size, a, b) \
161
do { \
162
const unsigned char *simde_tmp_a_ = \
163
(const unsigned char *)(a); \
164
const unsigned char *simde_tmp_b_ = \
165
(const unsigned char *)(b); \
166
const size_t simde_tmp_size_ = (size); \
167
if (HEDLEY_UNLIKELY(memcmp(simde_tmp_a_, simde_tmp_b_, \
168
simde_tmp_size_)) != 0) { \
169
size_t simde_tmp_pos_; \
170
for (simde_tmp_pos_ = 0; \
171
simde_tmp_pos_ < simde_tmp_size_; \
172
simde_tmp_pos_++) { \
173
if (simde_tmp_a_[simde_tmp_pos_] != \
174
simde_tmp_b_[simde_tmp_pos_]) { \
175
simde_errorf( \
176
"assertion failed: memory %s == %s, at offset %" SIMDE_SIZE_MODIFIER \
177
"u\n", \
178
#a, #b, simde_tmp_pos_); \
179
break; \
180
} \
181
} \
182
} \
183
SIMDE__PUSH_DISABLE_MSVC_C4127 \
184
} while (0) SIMDE__POP_DISABLE_MSVC_C4127
185
186
#define simde_assert_memory_not_equal(size, a, b) \
187
do { \
188
const unsigned char *simde_tmp_a_ = \
189
(const unsigned char *)(a); \
190
const unsigned char *simde_tmp_b_ = \
191
(const unsigned char *)(b); \
192
const size_t simde_tmp_size_ = (size); \
193
if (HEDLEY_UNLIKELY(memcmp(simde_tmp_a_, simde_tmp_b_, \
194
simde_tmp_size_)) == 0) { \
195
simde_errorf( \
196
"assertion failed: memory %s != %s (%" SIMDE_SIZE_MODIFIER \
197
"u bytes)\n", \
198
#a, #b, simde_tmp_size_); \
199
} \
200
SIMDE__PUSH_DISABLE_MSVC_C4127 \
201
} while (0) SIMDE__POP_DISABLE_MSVC_C4127
202
#endif
203
204
#define simde_assert_type(T, fmt, a, op, b) \
205
simde_assert_type_full("", "", T, fmt, a, op, b)
206
207
#define simde_assert_char(a, op, b) \
208
simde_assert_type_full("'\\x", "'", char, \
209
"02" SIMDE_CHAR_MODIFIER "x", a, op, b)
210
#define simde_assert_uchar(a, op, b) \
211
simde_assert_type_full("'\\x", "'", unsigned char, \
212
"02" SIMDE_CHAR_MODIFIER "x", a, op, b)
213
#define simde_assert_short(a, op, b) \
214
simde_assert_type(short, SIMDE_SHORT_MODIFIER "d", a, op, b)
215
#define simde_assert_ushort(a, op, b) \
216
simde_assert_type(unsigned short, SIMDE_SHORT_MODIFIER "u", a, op, b)
217
#define simde_assert_int(a, op, b) simde_assert_type(int, "d", a, op, b)
218
#define simde_assert_uint(a, op, b) \
219
simde_assert_type(unsigned int, "u", a, op, b)
220
#define simde_assert_long(a, op, b) simde_assert_type(long int, "ld", a, op, b)
221
#define simde_assert_ulong(a, op, b) \
222
simde_assert_type(unsigned long int, "lu", a, op, b)
223
#define simde_assert_llong(a, op, b) \
224
simde_assert_type(long long int, "lld", a, op, b)
225
#define simde_assert_ullong(a, op, b) \
226
simde_assert_type(unsigned long long int, "llu", a, op, b)
227
228
#define simde_assert_size(a, op, b) \
229
simde_assert_type(size_t, SIMDE_SIZE_MODIFIER "u", a, op, b)
230
231
#define simde_assert_float(a, op, b) simde_assert_type(float, "f", a, op, b)
232
#define simde_assert_double(a, op, b) simde_assert_type(double, "g", a, op, b)
233
#define simde_assert_ptr(a, op, b) \
234
simde_assert_type(const void *, "p", a, op, b)
235
236
#define simde_assert_int8(a, op, b) simde_assert_type(int8_t, PRIi8, a, op, b)
237
#define simde_assert_uint8(a, op, b) simde_assert_type(uint8_t, PRIu8, a, op, b)
238
#define simde_assert_int16(a, op, b) \
239
simde_assert_type(int16_t, PRIi16, a, op, b)
240
#define simde_assert_uint16(a, op, b) \
241
simde_assert_type(uint16_t, PRIu16, a, op, b)
242
#define simde_assert_int32(a, op, b) \
243
simde_assert_type(int32_t, PRIi32, a, op, b)
244
#define simde_assert_uint32(a, op, b) \
245
simde_assert_type(uint32_t, PRIu32, a, op, b)
246
#define simde_assert_int64(a, op, b) \
247
simde_assert_type(int64_t, PRIi64, a, op, b)
248
#define simde_assert_uint64(a, op, b) \
249
simde_assert_type(uint64_t, PRIu64, a, op, b)
250
251
#define simde_assert_ptr_equal(a, b) simde_assert_ptr(a, ==, b)
252
#define simde_assert_ptr_not_equal(a, b) simde_assert_ptr(a, !=, b)
253
#define simde_assert_null(ptr) simde_assert_ptr(ptr, ==, NULL)
254
#define simde_assert_not_null(ptr) simde_assert_ptr(ptr, !=, NULL)
255
#define simde_assert_ptr_null(ptr) simde_assert_ptr(ptr, ==, NULL)
256
#define simde_assert_ptr_not_null(ptr) simde_assert_ptr(ptr, !=, NULL)
257
258
#endif
/* !defined(SIMDE_CHECK_H) */
libobs
util
simde
check.h
Generated on Thu Apr 16 2020 00:00:00 for Open Broadcaster Software by
1.8.17