Advertisement
Geometrian

asserts

Jan 4th, 2015
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.71 KB | None | 0 0
  1. //Assert function forms.  "term" terminates program on discovery (via throw false, which can
  2. //  be easily caught) and "warn" outputs a warning.  The "r" suffix means the assert also
  3. //  acts in release mode.  The "s" suffix means the assert operates on a split predicate.
  4. //  On Windows, the "w" suffix causes the contents of "GetLastError()" to be outputted
  5. //  immediately following the error message.  On other platforms there is no additional
  6. //  effect.  TODO: effect on other platforms too; e.g. for errno?
  7.  
  8. //Simple expression (e.g. for "x==0", evaluate entire expression):
  9. //  Evaluate and check only in debug mode:
  10. //      assert_term(PASS_CONDITION, FMT_CSTR,...)
  11. //      assert_warn(PASS_CONDITION, FMT_CSTR,...)
  12. //      assertw_term(PASS_CONDITION, FMT_CSTR,...)
  13. //      assertw_warn(PASS_CONDITION, FMT_CSTR,...)
  14. //  Evaluate and check in both debug and release modes:
  15. //      assertr_term(PASS_CONDITION, FMT_CSTR,...)
  16. //      assertr_warn(PASS_CONDITION, FMT_CSTR,...)
  17. //      assertrw_term(PASS_CONDITION, FMT_CSTR,...)
  18. //      assertrw_warn(PASS_CONDITION, FMT_CSTR,...)
  19. //Split expression (e.g. for "x==0", evaluate "x" always, but only check "==0" in debug mode):
  20. //      asserts_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...)
  21. //      asserts_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...)
  22. //      assertsw_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...)
  23. //      assertsw_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...)
  24.  
  25. //User oughtn't to use these helpers directly.
  26. namespace IB {
  27.     #ifdef BUILD_PLATFORM_WINDOWS
  28.     void _print_gle(void);
  29.     #endif
  30.     void _message(char const* filename,int line, char const* fmt_cstr,va_list args);
  31.  
  32.     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);
  33.         _message(filename,line,fmt_cstr,args);
  34.     va_end(args); }}
  35.     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);
  36.         _message(filename,line,fmt_cstr,args);
  37.         throw false;
  38.     va_end(args); }}
  39.  
  40.     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);
  41.         _message(filename,line,fmt_cstr,args);
  42.         #ifdef BUILD_PLATFORM_WINDOWS
  43.         _print_gle();
  44.         #endif
  45.     va_end(args); }}
  46.     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);
  47.         _message(filename,line,fmt_cstr,args);
  48.         #ifdef BUILD_PLATFORM_WINDOWS
  49.         _print_gle();
  50.         #endif
  51.         throw false;
  52.     va_end(args); }}
  53. }
  54. #define assertr_term(PASS_CONDITION, FMT_CSTR,...) IB::_assert_term(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  55. #define assertr_warn(PASS_CONDITION, FMT_CSTR,...) IB::_assert_warn(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  56. #define assertrw_term(PASS_CONDITION, FMT_CSTR,...) IB::_assertw_term(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  57. #define assertrw_warn(PASS_CONDITION, FMT_CSTR,...) IB::_assertw_warn(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  58. #ifdef BUILD_DEBUG
  59.     #define assert_term(PASS_CONDITION, FMT_CSTR,...) IB::_assert_term(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  60.     #define assert_warn(PASS_CONDITION, FMT_CSTR,...) IB::_assert_warn(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  61.     #define assertw_term(PASS_CONDITION, FMT_CSTR,...) IB::_assertw_term(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  62.     #define assertw_warn(PASS_CONDITION, FMT_CSTR,...) IB::_assertw_warn(PASS_CONDITION, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  63.     #define asserts_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) IB::_assert_term(PASS_EXPR CHECK_EXPR, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  64.     #define asserts_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) IB::_assert_warn(PASS_EXPR CHECK_EXPR, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  65.     #define assertsw_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) IB::_assertw_term(PASS_EXPR CHECK_EXPR, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  66.     #define assertsw_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) IB::_assertw_warn(PASS_EXPR CHECK_EXPR, __FILE__,__LINE__, FMT_CSTR, ##__VA_ARGS__)
  67. #else
  68.     #define assert_term(PASS_CONDITION, FMT_CSTR,...) {}
  69.     #define assert_warn(PASS_CONDITION, FMT_CSTR,...) {}
  70.     #define assertw_term(PASS_CONDITION, FMT_CSTR,...) {}
  71.     #define assertw_warn(PASS_CONDITION, FMT_CSTR,...) {}
  72.     #define asserts_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) PASS_EXPR
  73.     #define asserts_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) PASS_EXPR
  74.     #define assertsw_term(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) PASS_EXPR
  75.     #define assertsw_warn(PASS_EXPR,CHECK_EXPR, FMT_CSTR,...) PASS_EXPR
  76. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement