diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/dbg_output/engine.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/dbg_output/engine.h')
-rw-r--r-- | library/cpp/dbg_output/engine.h | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/library/cpp/dbg_output/engine.h b/library/cpp/dbg_output/engine.h new file mode 100644 index 0000000000..f13c728c39 --- /dev/null +++ b/library/cpp/dbg_output/engine.h @@ -0,0 +1,180 @@ +#pragma once + +#include <util/stream/output.h> + +#include <utility> +#include <util/generic/strbuf.h> + +template <class T> +struct TDumper { + template <class S> + static inline void Dump(S& s, const T& t) { + s.Stream() << t; + } +}; + +namespace NDumpPrivate { + template <class T, class V> + inline void Dump(T& t, const V& v) { + ::TDumper<V>::Dump(t, v); + } + + template <class T, class V> + inline T&& operator<<(T&& t, V&& v) { + Dump(t, v); + + return std::forward<T>(t); + } + + struct TADLBase { + }; +} + +struct TDumpBase: public ::NDumpPrivate::TADLBase { + inline TDumpBase(IOutputStream& out, bool indent) noexcept + : Out(&out) + , IndentLevel(0) + , Indent(indent) + { + } + + inline IOutputStream& Stream() const noexcept { + return *Out; + } + + void Char(char ch); + void Char(wchar16 ch); + + void String(const TStringBuf& s); + void String(const TWtringBuf& s); + + void Raw(const TStringBuf& s); + + IOutputStream* Out; + size_t IndentLevel; + bool Indent; +}; + +struct TIndentScope { + inline TIndentScope(TDumpBase& d) + : D(&d) + { + ++(D->IndentLevel); + } + + inline ~TIndentScope() { + --(D->IndentLevel); + } + + TDumpBase* D; +}; + +template <class TChar> +struct TRawLiteral { + const TBasicStringBuf<TChar> S; +}; + +template <class TChar> +static inline TRawLiteral<TChar> DumpRaw(const TBasicStringBuf<TChar>& s) noexcept { + return {s}; +} + +template <class TChar> +static inline TRawLiteral<TChar> DumpRaw(const TChar* s) noexcept { + return {s}; +} + +template <class C> +struct TDumper<TRawLiteral<C>> { + template <class S> + static inline void Dump(S& s, const TRawLiteral<C>& v) { + s.Raw(v.S); + } +}; + +struct TIndentNewLine { +}; + +static inline TIndentNewLine IndentNewLine() noexcept { + return {}; +} + +template <> +struct TDumper<TIndentNewLine> { + template <class S> + static inline void Dump(S& s, const TIndentNewLine&) { + if (s.Indent) { + s << DumpRaw("\n") << DumpRaw(TString(s.IndentLevel * 4, ' ').data()); + } + } +}; + +template <class P> +struct TDumper<const P*> { + template <class S> + static inline void Dump(S& s, const P* p) { + s.Pointer(p); + } +}; + +template <class P> +struct TDumper<P*>: public TDumper<const P*> { +}; + +struct TCharDumper { + template <class S, class V> + static inline void Dump(S& s, const V& v) { + s.Char(v); + } +}; + +template <class S, class V> +static inline void OutSequence(S& s, const V& v, const char* openTag, const char* closeTag) { + s.ColorScheme.Markup(s); + s << DumpRaw(openTag); + + { + TIndentScope scope(s); + size_t cnt = 0; + + for (const auto& x : v) { + if (cnt) { + s.ColorScheme.Markup(s); + s << DumpRaw(", "); + } + + s << IndentNewLine(); + s.ColorScheme.Literal(s); + s << x; + ++cnt; + } + } + + s << IndentNewLine(); + s.ColorScheme.Markup(s); + s << DumpRaw(closeTag); + s.ColorScheme.ResetType(s); +} + +struct TAssocDumper { + template <class S, class V> + static inline void Dump(S& s, const V& v) { + ::OutSequence(s, v, "{", "}"); + } +}; + +struct TSeqDumper { + template <class S, class V> + static inline void Dump(S& s, const V& v) { + ::OutSequence(s, v, "[", "]"); + } +}; + +struct TStrDumper { + template <class S, class V> + static inline void Dump(S& s, const V& v) { + s.ColorScheme.String(s); + s.String(v); + s.ColorScheme.ResetType(s); + } +}; |