Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Assert function forms. "term" terminates program on discovery (via throw false, which can
- // be easily caught) and "warn" outputs a warning. The "r" suffix means the assert also
- // acts in release mode. The "s" suffix means the assert operates on a split predicate.
- // On Windows, the "w" suffix causes the contents of "GetLastError()" to be outputted
- // immediately following the error message. On other platforms there is no additional
- // effect. TODO: effect on other platforms too; e.g. for errno?
- //Simple expression (e.g. for "x==0", evaluate entire expression):
- // Evaluate and check only in debug mode:
- // assert_term(PASS_CONDITION, FMT_CSTR,...)
- // assert_warn(PASS_CONDITION, FMT_CSTR,...)
- // assertw_term(PASS_CONDITION, FMT_CSTR,...)
- // assertw_warn(PASS_CONDITION, FMT_CSTR,...)
- // Evaluate and check in both debug and release modes:
- // assertr_term(PASS_CONDITION, FMT_CSTR,...)
- // assertr_warn(PASS_CONDITION, FMT_CSTR,...)
- // assertrw_term(PASS_CONDITION, FMT_CSTR,...)
- // assertrw_warn(PASS_CONDITION, FMT_CSTR,...)
- //Split expression (e.g. for "x==0", evaluate "x" always, but only check "==0" in debug mode):
- // asserts_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...)
- // asserts_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...)
- // assertsw_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...)
- // assertsw_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...)
- //User oughtn't to use these helpers directly.
- namespace IB {
- #ifdef BUILD_PLATFORM_WINDOWS
- void _print_gle(void);
- #endif
- void _message(char const* filename,int line, char const* fmt_cstr,va_list args);
- inline void _assert_warn(bool pass_condition, char const* filename,int line, char const* fmt_cstr,...) { if (!pass_condition) { va_list args; va_start(args,fmt_cstr);
- _message(filename,line,fmt_cstr,args);
- va_end(args); }}
- inline void _assert_term(bool pass_condition, char const* filename,int line, char const* fmt_cstr,...) { if (!pass_condition) { va_list args; va_start(args,fmt_cstr);
- _message(filename,line,fmt_cstr,args);
- throw false;
- va_end(args); }}
- inline void _assertw_warn(bool pass_condition, char const* filename,int line, char const* fmt_cstr,...) { if (!pass_condition) { va_list args; va_start(args,fmt_cstr);
- _message(filename,line,fmt_cstr,args);
- #ifdef BUILD_PLATFORM_WINDOWS
- _print_gle();
- #endif
- va_end(args); }}
- inline void _assertw_term(bool pass_condition, char const* filename,int line, char const* fmt_cstr,...) { if (!pass_condition) { va_list args; va_start(args,fmt_cstr);
- _message(filename,line,fmt_cstr,args);
- #ifdef BUILD_PLATFORM_WINDOWS
- _print_gle();
- #endif
- throw false;
- va_end(args); }}
- }
- #define assertr_term(PASS_CONDITION, FMT_CSTR,...) IB::_assert_term(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define assertr_warn(PASS_CONDITION, FMT_CSTR,...) IB::_assert_warn(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define assertrw_term(PASS_CONDITION, FMT_CSTR,...) IB::_assertw_term(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define assertrw_warn(PASS_CONDITION, FMT_CSTR,...) IB::_assertw_warn(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #ifdef BUILD_DEBUG
- #define assert_term(PASS_CONDITION, FMT_CSTR,...) IB::_assert_term(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define assert_warn(PASS_CONDITION, FMT_CSTR,...) IB::_assert_warn(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define assertw_term(PASS_CONDITION, FMT_CSTR,...) IB::_assertw_term(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define assertw_warn(PASS_CONDITION, FMT_CSTR,...) IB::_assertw_warn(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define asserts_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) IB::_assert_term(PASS_EXPR CHECK_EXPR, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define asserts_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) IB::_assert_warn(PASS_EXPR CHECK_EXPR, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define assertsw_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) IB::_assertw_term(PASS_EXPR CHECK_EXPR, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #define assertsw_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) IB::_assertw_warn(PASS_EXPR CHECK_EXPR, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
- #else
- #define assert_term(PASS_CONDITION, FMT_CSTR,...) {}
- #define assert_warn(PASS_CONDITION, FMT_CSTR,...) {}
- #define assertw_term(PASS_CONDITION, FMT_CSTR,...) {}
- #define assertw_warn(PASS_CONDITION, FMT_CSTR,...) {}
- #define asserts_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) PASS_EXPR
- #define asserts_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) PASS_EXPR
- #define assertsw_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) PASS_EXPR
- #define assertsw_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) PASS_EXPR
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement