58 #ifndef _ASSERTIONS_H_
59 #define _ASSERTIONS_H_
74 #include <boost/typeof/typeof.hpp>
76 static void __print_back_trace() {
77 logstream(
LOG_ERROR) <<
"GraphChi does not currently have the _print_back_trace implementation!" << std::endl;
84 #define WRITE_TO_STDERR(buf, len) (logbuf(LOG_FATAL, buf, len))
90 #define CHECK(condition) \
92 if (__builtin_expect(!(condition), 0)) { \
93 logstream(LOG_ERROR) \
94 << "Check failed: " << #condition << std::endl; \
95 __print_back_trace(); \
96 throw("assertion failure"); \
103 #define PCHECK(condition) \
105 if (__builtin_expect(!(condition), 0)) { \
106 const int _PCHECK_err_no_ = errno; \
107 logstream(LOG_ERROR) \
108 << "Check failed: " << #condition << ": " \
109 << strerror(err_no) << std::endl; \
110 __print_back_trace(); \
111 throw("assertion failure"); \
121 #define CHECK_OP(op, val1, val2) \
123 const typeof(val1) _CHECK_OP_v1_ = val1; \
124 const typeof(val2) _CHECK_OP_v2_ = (typeof(val2))val2; \
125 if (__builtin_expect(!((_CHECK_OP_v1_) op \
126 (typeof(val1))(_CHECK_OP_v2_)), 0)) { \
127 logstream(LOG_ERROR) \
128 << "Check failed: " \
129 << #val1 << #op << #val2 \
132 << ' ' << #op << ' ' \
133 << _CHECK_OP_v2_ << "]" << std::endl; \
134 __print_back_trace(); \
135 throw("assertion failure"); \
139 #define CHECK_EQ(val1, val2) CHECK_OP(==, val1, val2)
140 #define CHECK_NE(val1, val2) CHECK_OP(!=, val1, val2)
141 #define CHECK_LE(val1, val2) CHECK_OP(<=, val1, val2)
142 #define CHECK_LT(val1, val2) CHECK_OP(< , val1, val2)
143 #define CHECK_GE(val1, val2) CHECK_OP(>=, val1, val2)
144 #define CHECK_GT(val1, val2) CHECK_OP(> , val1, val2)
147 #define EXPECT_EQ(val1, val2) CHECK_EQ(val1, val2)
148 #define EXPECT_NE(val1, val2) CHECK_NE(val1, val2)
149 #define EXPECT_LE(val1, val2) CHECK_LE(val1, val2)
150 #define EXPECT_LT(val1, val2) CHECK_LT(val1, val2)
151 #define EXPECT_GE(val1, val2) CHECK_GE(val1, val2)
152 #define EXPECT_GT(val1, val2) CHECK_GT(val1, val2)
153 #define ASSERT_EQ(val1, val2) EXPECT_EQ(val1, val2)
154 #define ASSERT_NE(val1, val2) EXPECT_NE(val1, val2)
155 #define ASSERT_LE(val1, val2) EXPECT_LE(val1, val2)
156 #define ASSERT_LT(val1, val2) EXPECT_LT(val1, val2)
157 #define ASSERT_GE(val1, val2) EXPECT_GE(val1, val2)
158 #define ASSERT_GT(val1, val2) EXPECT_GT(val1, val2)
160 #define EXPECT_TRUE(cond) CHECK(cond)
161 #define EXPECT_FALSE(cond) CHECK(!(cond))
162 #define EXPECT_STREQ(a, b) CHECK(strcmp(a, b) == 0)
163 #define ASSERT_TRUE(cond) EXPECT_TRUE(cond)
164 #define ASSERT_FALSE(cond) EXPECT_FALSE(cond)
165 #define ASSERT_STREQ(a, b) EXPECT_STREQ(a, b)
168 #define ASSERT_MSG(condition, fmt, ...) \
170 if (__builtin_expect(!(condition), 0)) { \
171 logstream(LOG_ERROR) \
172 << "Check failed: " << #condition << ":\n"; \
173 logger(LOG_ERROR, fmt, ##__VA_ARGS__); \
174 __print_back_trace(); \
175 throw("assertion failure"); \
180 #define CHECK_ERR(invocation) PCHECK((invocation) != -1)
184 #define DCHECK_EQ(val1, val2)
185 #define DCHECK_NE(val1, val2)
186 #define DCHECK_LE(val1, val2)
187 #define DCHECK_LT(val1, val2)
188 #define DCHECK_GE(val1, val2)
189 #define DCHECK_GT(val1, val2)
190 #define DASSERT_TRUE(cond)
191 #define DASSERT_FALSE(cond)
192 #define DASSERT_MSG(condition, fmt, ...)
195 #define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2)
196 #define DCHECK_NE(val1, val2) CHECK_NE(val1, val2)
197 #define DCHECK_LE(val1, val2) CHECK_LE(val1, val2)
198 #define DCHECK_LT(val1, val2) CHECK_LT(val1, val2)
199 #define DCHECK_GE(val1, val2) CHECK_GE(val1, val2)
200 #define DCHECK_GT(val1, val2) CHECK_GT(val1, val2)
201 #define DASSERT_TRUE(cond) ASSERT_TRUE(cond)
202 #define DASSERT_FALSE(cond) ASSERT_FALSE(cond)
203 #define DASSERT_MSG(condition, fmt, ...) \
205 if (__builtin_expect(!(condition), 0)) { \
206 logstream(LOG_ERROR) \
207 << "Check failed: " << #condition << ":\n"; \
208 logger(LOG_ERROR, fmt, ##__VA_ARGS__); \
209 __print_back_trace(); \
210 throw("assertion failure"); \
218 #undef ERROR // may conflict with ERROR macro on windows
221 #endif // _LOGGING_H_