Commit 9398fa76 by Abseil Team Committed by Copybara-Service

Adds support for "%v" in absl::StrFormat and related functions for bool values.…

Adds support for "%v" in absl::StrFormat and related functions for bool values. Note that %v prints bool values as "true" and "false" rather than "1" and "0".

PiperOrigin-RevId: 475651689
Change-Id: I24b3749d85b5bb7cbc18653d629271a8b2b07d08
parent d54fd91c
...@@ -344,7 +344,7 @@ bool ConvertIntArg(T v, FormatConversionSpecImpl conv, FormatSinkImpl *sink) { ...@@ -344,7 +344,7 @@ bool ConvertIntArg(T v, FormatConversionSpecImpl conv, FormatSinkImpl *sink) {
return ConvertFloatImpl(static_cast<double>(v), conv, sink); return ConvertFloatImpl(static_cast<double>(v), conv, sink);
default: default:
ABSL_ASSUME(false); ABSL_ASSUME(false);
} }
if (conv.is_basic()) { if (conv.is_basic()) {
...@@ -376,6 +376,15 @@ inline bool ConvertStringArg(string_view v, const FormatConversionSpecImpl conv, ...@@ -376,6 +376,15 @@ inline bool ConvertStringArg(string_view v, const FormatConversionSpecImpl conv,
} // namespace } // namespace
bool ConvertBoolArg(bool v, FormatSinkImpl *sink) {
if (v) {
sink->Append("true");
} else {
sink->Append("false");
}
return true;
}
// ==================== Strings ==================== // ==================== Strings ====================
StringConvertResult FormatConvertImpl(const std::string &v, StringConvertResult FormatConvertImpl(const std::string &v,
const FormatConversionSpecImpl conv, const FormatConversionSpecImpl conv,
......
...@@ -186,6 +186,8 @@ using CharConvertResult = ArgConvertResult<FormatConversionCharSetUnion( ...@@ -186,6 +186,8 @@ using CharConvertResult = ArgConvertResult<FormatConversionCharSetUnion(
FormatConversionCharSetInternal::kNumeric, FormatConversionCharSetInternal::kNumeric,
FormatConversionCharSetInternal::kStar)>; FormatConversionCharSetInternal::kStar)>;
bool ConvertBoolArg(bool v, FormatSinkImpl* sink);
// Floats. // Floats.
FloatingConvertResult FormatConvertImpl(float v, FormatConversionSpecImpl conv, FloatingConvertResult FormatConvertImpl(float v, FormatConversionSpecImpl conv,
FormatSinkImpl* sink); FormatSinkImpl* sink);
...@@ -234,9 +236,16 @@ IntegralConvertResult FormatConvertImpl(int128 v, FormatConversionSpecImpl conv, ...@@ -234,9 +236,16 @@ IntegralConvertResult FormatConvertImpl(int128 v, FormatConversionSpecImpl conv,
IntegralConvertResult FormatConvertImpl(uint128 v, IntegralConvertResult FormatConvertImpl(uint128 v,
FormatConversionSpecImpl conv, FormatConversionSpecImpl conv,
FormatSinkImpl* sink); FormatSinkImpl* sink);
// This function needs to be a template due to ambiguity regarding type
// conversions.
template <typename T, enable_if_t<std::is_same<T, bool>::value, int> = 0> template <typename T, enable_if_t<std::is_same<T, bool>::value, int> = 0>
IntegralConvertResult FormatConvertImpl(T v, FormatConversionSpecImpl conv, IntegralConvertResult FormatConvertImpl(T v, FormatConversionSpecImpl conv,
FormatSinkImpl* sink) { FormatSinkImpl* sink) {
if (conv.conversion_char() == FormatConversionCharInternal::v) {
return {ConvertBoolArg(v, sink)};
}
return FormatConvertImpl(static_cast<int>(v), conv, sink); return FormatConvertImpl(static_cast<int>(v), conv, sink);
} }
......
...@@ -265,7 +265,7 @@ TEST_F(FormatEntryPointTest, Stream) { ...@@ -265,7 +265,7 @@ TEST_F(FormatEntryPointTest, Stream) {
std::ostringstream oss; std::ostringstream oss;
oss << StreamFormat(*parsed, 123, 3, 49, "multistreaming!!!", 1.01, 1.01); oss << StreamFormat(*parsed, 123, 3, 49, "multistreaming!!!", 1.01, 1.01);
int fmt_result = snprintf(&*buf.begin(), buf.size(), fmt.c_str(), // int fmt_result = snprintf(&*buf.begin(), buf.size(), fmt.c_str(), //
123, 3, 49, "multistreaming!!!", 1.01, 1.01); 123, 3, 49, "multistreaming!!!", 1.01, 1.01);
ASSERT_TRUE(oss) << fmt; ASSERT_TRUE(oss) << fmt;
ASSERT_TRUE(fmt_result >= 0 && static_cast<size_t>(fmt_result) < buf.size()) ASSERT_TRUE(fmt_result >= 0 && static_cast<size_t>(fmt_result) < buf.size())
<< fmt_result; << fmt_result;
...@@ -644,6 +644,11 @@ TEST(StrFormat, BehavesAsDocumented) { ...@@ -644,6 +644,11 @@ TEST(StrFormat, BehavesAsDocumented) {
EXPECT_EQ(StrFormat("%zd", int{1}), "1"); EXPECT_EQ(StrFormat("%zd", int{1}), "1");
EXPECT_EQ(StrFormat("%td", int{1}), "1"); EXPECT_EQ(StrFormat("%td", int{1}), "1");
EXPECT_EQ(StrFormat("%qd", int{1}), "1"); EXPECT_EQ(StrFormat("%qd", int{1}), "1");
// Bool is handled correctly depending on whether %v is used
EXPECT_EQ(StrFormat("%v", true), "true");
EXPECT_EQ(StrFormat("%v", false), "false");
EXPECT_EQ(StrFormat("%d", true), "1");
} }
using str_format_internal::ExtendedParsedFormat; using str_format_internal::ExtendedParsedFormat;
......
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