From 07c5ed07efdd7738e07f426387ce6671ecfcb249 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 11 Mar 2021 20:04:34 -0600 Subject: [PATCH] [ox/std] Make use ##__VA_ARGS__ only non OX_USE_STDLIB builds, which are GCC builds --- deps/ox/src/ox/std/fmt.hpp | 1 + deps/ox/src/ox/std/trace.hpp | 39 +++++++++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/deps/ox/src/ox/std/fmt.hpp b/deps/ox/src/ox/std/fmt.hpp index d1f38916..3efdd643 100644 --- a/deps/ox/src/ox/std/fmt.hpp +++ b/deps/ox/src/ox/std/fmt.hpp @@ -60,6 +60,7 @@ constexpr uint64_t argCount(const char *str) noexcept { return cnt; } +static_assert(argCount("sadf asdf") == 0); static_assert(argCount("{}") == 1); static_assert(argCount("{}{}") == 2); static_assert(argCount("thing1: {}, thing2: {}") == 2); diff --git a/deps/ox/src/ox/std/trace.hpp b/deps/ox/src/ox/std/trace.hpp index 17fabe37..dccbe342 100644 --- a/deps/ox/src/ox/std/trace.hpp +++ b/deps/ox/src/ox/std/trace.hpp @@ -8,6 +8,10 @@ #pragma once +#ifdef OX_USE_STDLIB +#include +#endif + #include "bstring.hpp" #include "fmt.hpp" #include "hashmap.hpp" @@ -55,9 +59,26 @@ class OutStream { m_msg.msg = msg; } +#ifdef OX_USE_STDLIB + template + constexpr OutStream(const char *file, int line, const char *ch, detail::Fmt fmtSegments, std::array elements) { + //static_assert(sizeof...(args) == fmtSegmentCnt - 1, "Wrong number of trace arguments for format."); + m_msg.file = file; + m_msg.line = line; + m_msg.ch = ch; + const auto &firstSegment = fmtSegments.segments[0]; + m_msg.msg.append(firstSegment.str, firstSegment.length); + //const detail::FmtArg elements[sizeof...(args)] = {args...}; + for (auto i = 0u; i < fmtSegments.size - 1; ++i) { + m_msg.msg += elements[i].out; + const auto &s = fmtSegments.segments[i + 1]; + m_msg.msg.append(s.str, s.length); + } + } +#else template constexpr OutStream(const char *file, int line, const char *ch, detail::Fmt fmtSegments, Args... args) { - static_assert(sizeof...(args) == fmtSegmentCnt - 1, "Wrong number of trace arguments for format."); + //static_assert(sizeof...(args) == fmtSegmentCnt - 1, "Wrong number of trace arguments for format."); m_msg.file = file; m_msg.line = line; m_msg.ch = ch; @@ -70,6 +91,7 @@ class OutStream { m_msg.msg.append(s.str, s.length); } } +#endif inline ~OutStream() { oxTraceHook(m_msg.file, m_msg.line, m_msg.ch, m_msg.msg.c_str()); @@ -109,9 +131,15 @@ class NullStream { constexpr NullStream(const char*, int, const char*, const char* = "") { } +#ifdef OX_USE_STDLIB + template + constexpr NullStream(const char*, int, const char*, detail::Fmt, std::array) { + } +#else template constexpr NullStream(const char*, int, const char*, detail::Fmt, Args...) { } +#endif template constexpr NullStream &operator<<(const T&) { @@ -140,7 +168,12 @@ void init(); #define oxTrace(ch) ox::trace::TraceStream(__FILE__, __LINE__, ch) +#ifdef OX_USE_STDLIB +// Non-GCC compilers don't like ##__VA_ARGS__, so use initializer list, which relies on std lib +#define oxTracef(ch, fmt, ...) ox::trace::TraceStream(__FILE__, __LINE__, ch, ox::detail::fmtSegments(fmt), {__VA_ARGS__}) +#else #define oxTracef(ch, fmt, ...) ox::trace::TraceStream(__FILE__, __LINE__, ch, ox::detail::fmtSegments(fmt), ##__VA_ARGS__) +#endif -#define oxDebug() ox::trace::TraceStream(__FILE__, __LINE__, "debug") -#define oxDebugf(fmt, ...) ox::trace::TraceStream(__FILE__, __LINE__, "debug", ox::detail::fmtSegments(fmt), ##__VA_ARGS__) +#define oxDebug() oxTrace("debug") +#define oxDebugf(...) oxTracef("debug", __VA_ARGS__)