From 949f5460fb8ab73512b7f721cee99440fa956e56 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 8 Dec 2022 08:08:08 -0500 Subject: [PATCH] AK: Add formatters for Span and Span This generalizes the formatter currently used for Vector to be usable for any Span. --- AK/Format.h | 27 +++++++++++++++++++++++---- Tests/AK/TestFormat.cpp | 19 +++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/AK/Format.h b/AK/Format.h index b493b3c557..48682c2dbe 100644 --- a/AK/Format.h +++ b/AK/Format.h @@ -329,15 +329,16 @@ struct Formatter : StandardFormatter { ErrorOr format(FormatBuilder&, StringView); }; -template -requires(HasFormatter) struct Formatter> : StandardFormatter { - +template +requires(HasFormatter) +struct Formatter> : StandardFormatter { Formatter() = default; explicit Formatter(StandardFormatter formatter) : StandardFormatter(move(formatter)) { } - ErrorOr format(FormatBuilder& builder, Vector value) + + ErrorOr format(FormatBuilder& builder, Span value) { if (m_mode == Mode::Pointer) { Formatter formatter { *this }; @@ -375,6 +376,24 @@ requires(HasFormatter) struct Formatter> : Standar } }; +template +requires(HasFormatter) +struct Formatter> : Formatter> { + ErrorOr format(FormatBuilder& builder, Span value) + { + return Formatter>::format(builder, value); + } +}; + +template +requires(HasFormatter) +struct Formatter> : Formatter> { + ErrorOr format(FormatBuilder& builder, Vector const& value) + { + return Formatter>::format(builder, value.span()); + } +}; + template<> struct Formatter : Formatter { ErrorOr format(FormatBuilder& builder, ReadonlyBytes value) diff --git a/Tests/AK/TestFormat.cpp b/Tests/AK/TestFormat.cpp index f5245e2d4a..0d45b3b31a 100644 --- a/Tests/AK/TestFormat.cpp +++ b/Tests/AK/TestFormat.cpp @@ -316,6 +316,25 @@ TEST_CASE(hex_dump) EXPECT_EQ(DeprecatedString::formatted("{:*>4hex-dump}", "0000"), "30303030****0000"); } +TEST_CASE(span_format) +{ + { + Vector v { 1, 2, 3, 4 }; + EXPECT_EQ(DeprecatedString::formatted("{}", v.span()), "[ 1, 2, 3, 4 ]"); + EXPECT_EQ(DeprecatedString::formatted("{}", const_cast&>(v).span()), "[ 1, 2, 3, 4 ]"); + } + { + Vector v { "1"sv, "2"sv, "3"sv, "4"sv }; + EXPECT_EQ(DeprecatedString::formatted("{}", v.span()), "[ 1, 2, 3, 4 ]"); + EXPECT_EQ(DeprecatedString::formatted("{}", const_cast&>(v).span()), "[ 1, 2, 3, 4 ]"); + } + { + Vector> v { { "1"sv, "2"sv }, { "3"sv, "4"sv } }; + EXPECT_EQ(DeprecatedString::formatted("{}", v.span()), "[ [ 1, 2 ], [ 3, 4 ] ]"); + EXPECT_EQ(DeprecatedString::formatted("{}", const_cast&>(v).span()), "[ [ 1, 2 ], [ 3, 4 ] ]"); + } +} + TEST_CASE(vector_format) { {