You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.6 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
_______ _ _
|__ __| /\ | | | |
| | / \ | | | | Tau - The Micro Testing Framework for C/C++
| | / /\ \ | | | | Language: C
| | / ____ \ | |__| | https://github.com/jasmcaus/tau
|_| /_/ \_\ \____/
Licensed under the MIT License <http://opensource.org/licenses/MIT>
SPDX-License-Identifier: MIT
Copyright (c) 2021 Jason Dsouza <@jasmcaus>
*/
#ifndef TAU_MISCELLANEOUS_H
#define TAU_MISCELLANEOUS_H
// Casts
#ifdef __cplusplus
#define TAU_CAST(type, x) static_cast<type>(x)
#define TAU_PTRCAST(type, x) reinterpret_cast<type>(x)
#else
#define TAU_CAST(type, x) ((type)x)
#define TAU_PTRCAST(type, x) ((type)x)
#endif // __cplusplus
// printf format-string specifiers for tau_i64 and tau_u64 respectively
#if defined(_MSC_VER) && (_MSC_VER < 1920)
#define TAU_PRId64 "I64d"
#define TAU_PRIu64 "I64u"
#else
// Avoid spurious trailing % in format error
// See: https://stackoverflow.com/questions/8132399/how-to-printf-uint64-t-fails-with-spurious-trailing-in-format
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#define TAU_PRId64 PRId64
#define TAU_PRIu64 PRIu64
#endif
#ifndef TAU_IS_SIGNED
#define TAU_IS_SIGNED(x) (((x)-1) < 0)
#endif // TAU_IS_SIGNED
// A signed sizeof is more useful
#ifndef TAU_SIZEOF
#define TAU_SIZEOF(x) (tau_ll)(sizeof(x))
#endif
// Compare `SOME` and `NONE` values
#ifndef TAU_SOME
#define TAU_SOME(x) ((x) != TAU_NULL)
#endif // TAU_SOME
#ifndef TAU_NONE
#define TAU_NONE(x) ((x) == TAU_NULL)
#endif // TAU_NONE
// Get the type of `val`
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
#define TAU_TYPEOF(val) \
printf("%s\n", \
_Generic((val), \
signed char : "signed char", \
unsigned char : "unsigned char", \
signed short : "signed short", \
unsigned short : "unsigned short", \
signed int : "signed int", \
unsigned int : "unsigned int", \
signed long long : "signed long long", \
unsigned long long : "unsigned long long", \
float : "float", \
double : "double", \
default: "unknown type" \
))
#else
#define TAU_TYPEOF(val)
#endif
#endif // TAU_MISCELLANEOUS_H