{
string prefix;
timeval start;
- // variant cannot hold references
- std::variant<Logger*, ostringstream*> v;
+ // variant cannot hold references directly, use a wrapper
+ std::variant<std::reference_wrapper<Logger>, std::reference_wrapper<ostringstream>> v;
};
using OptLog = std::optional<LogVariant>;
void addTraceTS(const timeval& start, ostringstream& str);
-#define VLOG(log, x) \
- if (log) { \
- if (std::holds_alternative<Logger*>((log)->v)) { \
- *std::get<Logger*>(log->v) << Logger::Warning << (log)->prefix << x; \
- } \
- else if (std::holds_alternative<ostringstream*>((log)->v)) { \
- addTraceTS((log)->start, *std::get<ostringstream*>((log)->v)); \
- *std::get<ostringstream*>((log)->v) << (log)->prefix << x; \
- } \
+#define VLOG(log, x) \
+ if (log) { \
+ if (std::holds_alternative<std::reference_wrapper<Logger>>((log)->v)) { \
+ std::get<std::reference_wrapper<Logger>>((log)->v).get() << Logger::Warning << (log)->prefix << x; \
+ } \
+ else if (std::holds_alternative<std::reference_wrapper<ostringstream>>((log)->v)) { \
+ addTraceTS((log)->start, std::get<std::reference_wrapper<ostringstream>>((log)->v).get()); \
+ std::get<std::reference_wrapper<ostringstream>>((log)->v).get() << (log)->prefix << x; \
+ } \
}
-#define VLOG_NO_PREFIX(log, x) \
- if (log) { \
- if (std::holds_alternative<Logger*>((log)->v)) { \
- *std::get<Logger*>(log->v) << Logger::Warning << x; \
- } \
- else if (std::holds_alternative<ostringstream*>((log)->v)) { \
- addTraceTS((log)->start, *std::get<ostringstream*>((log)->v)); \
- *std::get<ostringstream*>((log)->v) << x; \
- } \
+#define VLOG_NO_PREFIX(log, x) \
+ if (log) { \
+ if (std::holds_alternative<std::reference_wrapper<Logger>>((log)->v)) { \
+ std::get<std::reference_wrapper<Logger>>((log)->v).get() << Logger::Warning << x; \
+ } \
+ else if (std::holds_alternative<std::reference_wrapper<ostringstream>>((log)->v)) { \
+ addTraceTS((log)->start, std::get<std::reference_wrapper<ostringstream>>((log)->v).get()); \
+ std::get<std::reference_wrapper<ostringstream>>((log)->v).get() << x; \
+ } \
}
{
OptLog ret;
if (d_lm == Log) {
- ret = {prefix, d_fixednow, &g_log};
+ ret = {prefix, d_fixednow, g_log};
}
else if (d_lm == Store) {
- ret = {prefix, d_fixednow, &d_trace};
+ ret = {prefix, d_fixednow, d_trace};
}
return ret;
}