licornea_tools
assert.h
Go to the documentation of this file.
1 #ifndef LICORNEA_ASSERT_H_
2 #define LICORNEA_ASSERT_H_
3 
4 #include <stdexcept>
5 
6 #define MF_STRINGIZE_(X) #X
7 #define MF_STRINGIZE(X) MF_STRINGIZE_(X)
8 
9 #define MF_GET_NARG_MACRO_2(_1, _2, NAME, ...) NAME
10 
11 #ifndef NDEBUG
12  #define MF_ASSERT_CRIT_MSG_(__condition__, __msg__) \
13  if(! (__condition__)) throw ::tlz::failed_assertion(__msg__ " at " __FILE__ ":" MF_STRINGIZE(__LINE__))
14  #define MF_ASSERT_MSG_(__condition__, __msg__) \
15  if(! (__condition__)) throw ::tlz::failed_assertion(__msg__ " at " __FILE__ ":" MF_STRINGIZE(__LINE__))
16 #else
17  #define MF_ASSERT_CRIT_MSG_(__condition__, __msg__) \
18  (void)0
19  #define MF_ASSERT_MSG_(__condition__, __msg__) \
20  if(! (__condition__)) throw ::tlz::failed_assertion(__msg__ " at " __FILE__ ":" MF_STRINGIZE(__LINE__))
21 #endif
22 
23 
24 #define MF_ASSERT_(__condition__) MF_ASSERT_MSG_(__condition__, "`" #__condition__ "`")
25 #define MF_ASSERT_CRIT_(__condition__) MF_ASSERT_CRIT_MSG_(__condition__, "`" #__condition__ "`")
26 
27 #ifdef _MSC_VER
28  // workaround for MSVC: http://stackoverflow.com/a/5134656/4108376
29  #define MF_EXPAND_(x) x
30  #define MF_ASSERT(...) MF_EXPAND_( MF_GET_NARG_MACRO_2(__VA_ARGS__, MF_ASSERT_MSG_, MF_ASSERT_, IGNORE)(__VA_ARGS__) )
31  #define MF_ASSERT_CRIT(...) MF_EXPAND_( MF_GET_NARG_MACRO_2(__VA_ARGS__, MF_ASSERT_CRIT_, TFF_ASSERT_CRIT_, IGNORE)(__VA_ARGS__) )
32 #else
33  #define MF_ASSERT(...) MF_GET_NARG_MACRO_2(__VA_ARGS__, MF_ASSERT_MSG_, MF_ASSERT_, IGNORE)(__VA_ARGS__)
34  #define MF_ASSERT_CRIT(...) MF_GET_NARG_MACRO_2(__VA_ARGS__, MF_ASSERT_CRIT_MSG_, MF_ASSERT_CRIT_, IGNORE)(__VA_ARGS__)
35 #endif
36 
37 #ifdef Assert
38  #undef Assert
39 #endif
40 #define Assert MF_ASSERT
41 
42 #ifdef Assert_crit
43  #undef Assert_crit
44 #endif
45 #define Assert_crit MF_ASSERT_CRIT
46 
47 
49 
50 
51 #include <stdexcept>
52 
53 namespace tlz {
54 
55 class failed_assertion : public std::runtime_error {
56 public:
57  using std::runtime_error::runtime_error;
58 };
59 
60 }
61 
62 #endif