24#ifndef CRITERION_INTERNAL_ASSERT_TAG_H_
25#define CRITERION_INTERNAL_ASSERT_TAG_H_
27#define CRI_ASSERT_SWALLOW_KEYWORD(Tag) CRI_IF_DEFINED(CRI_ASSERT_TEST_KW_ ## Tag, CRI_ASSERT_SWALLOW_KW_ ## Tag, , Tag, )
28#define CRI_ASSERT_TEST_KW_struct ,
29#define CRI_ASSERT_SWALLOW_KW_struct
30#define CRI_ASSERT_TEST_KW_class ,
31#define CRI_ASSERT_SWALLOW_KW_class
32#define CRI_ASSERT_TEST_KW_enum ,
33#define CRI_ASSERT_SWALLOW_KW_enum
34#define CRI_ASSERT_TEST_KW_union ,
35#define CRI_ASSERT_SWALLOW_KW_union
37#define CRI_ASSERT_TYPE_TAG(Tag) CR_EXPAND(CRI_ASSERT_TYPE_TAG_(Tag))
38#define CRI_ASSERT_TYPE_TAG_(Tag) CRI_IF_DEFINED_NODEFER(CRI_ASSERT_TEST_TAG_ ## Tag, CR_VA_HEAD(CRI_ASSERT_TYPE_TAG_ ## Tag), , CRI_ASSERT_TYPE_TAG_UNKNOWN, (Tag))
40#define CRI_USER_TAG_ID(Id, Tag) CR_CONCAT(CR_CONCAT(cr_user_, CRI_ASSERT_TYPE_TAG_ID(Tag)), _ ## Id)
42#define CRI_ASSERT_TYPE_TAG_ID(Tag) CR_EXPAND(CRI_ASSERT_TYPE_TAG_ID_(Tag))
43#define CRI_ASSERT_TYPE_TAG_ID_(Tag) CRI_IF_DEFINED_NODEFER(CRI_ASSERT_TEST_TAG_ ## Tag, CR_VA_HEAD(CRI_ASSERT_TYPE_TAG_ID_ ## Tag), , CRI_ASSERT_SWALLOW_KEYWORD, (Tag))
45#define CRI_ASSERT_TYPE_TAG_ARRLEN(Tag) CR_EXPAND(CRI_ASSERT_TYPE_TAG_ARRLEN_(Tag))
46#define CRI_ASSERT_TYPE_TAG_ARRLEN_(Tag) \
47 CRI_IF_DEFINED(CRI_ASSERT_TEST_TAG_ ## Tag, \
48 ((intptr_t) &((*(char (*)[])((char volatile *) 0))CR_VA_TAIL(CRI_ASSERT_TYPE_TAG_ ## Tag))), , \
49 CRI_ASSERT_TYPE_TAG_UNKNOWN, (Tag))
51#define CRI_ASSERT_TYPE_TAG_UNKNOWN(Tag) COMPILE_ERROR(Unknown tag #Tag.)
53#define CRI_ASSERT_TEST_TAG_i8 ,
54#define CRI_ASSERT_TEST_TAGC_i8() ,
55#define CRI_ASSERT_TYPE_TAG_i8 int8_t,
56#define CRI_ASSERT_TYPE_TAG_ID_i8 i8,
58#define CRI_ASSERT_TEST_TAG_i16 ,
59#define CRI_ASSERT_TEST_TAGC_i16() ,
60#define CRI_ASSERT_TYPE_TAG_i16 int16_t,
61#define CRI_ASSERT_TYPE_TAG_ID_i16 i16,
63#define CRI_ASSERT_TEST_TAG_i32 ,
64#define CRI_ASSERT_TEST_TAGC_i32() ,
65#define CRI_ASSERT_TYPE_TAG_i32 int32_t,
66#define CRI_ASSERT_TYPE_TAG_ID_i32 i32,
68#define CRI_ASSERT_TEST_TAG_i64 ,
69#define CRI_ASSERT_TEST_TAGC_i64() ,
70#define CRI_ASSERT_TYPE_TAG_i64 int64_t,
71#define CRI_ASSERT_TYPE_TAG_ID_i64 i64,
73#define CRI_ASSERT_TEST_TAG_u8 ,
74#define CRI_ASSERT_TEST_TAGC_u8() ,
75#define CRI_ASSERT_TYPE_TAG_u8 uint8_t,
76#define CRI_ASSERT_TYPE_TAG_ID_u8 u8,
78#define CRI_ASSERT_TEST_TAG_u16 ,
79#define CRI_ASSERT_TEST_TAGC_u16() ,
80#define CRI_ASSERT_TYPE_TAG_u16 uint16_t,
81#define CRI_ASSERT_TYPE_TAG_ID_u16 u16,
83#define CRI_ASSERT_TEST_TAG_u32 ,
84#define CRI_ASSERT_TEST_TAGC_u32() ,
85#define CRI_ASSERT_TYPE_TAG_u32 uint32_t,
86#define CRI_ASSERT_TYPE_TAG_ID_u32 u32,
88#define CRI_ASSERT_TEST_TAG_u64 ,
89#define CRI_ASSERT_TEST_TAGC_u64() ,
90#define CRI_ASSERT_TYPE_TAG_u64 uint64_t,
91#define CRI_ASSERT_TYPE_TAG_ID_u64 u64,
93#define CRI_ASSERT_TEST_TAG_chr ,
94#define CRI_ASSERT_TEST_TAGC_chr() ,
95#define CRI_ASSERT_TYPE_TAG_chr char,
96#define CRI_ASSERT_TYPE_TAG_ID_chr chr,
98#define CRI_ASSERT_TEST_TAG_int ,
99#define CRI_ASSERT_TEST_TAGC_int() ,
100#define CRI_ASSERT_TYPE_TAG_int int,
101#define CRI_ASSERT_TYPE_TAG_ID_int int,
103#define CRI_ASSERT_TEST_TAG_uint ,
104#define CRI_ASSERT_TEST_TAGC_uint() ,
105#define CRI_ASSERT_TYPE_TAG_uint unsigned int,
106#define CRI_ASSERT_TYPE_TAG_ID_uint uint,
108#define CRI_ASSERT_TEST_TAG_long ,
109#define CRI_ASSERT_TEST_TAGC_long() ,
110#define CRI_ASSERT_TYPE_TAG_long long,
111#define CRI_ASSERT_TYPE_TAG_ID_long long,
113#define CRI_ASSERT_TEST_TAG_ulong ,
114#define CRI_ASSERT_TEST_TAGC_ulong() ,
115#define CRI_ASSERT_TYPE_TAG_ulong unsigned long,
116#define CRI_ASSERT_TYPE_TAG_ID_ulong ulong,
118#define CRI_ASSERT_TEST_TAG_llong ,
119#define CRI_ASSERT_TEST_TAGC_llong() ,
120#define CRI_ASSERT_TYPE_TAG_llong long long,
121#define CRI_ASSERT_TYPE_TAG_ID_llong llong,
123#define CRI_ASSERT_TEST_TAG_ullong ,
124#define CRI_ASSERT_TEST_TAGC_ullong() ,
125#define CRI_ASSERT_TYPE_TAG_ullong unsigned long long,
126#define CRI_ASSERT_TYPE_TAG_ID_ullong ullong,
128#define CRI_ASSERT_TEST_TAG_ptr ,
129#define CRI_ASSERT_TEST_TAGC_ptr() ,
130#define CRI_ASSERT_TYPE_TAG_ptr void *,
131#define CRI_ASSERT_TYPE_TAG_ID_ptr ptr,
133#define CRI_ASSERT_TEST_TAG_str ,
134#define CRI_ASSERT_TEST_TAGC_str() ,
136# define CRI_ASSERT_TYPE_TAG_str std::string,
138# define CRI_ASSERT_TYPE_TAG_str char *,
140#define CRI_ASSERT_TYPE_TAG_ID_str str,
142#define CRI_ASSERT_TEST_TAG_wcs ,
143#define CRI_ASSERT_TEST_TAGC_wcs() ,
145# define CRI_ASSERT_TYPE_TAG_wcs std::wstring,
147# define CRI_ASSERT_TYPE_TAG_wcs wchar_t *,
149#define CRI_ASSERT_TYPE_TAG_ID_wcs wcs,
151#define CRI_ASSERT_TEST_TAG_tcs ,
152#define CRI_ASSERT_TEST_TAGC_tcs() ,
153#define CRI_ASSERT_TYPE_TAG_tcs _TCHAR *,
154#define CRI_ASSERT_TYPE_TAG_ID_tcs tcs,
156#define CRI_ASSERT_TEST_TAG_flt ,
157#define CRI_ASSERT_TEST_TAGC_flt() ,
158#define CRI_ASSERT_TYPE_TAG_flt float,
159#define CRI_ASSERT_TYPE_TAG_ID_flt flt,
161#define CRI_ASSERT_TEST_TAG_dbl ,
162#define CRI_ASSERT_TEST_TAGC_dbl() ,
163#define CRI_ASSERT_TYPE_TAG_dbl double,
164#define CRI_ASSERT_TYPE_TAG_ID_dbl dbl,
166#define CRI_ASSERT_TEST_TAG_ldbl ,
167#define CRI_ASSERT_TEST_TAGC_ldbl() ,
168#if defined (CRI_CAPS_LDBL_IS_DBL)
169# define CRI_ASSERT_TYPE_TAG_ldbl double,
171# define CRI_ASSERT_TYPE_TAG_ldbl long double,
173#define CRI_ASSERT_TYPE_TAG_ID_ldbl ldbl,
175#define CRI_ASSERT_TEST_TAG_sz ,
176#define CRI_ASSERT_TEST_TAGC_sz() ,
177#define CRI_ASSERT_TYPE_TAG_sz size_t,
178#define CRI_ASSERT_TYPE_TAG_ID_sz sz,
180#define CRI_ASSERT_TEST_TAG_iptr ,
181#define CRI_ASSERT_TEST_TAGC_iptr() ,
182#define CRI_ASSERT_TYPE_TAG_iptr intptr_t,
183#define CRI_ASSERT_TYPE_TAG_ID_iptr iptr,
185#define CRI_ASSERT_TEST_TAG_uptr ,
186#define CRI_ASSERT_TEST_TAGC_uptr() ,
187#define CRI_ASSERT_TYPE_TAG_uptr uintptr_t,
188#define CRI_ASSERT_TYPE_TAG_ID_uptr uptr,
190#define CRI_ASSERT_TEST_TAG_type ,
191#define CRI_ASSERT_TEST_TAGC_type(x) CRI_ASSERT_TEST_TAGC_type_
192#define CRI_ASSERT_TEST_TAGC_type_() ,
193#define CRI_ASSERT_TYPE_TAG_type(T) T,
194#define CRI_ASSERT_TYPE_TAG_ID_type(T) CRI_ASSERT_SWALLOW_KEYWORD(T),
196#define CRI_ASSERT_DECLARE_NATIVE_CMP_FN(Tag) \
197 static inline int CRI_USER_TAG_ID(lt, Tag)( \
198 CRI_ASSERT_TYPE_TAG(Tag) *actual, \
199 CRI_ASSERT_TYPE_TAG(Tag) *expected) \
201 return *actual < *expected; \
203 static inline int CRI_USER_TAG_ID(eq, Tag)( \
204 CRI_ASSERT_TYPE_TAG(Tag) *actual, \
205 CRI_ASSERT_TYPE_TAG(Tag) *expected) \
207 return *actual == *expected; \
209 static inline int CRI_USER_TAG_ID(zero, Tag)( \
210 CRI_ASSERT_TYPE_TAG(Tag) *val) \
215#define CRI_ASSERT_DECLARE_NATIVE_FN(Tag, Fmt) \
216 CRI_ASSERT_DECLARE_NATIVE_CMP_FN(Tag) \
217 static inline char *CRI_USER_TAG_ID(tostr, Tag)( \
218 CRI_ASSERT_TYPE_TAG(Tag) *e) \
221 cr_asprintf(&str, "%" Fmt, *e); \
225#define CRI_ASSERT_DECLARE_STR_FN(Tag, Prefix, Fmt) \
226 CR_API int CRI_USER_TAG_ID(lt, Tag)( \
227 CRI_ASSERT_TYPE_TAG(Tag) *actual, \
228 CRI_ASSERT_TYPE_TAG(Tag) *expected); \
229 CR_API int CRI_USER_TAG_ID(eq, Tag)( \
230 CRI_ASSERT_TYPE_TAG(Tag) *actual, \
231 CRI_ASSERT_TYPE_TAG(Tag) *expected); \
232 CR_API int CRI_USER_TAG_ID(zero, Tag)(CRI_ASSERT_TYPE_TAG(Tag) *val); \
233 CR_API char *CRI_USER_TAG_ID(tostr, Tag)(CRI_ASSERT_TYPE_TAG(Tag) *e);
264# define CRI_PRIxPTR "I64x"
266# define CRI_PRIxPTR "lx"
270#elif defined(__MINGW32__)
272# define CRI_PRI64_PREFIX "l"
273# define CRI_PRIxPTR "lx"
275# define CRI_PRI64_PREFIX "ll"
276# define CRI_PRIxPTR "llx"
281# define CRI_PRIxPTR PRIxPTR
292 uintptr_t absptr = (uintptr_t) *e;
293 if (absptr > (uintptr_t)INTPTR_MAX)
315#if defined (FLT_DECIMAL_DIG)
316# define CRI_FLT_DIG CR_STR(FLT_DECIMAL_DIG)
317#elif defined (__FLT_DECIMAL_DIG__)
318# define CRI_FLT_DIG CR_STR(__FLT_DECIMAL_DIG__)
319#elif defined (DECIMAL_DIG)
320# define CRI_FLT_DIG CR_STR(DECIMAL_DIG)
322# define CRI_FLT_DIG "9"
325#if defined (DBL_DECIMAL_DIG)
326# define CRI_DBL_DIG CR_STR(DBL_DECIMAL_DIG)
327#elif defined (__DBL_DECIMAL_DIG__)
328# define CRI_DBL_DIG CR_STR(__DBL_DECIMAL_DIG__)
329#elif defined (DECIMAL_DIG)
330# define CRI_DBL_DIG CR_STR(DECIMAL_DIG)
332# define CRI_DBL_DIG "17"
335#if defined (CRI_CAPS_LDBL_IS_DBL)
336# define CRI_LDBL_DIG CRI_DBL_DIG
337#elif defined (LDBL_DECIMAL_DIG)
338# define CRI_LDBL_DIG CR_STR(LDBL_DECIMAL_DIG)
339#elif defined (__LDBL_DECIMAL_DIG__)
340# define CRI_LDBL_DIG CR_STR(__LDBL_DECIMAL_DIG__)
341#elif defined (DECIMAL_DIG)
342# define CRI_LDBL_DIG CR_STR(DECIMAL_DIG)
344# define CRI_LDBL_DIG "21"
350#if defined (CRI_CAPS_LDBL_IS_DBL)
361# if defined (_UNICODE)
370#ifdef CRI_CAPS_COMPLEX
CR_BEGIN_C_API CR_API int cr_asprintf(char **strp, const char *fmt,...)
CURL_EXTERN CURLMcode curl_socket_t s
#define CRI_ASSERT_DECLARE_STR_FN(Tag, Prefix, Fmt)
#define CRI_ASSERT_DECLARE_NATIVE_CMP_FN(Tag)
#define CRI_USER_TAG_ID(Id, Tag)
#define CRI_ASSERT_DECLARE_NATIVE_FN(Tag, Fmt)