Commit b3162b1d by Marcin Kowalczyk Committed by Copybara-Service

Make sinks provided to `AbslStringify()` usable with `absl::Format()`.

Such sinks must define ADL-callable `AbslFormatFlush()`. It can just forward to
`Append()`.

PiperOrigin-RevId: 479043790
Change-Id: I5d7d80ca1e17adf03b77726df8a52e2b4e9196ce
parent d24156f6
...@@ -963,8 +963,8 @@ cc_test( ...@@ -963,8 +963,8 @@ cc_test(
copts = ABSL_TEST_COPTS, copts = ABSL_TEST_COPTS,
visibility = ["//visibility:private"], visibility = ["//visibility:private"],
deps = [ deps = [
":str_format",
":strings", ":strings",
"//absl/base:core_headers",
"@com_google_googletest//:gtest_main", "@com_google_googletest//:gtest_main",
], ],
) )
...@@ -1164,7 +1164,6 @@ cc_test( ...@@ -1164,7 +1164,6 @@ cc_test(
":cord", ":cord",
":str_format", ":str_format",
":strings", ":strings",
"//absl/base:core_headers",
"@com_google_googletest//:gtest_main", "@com_google_googletest//:gtest_main",
], ],
) )
......
...@@ -281,6 +281,7 @@ absl_cc_test( ...@@ -281,6 +281,7 @@ absl_cc_test(
${ABSL_TEST_COPTS} ${ABSL_TEST_COPTS}
DEPS DEPS
absl::strings absl::strings
absl::str_format
absl::core_headers absl::core_headers
GTest::gmock_main GTest::gmock_main
) )
......
...@@ -85,6 +85,11 @@ class StringifySink { ...@@ -85,6 +85,11 @@ class StringifySink {
bool PutPaddedString(string_view v, int width, int precision, bool left); bool PutPaddedString(string_view v, int width, int precision, bool left);
// Support `absl::Format(&sink, format, args...)`.
friend void AbslFormatFlush(StringifySink* sink, absl::string_view v) {
sink->Append(v);
}
template <typename T> template <typename T>
friend string_view ExtractStringification(StringifySink& sink, const T& v); friend string_view ExtractStringification(StringifySink& sink, const T& v);
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <vector> #include <vector>
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "absl/strings/str_format.h"
#include "absl/strings/substitute.h" #include "absl/strings/substitute.h"
#ifdef __ANDROID__ #ifdef __ANDROID__
...@@ -632,4 +633,21 @@ TEST(StrCat, AbslStringifyExample) { ...@@ -632,4 +633,21 @@ TEST(StrCat, AbslStringifyExample) {
EXPECT_EQ(absl::StrCat("a ", p, " z"), "a (10, 20) z"); EXPECT_EQ(absl::StrCat("a ", p, " z"), "a (10, 20) z");
} }
struct PointStringifyUsingFormat {
template <typename FormatSink>
friend void AbslStringify(FormatSink& sink,
const PointStringifyUsingFormat& p) {
absl::Format(&sink, "(%g, %g)", p.x, p.y);
}
double x = 10.0;
double y = 20.0;
};
TEST(StrCat, AbslStringifyExampleUsingFormat) {
PointStringifyUsingFormat p;
EXPECT_EQ(absl::StrCat(p), "(10, 20)");
EXPECT_EQ(absl::StrCat("a ", p, " z"), "a (10, 20) z");
}
} // namespace } // namespace
...@@ -789,6 +789,11 @@ class FormatSink { ...@@ -789,6 +789,11 @@ class FormatSink {
return sink_->PutPaddedString(v, width, precision, left); return sink_->PutPaddedString(v, width, precision, left);
} }
// Support `absl::Format(&sink, format, args...)`.
friend void AbslFormatFlush(FormatSink* sink, absl::string_view v) {
sink->Append(v);
}
private: private:
friend str_format_internal::FormatSinkImpl; friend str_format_internal::FormatSinkImpl;
explicit FormatSink(str_format_internal::FormatSinkImpl* s) : sink_(s) {} explicit FormatSink(str_format_internal::FormatSinkImpl* s) : sink_(s) {}
......
...@@ -1118,6 +1118,23 @@ TEST_F(FormatExtensionTest, AbslStringifyExample) { ...@@ -1118,6 +1118,23 @@ TEST_F(FormatExtensionTest, AbslStringifyExample) {
PointStringify p; PointStringify p;
EXPECT_EQ(absl::StrFormat("a %v z", p), "a (10, 20) z"); EXPECT_EQ(absl::StrFormat("a %v z", p), "a (10, 20) z");
} }
struct PointStringifyUsingFormat {
template <typename FormatSink>
friend void AbslStringify(FormatSink& sink,
const PointStringifyUsingFormat& p) {
absl::Format(&sink, "(%g, %g)", p.x, p.y);
}
double x = 10.0;
double y = 20.0;
};
TEST_F(FormatExtensionTest, AbslStringifyExampleUsingFormat) {
PointStringifyUsingFormat p;
EXPECT_EQ(absl::StrFormat("a %v z", p), "a (10, 20) z");
}
} // namespace } // namespace
// Some codegen thunks that we can use to easily dump the generated assembly for // Some codegen thunks that we can use to easily dump the generated assembly for
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment