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) */