Newer
Older
libkc / modules / include / kc_assert.h
  1.  
  2. /**
  3. * @file kc_assert.h
  4. * @brief KC Assert モジュール
  5. * @copyright 2003 - 2023 Nomura Kei
  6. * @depends
  7. * kc.h
  8. */
  9. #ifndef KC_ASSERT_H
  10. #define KC_ASSERT_H
  11.  
  12. #include <kc.h>
  13. #include <kc_overload.h>
  14.  
  15. #ifdef __cplusplus
  16. extern "C"
  17. {
  18. namespace kc
  19. {
  20. using namespace std;
  21. #endif
  22.  
  23. #ifdef NDEBUG
  24. // NDEBUG が定義されている場合は、assert と同様何もしない。
  25. #define assert_equals(...) KC_OVERLOAD(assert_equals_, __VA_ARGS__)
  26. #define assert_equals_2(expected, actual) ((void)expected, (void)actual)
  27. #define assert_equals_3(expected, actual, delta) ((void)expected, (void)actual, (void)delta)
  28. #define assert_null(condition) ((void)condition)
  29. #define assert_not_null(condition) ((void)condition)
  30. #define assert_false(condition) ((void)condition)
  31. #define assert_true(condition) ((void)condition)
  32. #define assert_fail() ((void)0)
  33.  
  34. #else
  35. // DEBUG 有効
  36. #define assert_equals(...) KC_OVERLOAD(assert_equals_, __VA_ARGS__)
  37. #define assert_equals_2(expected, actual) \
  38. _Generic((expected), \
  39. int: assert_equals_long_, \
  40. long: assert_equals_long_, \
  41. char *: assert_equals_string_, \
  42. const char *: assert_equals_string_)(expected, actual, __FILE__, __func__, __LINE__)
  43.  
  44. #define assert_equals_3(expected, actual, delta) \
  45. _Generic((expected), \
  46. float: assert_equals_double_, \
  47. double: assert_equals_double_, \
  48. default: assert_equals_binary_)(expected, actual, delta, __FILE__, __func__, __LINE__)
  49.  
  50. #define assert_null(condition) assert_null_(condition, __FILE__, __func__, __LINE__)
  51. #define assert_not_null(condition) assert_not_null_(condition, __FILE__, __func__, __LINE__)
  52. #define assert_false(condition) assert_false_(condition, __FILE__, __func__, __LINE__)
  53. #define assert_true(condition) assert_true_(condition, __FILE__, __func__, __LINE__)
  54. #define assert_fail() assert_fail_(__FILE__, __func__, __LINE__)
  55. #endif // NDEBUG
  56.  
  57. void assert_equals_long_(long expected, long actual, const char *file, const char *func, int line);
  58. void assert_equals_double_(double expected, double actual, double delta, const char *file, const char *func, int line);
  59. void assert_equals_string_(const char *expected, const char *actual, const char *file, const char *func, int line);
  60. void assert_equals_binary_(const void *expected, const void *actual, size_t size, const char *file, const char *func, int line);
  61. void assert_null_(const void *condition, const char *file, const char *func, int line);
  62. void assert_not_null_(const void *condition, const char *file, const char *func, int line);
  63. void assert_false_(bool condition, const char *file, const char *func, int line);
  64. void assert_true_(bool condition, const char *file, const char *func, int line);
  65. void assert_fail_(const char *file, const char *func, int line);
  66. extern void (*assert_handler)(const char *msg);
  67.  
  68. #ifdef __cplusplus
  69. } // namespace kc
  70. } // extern "C"
  71. #endif
  72. #endif // KC_ASSERT_H