zstring: Add fmt formatter
Change-Id: I5947dc2efa452149f412250134d4a041cee04bc2
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/include/stdplus/zstring.hpp b/include/stdplus/zstring.hpp
index ab1e524..5cf5f0a 100644
--- a/include/stdplus/zstring.hpp
+++ b/include/stdplus/zstring.hpp
@@ -1,5 +1,6 @@
#pragma once
#include <cstddef>
+#include <fmt/core.h>
#include <limits>
#include <string>
#include <type_traits>
@@ -246,3 +247,22 @@
#undef zstring_all
} // namespace stdplus
+
+namespace fmt
+{
+
+template <typename CharT, typename Traits>
+struct formatter<stdplus::basic_zstring<CharT, Traits>,
+ std::remove_const_t<CharT>>
+ : formatter<const CharT*, std::remove_const_t<CharT>>
+{
+ template <typename FormatContext>
+ inline auto format(stdplus::basic_zstring<CharT, Traits> str,
+ FormatContext& ctx) const
+ {
+ return formatter<const CharT*, std::remove_const_t<CharT>>::format(
+ str.c_str(), ctx);
+ }
+};
+
+} // namespace fmt
diff --git a/include/stdplus/zstring_view.hpp b/include/stdplus/zstring_view.hpp
index a88edf8..f7b62dd 100644
--- a/include/stdplus/zstring_view.hpp
+++ b/include/stdplus/zstring_view.hpp
@@ -1,4 +1,5 @@
#pragma once
+#include <fmt/core.h>
#include <stdexcept>
#include <stdplus/zstring.hpp>
#include <string>
@@ -361,3 +362,21 @@
zstring_view_all(char32_t, u32);
zstring_view_all(wchar_t, w);
#undef zstring_view_all
+
+namespace fmt
+{
+
+template <typename CharT, typename Traits>
+struct formatter<stdplus::basic_zstring_view<CharT, Traits>, CharT>
+ : formatter<basic_string_view<CharT>, CharT>
+{
+ template <typename FormatContext>
+ inline auto format(stdplus::basic_zstring_view<CharT, Traits> str,
+ FormatContext& ctx) const
+ {
+ return formatter<basic_string_view<CharT>, CharT>::format(
+ static_cast<std::basic_string_view<CharT, Traits>>(str), ctx);
+ }
+};
+
+} // namespace fmt
diff --git a/test/zstring.cpp b/test/zstring.cpp
index 70f4c88..600b493 100644
--- a/test/zstring.cpp
+++ b/test/zstring.cpp
@@ -1,3 +1,4 @@
+#include <fmt/format.h>
#include <gtest/gtest.h>
#include <iostream>
#include <stdplus/zstring.hpp>
@@ -37,6 +38,8 @@
EXPECT_EQ(str2, zs);
std::cerr << const_zstring(as);
+ EXPECT_EQ("dd", fmt::format("d{}", zs));
+ EXPECT_EQ("dc", fmt::format("d{}", const_zstring(as)));
auto from_str = [&](const_zstring cs) { EXPECT_EQ(cs, "ac"); };
from_str("ac"s);
diff --git a/test/zstring_view.cpp b/test/zstring_view.cpp
index 84b7cb8..95e9aa5 100644
--- a/test/zstring_view.cpp
+++ b/test/zstring_view.cpp
@@ -1,3 +1,4 @@
+#include <fmt/format.h>
#include <gtest/gtest.h>
#include <iostream>
#include <set>
@@ -49,6 +50,7 @@
EXPECT_LE(sv, s1);
std::cerr << s1;
+ EXPECT_EQ("bac", fmt::format("b{}", s1));
std::unordered_set<zstring_view> uset{s1, s2};
EXPECT_EQ(1, uset.count("ac"));