/** * @file kc_assert.h * @brief KC Assert モジュール * @copyright 2003 - 2023 Nomura Kei * @depends * kc.h */ #ifndef KC_ASSERT_H #define KC_ASSERT_H #include <kc.h> #include <kc_overload.h> #ifdef __cplusplus extern "C" { namespace kc { using namespace std; #endif #ifdef NDEBUG // NDEBUG が定義されている場合は、assert と同様何もしない。 #define assert_equals(...) KC_OVERLOAD(assert_equals_, __VA_ARGS__) #define assert_equals_2(expected, actual) ((void)expected, (void)actual) #define assert_equals_3(expected, actual, delta) ((void)expected, (void)actual, (void)delta) #define assert_null(condition) ((void)condition) #define assert_not_null(condition) ((void)condition) #define assert_false(condition) ((void)condition) #define assert_true(condition) ((void)condition) #define assert_fail() ((void)0) #else // DEBUG 有効 #define assert_equals(...) KC_OVERLOAD(assert_equals_, __VA_ARGS__) #define assert_equals_2(expected, actual) \ _Generic((expected), \ int: assert_equals_long_, \ long: assert_equals_long_, \ char *: assert_equals_string_, \ const char *: assert_equals_string_)(expected, actual, __FILE__, __func__, __LINE__) #define assert_equals_3(expected, actual, delta) \ _Generic((expected), \ float: assert_equals_double_, \ double: assert_equals_double_, \ default: assert_equals_binary_)(expected, actual, delta, __FILE__, __func__, __LINE__) #define assert_null(condition) assert_null_(condition, __FILE__, __func__, __LINE__) #define assert_not_null(condition) assert_not_null_(condition, __FILE__, __func__, __LINE__) #define assert_false(condition) assert_false_(condition, __FILE__, __func__, __LINE__) #define assert_true(condition) assert_true_(condition, __FILE__, __func__, __LINE__) #define assert_fail() assert_fail_(__FILE__, __func__, __LINE__) #endif // NDEBUG void assert_equals_long_(long expected, long actual, const char *file, const char *func, int line); void assert_equals_double_(double expected, double actual, double delta, const char *file, const char *func, int line); void assert_equals_string_(const char *expected, const char *actual, const char *file, const char *func, int line); void assert_equals_binary_(const void *expected, const void *actual, size_t size, const char *file, const char *func, int line); void assert_null_(const void *condition, const char *file, const char *func, int line); void assert_not_null_(const void *condition, const char *file, const char *func, int line); void assert_false_(bool condition, const char *file, const char *func, int line); void assert_true_(bool condition, const char *file, const char *func, int line); void assert_fail_(const char *file, const char *func, int line); extern void (*assert_handler)(const char *msg); #ifdef __cplusplus } // namespace kc } // extern "C" #endif #endif // KC_ASSERT_H