diff --git a/emper/Debug.hpp b/emper/Debug.hpp index 57d1dfac33fd17c65e2283621f799c2849aa5b3f..2ef222ca9ea588f38ee559056ef4b034d84dadfc 100644 --- a/emper/Debug.hpp +++ b/emper/Debug.hpp @@ -14,8 +14,14 @@ // clang-format off +// Hide the stringstream inside a lamba from the context where our LOG macros are used. +// The lamda should be fairly cheap/free because it will be inlined. +// The use of a lambda here is the ISO C++ equivalent to GCC statement expressions. // NOLINTNEXTLINE(bugprone-macro-parentheses) -#define LOG(level, x, log_func, new_line) do {if constexpr (level > EMPER_LOG_LEVEL) { break; } std::stringstream sst; sst << x; if constexpr (new_line) { sst << std::endl; }; log_func(sst.str()); } while (false) +#define LOG_STR_LAMBDA(x, new_line) [&](){std::stringstream sst; sst << x; if constexpr (new_line) { sst << std::endl; }; return sst.str(); } + +// NOLINTNEXTLINE(bugprone-macro-parentheses) +#define LOG(level, x, log_func, new_line) do {if constexpr (level > EMPER_LOG_LEVEL) { break; } log_func(LOG_STR_LAMBDA(x, new_line)()); } while (false) // NOLINTNEXTLINE(bugprone-macro-parentheses) #define DBG(x) LOG(Debug, x, emper_log_no_prefix, true);