/*! * @file assert.h * @brief Contains assert macro for meowpp's debugging tools. * * You can use * @code{.cpp} * #define MEOWPP_NODEBUG * @endcode * to remove all the debugging code. * * @author cathook */ #ifndef __MEOWPP_ASSERT_H__ #define __MEOWPP_ASSERT_H__ #include #include namespace meow { /*! * @def Assert * @brief A macro for assert whether a expression is failed or not. * @param expr The expression to be tested. * @param ... Error information to be printed to stderr when the expr is failed. * * When expression is failed, it will call `fprintf(stderr, ...)` to print out * the message follows by calling `abort()` to halt the program. * * @note You can use * @code{.cpp} * #define MEOWPP_TESTING * @endcode * to tell this macro calls `test::abort()` instead of normal `abort()` * function. */ #ifndef MEOWPP_NODEBUG #define MEOWPP_STRINGIFY(x) #x #define MEOWPP_TOSTRING(x) MEOWPP_STRINGIFY(x) #ifndef MEOWPP_DEBUG_ASSERT_TESTING #define Assert(expr,...) \ while (((expr) || \ (fprintf(stderr, "Assertion error at " \ __FILE__ ":" MEOWPP_TOSTRING(__LINE__) \ " >>> " __VA_ARGS__), \ abort(), false) + fprintf(stderr, "\n")) && false) #else // MEOWPP_DEBUG_ASSERT_TESTING #define Assert(expr,...) \ while (((expr) || \ (fprintf(stderr, "Assertion error at " \ __FILE__ ":" MEOWPP_TOSTRING(__LINE__) \ " >>> " __VA_ARGS__), \ test::abort(), false) + fprintf(stderr, "\n")) && false) #endif // MEOWPP_DEBUG_ASSERT_TESTING #else // MEOWPP_NODEBUG #define Assert(expr,...) \ while (false) #endif // MEOWPP_NODEBUG } // meow #endif // __MEOWPP_ASSERT_H__