15namespace Stroika::Foundation::Debug {
18 struct ModuleInit_ final {
19 ModuleInit_ () noexcept;
22 const inline ModuleInit_ _MI_;
25 class Private_::Emitter final {
28 Emitter (
const Emitter&) =
delete;
31 static Emitter& Get () noexcept;
33#if qStroika_Foundation_Debug_TraceToFile
35 static filesystem::path GetTraceFileName ();
42 [[deprecated (
"Since Stroika v3.0d6 - use _f format strings")]]
void EmitTraceMessage (
const char* format, ...) noexcept;
43 [[deprecated ("Since Stroika v3.0d6 - use _f format strings")]]
void EmitTraceMessage (const
wchar_t* format, ...) noexcept;
45 template <typename CHAR_T, Common::StdCompat::formattable<
wchar_t>... Args>
46 nonvirtual
void EmitTraceMessage (Characters::FormatString<CHAR_T> fmt, Args&&... args) noexcept
49 EmitTraceMessage_ (fmt.get (), Common::StdCompat::make_wformat_args (args...));
56 nonvirtual TraceLastBufferedWriteTokenType EmitTraceMessage_ (
size_t bufferLastNChars, wstring_view format,
57 Common::StdCompat::wformat_args&& args)
noexcept;
58 nonvirtual
void EmitTraceMessage_ (wstring_view format, Common::StdCompat::wformat_args&& args)
noexcept;
59 nonvirtual
void EmitTraceMessage_ (string_view format, Common::StdCompat::format_args&& args)
noexcept;
60 nonvirtual
void EmitTraceMessage_ (
const wstring& raw)
noexcept;
65 nonvirtual
bool UnputBufferedCharactersForMatchingToken (TraceLastBufferedWriteTokenType token);
67 template <
typename CHARTYPE>
68 nonvirtual
void EmitUnadornedText (
const CHARTYPE* p);
72 template <
typename CHARTYPE>
73 nonvirtual TraceLastBufferedWriteTokenType DoEmitMessage_ (
size_t bufferLastNChars,
const CHARTYPE* p,
const CHARTYPE* e);
76 size_t fLastNCharBufCharCount_{0};
77 char fLastNCharBuf_CHAR_[10];
78 wchar_t fLastNCharBuf_WCHAR_[10];
79 bool fLastNCharBuf_WCHARFlag_{
false};
80 TraceLastBufferedWriteTokenType fLastNCharBuf_Token_{0};
81 Time::DisplayedRealtimeClock::time_point fLastNCharBuf_WriteTickcount_{};
83 nonvirtual
void BufferNChars_ (
size_t nChars,
const char* p);
84 nonvirtual
void BufferNChars_ (
size_t nChars,
const wchar_t* p);
87 nonvirtual
void FlushBufferedCharacters_ ();
90 nonvirtual
void DoEmit_ (
const char* p)
noexcept;
91 nonvirtual
void DoEmit_ (
const wchar_t* p)
noexcept;
92 nonvirtual
void DoEmit_ (
const char* p,
const char* e)
noexcept;
93 nonvirtual
void DoEmit_ (
const wchar_t* p,
const wchar_t* e)
noexcept;
96 friend class Debug::TraceContextBumper;
100 template <
typename ARRAY_TYPE,
size_t SIZE_OF_ARRAY>
101 inline constexpr size_t NEltsOf ([[maybe_unused]]
const ARRAY_TYPE (&arr)[SIZE_OF_ARRAY])
103 return SIZE_OF_ARRAY;
113#if qStroika_Foundation_Debug_DefaultTracingOn
117 template <
typename CHAR_T>
119 requires (same_as<CHAR_T, char> or same_as<CHAR_T, wchar_t>)
120#
if qStroika_Foundation_Debug_DefaultTracingOn
125 template <
typename CHAR_T,
typename FCHAR_T,
typename... ARGS>
128 requires ((same_as<CHAR_T, char> or same_as<CHAR_T, wchar_t>) and (same_as<FCHAR_T, char> or same_as<FCHAR_T, wchar_t>))
129#
if qStroika_Foundation_Debug_DefaultTracingOn
130 : TraceContextBumper{cvt2WChartArrayTrunc_ (contextName), ProcessFmtString_ (fmt, forward<ARGS> (args)...)}
134#if !qStroika_Foundation_Debug_DefaultTracingOn
139#if qStroika_Foundation_Debug_DefaultTracingOn
140 template <
typename CHAR_T,
typename... ARGS>
141 auto TraceContextBumper::ProcessFmtString_ (Characters::FormatString<CHAR_T> fmt, ARGS&&... args)
noexcept -> CHAR_ARRAY_T
142 requires (same_as<CHAR_T, char> or same_as<CHAR_T, wchar_t>)
145 wstring r = Common::StdCompat::vformat (qStroika_Foundation_Characters_FMT_PREFIX_::wstring_view{fmt.get ()},
146 Common::StdCompat::make_wformat_args (args...));
147 size_t len = min<size_t> (r.size (), kMaxContextNameLen_);
150 char_traits<wchar_t>::copy (result.data (), r.data (), len);
162 template <
typename CHAR_T>
163 auto TraceContextBumper::cvt2WChartArrayTrunc_ (span<const CHAR_T> contextName) -> CHAR_ARRAY_T
166 array<wchar_t, kMaxContextNameLen_ + 1> r;
167 auto ci = contextName.begin ();
168 for (; ci != contextName.end (); ++ci) {
169 size_t i = ci - contextName.begin ();
170 if (i < kMaxContextNameLen_) {
177 Assert (ci - contextName.begin () <= kMaxContextNameLen_);
178 r[ci - contextName.begin ()] =
'\0';
181 template <
typename CHAR_T>
182 auto TraceContextBumper::cvt2WChartArrayTrunc_ (
const CHAR_T* contextName) -> CHAR_ARRAY_T
184 return cvt2WChartArrayTrunc_ (span{contextName, char_traits<CHAR_T>::length (contextName)});
193 inline TraceContextSuppressor::TraceContextSuppressor () noexcept
197 inline TraceContextSuppressor::~TraceContextSuppressor ()
201 inline bool TraceContextSuppressor::GetSuppressTraceInThisThread ()
203 return tSuppressCnt_ > 0;
#define CompileTimeFlagChecker_HEADER(NS_PREFIX, NAME, VALUE)
CompileTimeFlagChecker_HEADER () will generate a LINK ERROR if you ever compile a header with one val...
#define qStroika_Foundation_Debug_TraceToFile
TraceContextBumper() noexcept