8 #ifndef Sawyer_Assert_H
9 #define Sawyer_Assert_H
11 #include <Sawyer/Sawyer.h>
97 SAWYER_EXPORT_NORETURN
void fail(
const char *mesg,
const char *expr,
const std::string ¬e,
98 const char *filename,
unsigned linenum,
const char *funcname) SAWYER_ATTR_NORETURN;
102 const char *filename,
unsigned linenum,
const char *funcname);
117 #define ASSERT_always_require(expr) ASSERT_always_require2(expr, "")
118 #define ASSERT_always_require2(expr, note) \
120 static_cast<void>(0) : \
121 Sawyer::Assert::fail("assertion failed", "required: " #expr, (note), \
122 __FILE__, __LINE__, SAWYER_PRETTY_FUNCTION))
124 #define ASSERT_always_forbid(expr) ASSERT_always_forbid2(expr, "")
125 #define ASSERT_always_forbid2(expr, note) \
127 static_cast<void>(0) : \
128 Sawyer::Assert::fail("assertion failed", \
129 "forbidden: " #expr, (note), __FILE__, __LINE__, SAWYER_PRETTY_FUNCTION))
131 #define ASSERT_always_not_null(expr) ASSERT_always_not_null2(expr, "")
132 #define ASSERT_always_not_null2(expr, note) \
134 static_cast<void>(0) : \
135 Sawyer::Assert::fail("null pointer", \
136 #expr, (note), __FILE__, __LINE__, SAWYER_PRETTY_FUNCTION))
138 #define ASSERT_always_not_reachable(note) \
139 Sawyer::Assert::fail("reached impossible state", NULL, (note), \
140 __FILE__, __LINE__, SAWYER_PRETTY_FUNCTION);
142 #define ASSERT_always_not_implemented(note) \
143 Sawyer::Assert::fail("not implemented yet", NULL, (note), \
144 __FILE__, __LINE__, SAWYER_PRETTY_FUNCTION)
146 #define ASSERT_always_this() \
148 static_cast<void>(0) : \
149 Sawyer::Assert::fail("assertion failed", \
150 "required: this!=NULL", "'this' cannot be null in an object method", \
151 __FILE__, __LINE__, SAWYER_PRETTY_FUNCTION))
159 #define ASSERT_require(expr)
160 #define ASSERT_require2(expr, note)
161 #define ASSERT_forbid(expr)
162 #define ASSERT_forbid2(expr, note)
163 #define ASSERT_not_null(expr)
164 #define ASSERT_not_null2(expr, note)
165 #define ASSERT_not_reachable(note) ASSERT_always_not_reachable(note)
166 #define ASSERT_not_implemented(note) ASSERT_always_not_implemented(note)
167 #define ASSERT_this()
171 #define ASSERT_require(expr) ASSERT_always_require(expr)
172 #define ASSERT_require2(expr, note) ASSERT_always_require2(expr, note)
173 #define ASSERT_forbid(expr) ASSERT_always_forbid(expr)
174 #define ASSERT_forbid2(expr, note) ASSERT_always_forbid2(expr, note)
175 #define ASSERT_not_null(expr) ASSERT_always_not_null(expr)
176 #define ASSERT_not_null2(expr, note) ASSERT_always_not_null2(expr, note)
177 #define ASSERT_not_reachable(note) ASSERT_always_not_reachable(note)
178 #define ASSERT_not_implemented(note) ASSERT_always_not_implemented(note)
179 #define ASSERT_this() ASSERT_always_this()
188 Sawyer::Assert::fail("not implemented yet", NULL, (note), \
189 __FILE__, __LINE__, SAWYER_PRETTY_FUNCTION)
191 #define FIXME(note) \
192 Sawyer::Assert::fail("needs to be fixed", NULL, (note), \
193 __FILE__, __LINE__, SAWYER_PRETTY_FUNCTION)
void fail(const char *mesg, const char *expr, const std::string ¬e, const char *filename, unsigned linenum, const char *funcname) __attribute__((noreturn))
Cause immediate failure.
void(* AssertFailureHandler)(const char *mesg, const char *expr, const std::string ¬e, const char *filename, unsigned linenum, const char *funcname)
Type for user-defined assertion failure handler.
Name space for the entire library.
AssertFailureHandler assertFailureHandler
Optional user callback to handle assertion failures.