From bd9b65e82f03ec2bd2d96180c3352e9966be49bc Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sat, 14 Jan 2023 09:59:18 -0500 Subject: [PATCH] AK: Add String::is_one_of for variadic string comparison --- AK/String.h | 6 ++++++ Tests/AK/TestString.cpp | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/AK/String.h b/AK/String.h index 7e8af38f63..54b3996e31 100644 --- a/AK/String.h +++ b/AK/String.h @@ -86,6 +86,12 @@ public: // NOTE: UTF-8 is defined in a way that lexicographic ordering of code points is equivalent to lexicographic ordering of bytes. [[nodiscard]] int operator<=>(String const& other) const { return this->bytes_as_string_view().compare(other.bytes_as_string_view()); } + template + [[nodiscard]] ALWAYS_INLINE constexpr bool is_one_of(Ts&&... strings) const + { + return (this->operator==(forward(strings)) || ...); + } + [[nodiscard]] u32 hash() const; template diff --git a/Tests/AK/TestString.cpp b/Tests/AK/TestString.cpp index 966764b941..727b30190e 100644 --- a/Tests/AK/TestString.cpp +++ b/Tests/AK/TestString.cpp @@ -162,3 +162,19 @@ TEST_CASE(to_uppercase) EXPECT_EQ(result, "ʼN"sv); } } + +TEST_CASE(is_one_of) +{ + auto foo = MUST(String::from_utf8("foo"sv)); + auto bar = MUST(String::from_utf8("bar"sv)); + + EXPECT(foo.is_one_of(foo)); + EXPECT(foo.is_one_of(foo, bar)); + EXPECT(foo.is_one_of(bar, foo)); + EXPECT(!foo.is_one_of(bar)); + + EXPECT(!bar.is_one_of("foo"sv)); + EXPECT(bar.is_one_of("foo"sv, "bar"sv)); + EXPECT(bar.is_one_of("bar"sv, "foo"sv)); + EXPECT(bar.is_one_of("bar"sv)); +}