40 const char *file_line,
50void _log_message(
const LogLevel level,
const char *file_line,
const char *func,
const char *msg);
78#define LOG_STRINGIFY_APPEND(a, b) "" a #b
79#define LOG_STRINGIFY(x) LOG_STRINGIFY_APPEND("", x)
83# define LOG_IF(level, condition) \
84 if constexpr (level != LOG_LEVEL_DFATAL && level != LOG_LEVEL_DERROR && \
85 level != LOG_LEVEL_DWARNING) \
86 if (UNLIKELY(level <= LOG_LEVEL && (condition))) \
87 LogMessage(level, __FILE__ ":" LOG_STRINGIFY(__LINE__), __func__).stream()
89# define LOG_IF(level, condition) \
90 if (UNLIKELY(level <= LOG_LEVEL && (condition))) \
91 LogMessage(level, __FILE__ ":" LOG_STRINGIFY(__LINE__), __func__).stream()
97#define LOG(level) LOG_IF(level, true)
99#define LOG_FATAL LOG(LOG_LEVEL_FATAL)
100#define LOG_DFATAL LOG(LOG_LEVEL_DFATAL)
101#define LOG_ERROR LOG(LOG_LEVEL_ERROR)
102#define LOG_DERROR LOG(LOG_LEVEL_DERROR)
103#define LOG_WARNING LOG(LOG_LEVEL_WARNING)
104#define LOG_DWARNING LOG(LOG_LEVEL_DWARNING)
105#define LOG_INFO_IMPORTANT LOG(LOG_LEVEL_INFO_IMPORTANT)
106#define LOG_INFO LOG(LOG_LEVEL_INFO)
107#define LOG_DEBUG LOG(LOG_LEVEL_DEBUG)
108#define LOG_TRACE LOG(LOG_LEVEL_TRACE)
113#define LOG_IS_ON(level) ((level) <= LOG_LEVEL)
116#define CHECK(expression) LOG_IF(LOG_LEVEL_FATAL, !(expression))
117#define CHECK_OP(op, a, b) LOG_IF(LOG_LEVEL_FATAL, !((a)op(b)))
118#define CHECK_GE(a, b) CHECK_OP(>=, a, b)
119#define CHECK_NE(a, b) CHECK_OP(!=, a, b)
120#define CHECK_EQ(a, b) CHECK_OP(==, a, b)
121#define CHECK_GT(a, b) CHECK_OP(>, a, b)
122#define CHECK_LT(a, b) CHECK_OP(<, a, b)
123#define CHECK_LE(a, b) CHECK_OP(<=, a, b)
130 LOG_FATAL <<
"Failed " << expression <<
"is not null";
132 return std::forward<T>(t);
135# define DCHECK(expression) \
136 LOG_IF(LOG_LEVEL_DFATAL, !(expression)) << LOG_STRINGIFY(expression) << " "
137# define DCHECK_NOTNULL(expression) DCheckNotNull(expression, LOG_STRINGIFY(expression))
138# define DCHECK_OP(op, a, b) \
139 LOG_IF(LOG_LEVEL_DFATAL, !((a)op(b))) \
140 << "Failed " << LOG_STRINGIFY(a) << " (" << a << ") " << LOG_STRINGIFY(op) << " " \
141 << LOG_STRINGIFY(b) << " (" << b << ") "
142# define DCHECK_GE(a, b) DCHECK_OP(>=, a, b)
143# define DCHECK_NE(a, b) DCHECK_OP(!=, a, b)
144# define DCHECK_EQ(a, b) DCHECK_OP(==, a, b)
145# define DCHECK_GT(a, b) DCHECK_OP(>, a, b)
146# define DCHECK_LT(a, b) DCHECK_OP(<, a, b)
147# define DCHECK_LE(a, b) DCHECK_OP(<=, a, b)
149# define LOG_SUPPRESS() LOG_IF(LOG_LEVEL_TRACE, false)
150# define DCHECK(expression) LOG_SUPPRESS()
151# define DCHECK_NOTNULL(expression) (expression)
152# define DCHECK_GE(a, b) LOG_SUPPRESS()
153# define DCHECK_NE(a, b) LOG_SUPPRESS()
154# define DCHECK_EQ(a, b) LOG_SUPPRESS()
155# define DCHECK_GT(a, b) LOG_SUPPRESS()
156# define DCHECK_LT(a, b) LOG_SUPPRESS()
157# define DCHECK_LE(a, b) LOG_SUPPRESS()
std::stringstream stream_
LogMessage(enum LogLevel level, const char *file_line, const char *func)
#define CCL_NAMESPACE_END
CCL_NAMESPACE_BEGIN LogLevel LOG_LEVEL
std::ostream & operator<<(std::ostream &os, const int2 &value)
void _log_message(const LogLevel level, const char *file_line, const char *func, const char *msg)
LogLevel log_string_to_level(const string &str)
void log_init(const LogFunction func=nullptr)
T DCheckNotNull(T &&t, const char *expression)
@ LOG_LEVEL_INFO_IMPORTANT
void log_level_set(const LogLevel level)
const char * log_level_to_string(const LogLevel level)
void(*)(const LogLevel level, const char *file_line, const char *func, const char *msg) LogFunction