Newer
Older
libkc / modules / include / kc_assert.h

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