00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00023
00024 #ifndef BTK_COMMON_ASSERTIONS_HPP
00025 #define BTK_COMMON_ASSERTIONS_HPP
00026
00027 #include <string>
00028 #include <cstdlib>
00029
00030 #include <btk/core/config/btk_config.hpp>
00031 #include <btk/core/io/logging.hpp>
00032
00033 namespace BTK {
00034 namespace COMMON {
00035 namespace ASSERTIONS {
00036
00037 typedef enum {EXIT, CONTINUE, IGNORE} assert_code;
00038
00039 std::string make_assert_message(std::string const & msg,
00040 std::string const & file,
00041 unsigned line);
00042
00043 typedef assert_code (*assert_handler)(std::string const &,
00044 std::string const &,
00045 unsigned);
00046
00047 assert_code default_assert_handler(std::string const & msg,
00048 std::string const & file,
00049 unsigned line);
00050
00051 extern assert_handler current_assert_handler;
00052
00053 }
00054 }
00055 }
00056
00057 #ifndef BTK_NDEBUG
00058 # define BTK_ASSERT(expr,str) \
00059 if (!(expr)) { \
00060 using namespace BTK::COMMON::ASSERTIONS; \
00061 static assert_code status = EXIT; \
00062 \
00063 if (status != IGNORE) { \
00064 status = \
00065 current_assert_handler((str), \
00066 __FILE__, \
00067 __LINE__); \
00068 if (status == EXIT) std::exit(-1); \
00069 } \
00070 };
00071
00072 # define BTK_INVARIANT(expr) BTK_ASSERT(expr,"Invariant violated")
00073 #else
00074 # define BTK_ASSERT(expr,str)
00075
00076 # define BTK_INVARIANT(expr) \
00077 if (!(expr)) { \
00078 BTK::COMMON::LOGGING::error_msg(make_assert_message("Invariant violated", \
00079 __FILE__,__LINE__)); \
00080 std::exit(-1); \
00081 }
00082 #endif
00083
00084 #endif //BTK_ASSERTIONS_H