aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/include
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2026-04-14 10:00:20 +0200
committerStefan Boberg <[email protected]>2026-04-14 10:00:20 +0200
commit946fb87278aeff4cb4467950ff31a0812825cbf7 (patch)
tree74a11d6c07dceede6a2745357f41b333879cdf42 /src/zencore/include
parentAdd reduce-allocs skill and string builder infrastructure (diff)
downloadzen-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/include')
-rw-r--r--src/zencore/include/zencore/fmtutils.h43
-rw-r--r--src/zencore/include/zencore/iohash.h1
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;