diff options
| author | Stefan Boberg <[email protected]> | 2026-04-14 10:00:20 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2026-04-14 10:00:20 +0200 |
| commit | 946fb87278aeff4cb4467950ff31a0812825cbf7 (patch) | |
| tree | 74a11d6c07dceede6a2745357f41b333879cdf42 /src/zencore | |
| parent | Add reduce-allocs skill and string builder infrastructure (diff) | |
| download | zen-sb/reduce-allocs.tar.xz zen-sb/reduce-allocs.zip | |
Add generic fmt::formatter for types with ToString(StringBuilderBase&)sb/reduce-allocs
Replace explicit fmt::formatter specializations for IoHash, Oid, and
Guid with a single concept-based generic formatter. Add ToString()
to IoHash as an inline delegate to ToHexString().
Diffstat (limited to 'src/zencore')
| -rw-r--r-- | src/zencore/include/zencore/fmtutils.h | 43 | ||||
| -rw-r--r-- | src/zencore/include/zencore/iohash.h | 1 |
2 files changed, 15 insertions, 29 deletions
diff --git a/src/zencore/include/zencore/fmtutils.h b/src/zencore/include/zencore/fmtutils.h index 2a829d2d5..a263c6f04 100644 --- a/src/zencore/include/zencore/fmtutils.h +++ b/src/zencore/include/zencore/fmtutils.h @@ -3,10 +3,7 @@ #pragma once #include <zencore/filesystem.h> -#include <zencore/guid.h> -#include <zencore/iohash.h> #include <zencore/string.h> -#include <zencore/uid.h> ZEN_THIRD_PARTY_INCLUDES_START #include <fmt/format.h> @@ -60,39 +57,27 @@ struct fmt::formatter<T> : fmt::formatter<std::string_view> } }; -template<> -struct fmt::formatter<zen::IoHash> : formatter<string_view> -{ - template<typename FormatContext> - auto format(const zen::IoHash& Hash, FormatContext& ctx) const - { - zen::IoHash::String_t String; - Hash.ToHexString(String); - return fmt::formatter<string_view>::format({String, zen::IoHash::StringLength}, ctx); - } -}; +// Generic formatter for any type with a ToString(StringBuilderBase&) member function. +// This covers Guid, IoHash, Oid, and similar types without needing per-type +// fmt::formatter specializations. -template<> -struct fmt::formatter<zen::Oid> : formatter<string_view> +template<typename T> +concept HasMemberToStringBuilder = std::is_class_v<T> && requires(const T& v, zen::StringBuilderBase& sb) { - template<typename FormatContext> - auto format(const zen::Oid& Id, FormatContext& ctx) const { - zen::StringBuilder<32> String; - Id.ToString(String); - return fmt::formatter<string_view>::format({String.c_str(), zen::Oid::StringLength}, ctx); - } -}; + v.ToString(sb) + } -> std::same_as<zen::StringBuilderBase&>; +} && !HasFreeToString<T> && !HasStringViewConversion<T>; -template<> -struct fmt::formatter<zen::Guid> : formatter<string_view> +template<HasMemberToStringBuilder T> +struct fmt::formatter<T> : fmt::formatter<std::string_view> { template<typename FormatContext> - auto format(const zen::Guid& Id, FormatContext& ctx) const + auto format(const T& Value, FormatContext& ctx) const { - zen::StringBuilder<48> String; - Id.ToString(String); - return fmt::formatter<string_view>::format({String.c_str(), zen::Guid::StringLength}, ctx); + zen::ExtendableStringBuilder<64> String; + Value.ToString(String); + return fmt::formatter<std::string_view>::format(String.ToView(), ctx); } }; diff --git a/src/zencore/include/zencore/iohash.h b/src/zencore/include/zencore/iohash.h index a619b0053..50c439b70 100644 --- a/src/zencore/include/zencore/iohash.h +++ b/src/zencore/include/zencore/iohash.h @@ -54,6 +54,7 @@ struct IoHash static bool TryParse(std::string_view Str, IoHash& Hash); const char* ToHexString(char* outString /* 40 characters + NUL terminator */) const; StringBuilderBase& ToHexString(StringBuilderBase& outBuilder) const; + StringBuilderBase& ToString(StringBuilderBase& outBuilder) const { return ToHexString(outBuilder); } std::string ToHexString() const; static constexpr int StringLength = 40; |