Skip to content

Commit 34d5495

Browse files
committed
Add stream-style logging macros
1 parent 5705473 commit 34d5495

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

src/include/common/macros.h

+35
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,47 @@
1414

1515
#include <cassert>
1616
#include <exception>
17+
#include <iostream>
18+
#include <sstream>
1719
#include <stdexcept>
1820

1921
namespace bustub {
2022

2123
#define BUSTUB_ASSERT(expr, message) assert((expr) && (message))
2224

25+
namespace internal {
26+
27+
// An internal stream, used to take C++ stream-style parameters for display, and exit the program with `std::abort`.
28+
class LogFatalStream {
29+
public:
30+
LogFatalStream(const char *file, int line) : file_(file), line_(line) {}
31+
32+
~LogFatalStream() {
33+
std::cerr << file_ << ":" << line_ << ": " << log_stream_.str() << std::endl;
34+
std::abort();
35+
}
36+
37+
template <typename T>
38+
LogFatalStream &operator<<(const T &val) {
39+
log_stream_ << val;
40+
return *this;
41+
}
42+
43+
private:
44+
const char *file_;
45+
int line_;
46+
std::ostringstream log_stream_;
47+
};
48+
49+
} // namespace internal
50+
51+
// A macro which checks `expr` value and performs assert.
52+
// Different from `BUSTUB_ASSERT`, it takes stream-style parameters.
53+
#define BUSTUB_ASSERT_AND_LOG(expr) \
54+
if (bool val = (expr); !val) internal::LogFatalStream { \
55+
__FILE__, __LINE__ \
56+
}
57+
2358
#define UNIMPLEMENTED(message) throw std::logic_error(message)
2459

2560
#define BUSTUB_ENSURE(expr, message) \

0 commit comments

Comments
 (0)