diff --git a/AK/String.cpp b/AK/String.cpp index c5e6f7965c6..a74dec2c41c 100644 --- a/AK/String.cpp +++ b/AK/String.cpp @@ -388,6 +388,11 @@ String String::to_titlecase() const return StringUtils::to_titlecase(*this); } +String String::invert_case() const +{ + return StringUtils::invert_case(*this); +} + bool operator<(char const* characters, String const& string) { return string.view() > characters; diff --git a/AK/String.h b/AK/String.h index 674cfdb6cb3..2c73bdc838f 100644 --- a/AK/String.h +++ b/AK/String.h @@ -121,6 +121,7 @@ public: [[nodiscard]] String to_uppercase() const; [[nodiscard]] String to_snakecase() const; [[nodiscard]] String to_titlecase() const; + [[nodiscard]] String invert_case() const; [[nodiscard]] bool is_whitespace() const { return StringUtils::is_whitespace(*this); } diff --git a/AK/StringUtils.cpp b/AK/StringUtils.cpp index 2c66ec68d5c..8e7a4bc6461 100644 --- a/AK/StringUtils.cpp +++ b/AK/StringUtils.cpp @@ -462,6 +462,20 @@ String to_titlecase(StringView str) return builder.to_string(); } +String invert_case(StringView str) +{ + StringBuilder builder(str.length()); + + for (auto ch : str) { + if (is_ascii_lower_alpha(ch)) + builder.append(to_ascii_uppercase(ch)); + else + builder.append(to_ascii_lowercase(ch)); + } + + return builder.to_string(); +} + String replace(StringView str, StringView needle, StringView replacement, bool all_occurrences) { if (str.is_empty()) diff --git a/AK/StringUtils.h b/AK/StringUtils.h index 9ba0012041a..0e8470b4d55 100644 --- a/AK/StringUtils.h +++ b/AK/StringUtils.h @@ -78,6 +78,7 @@ Optional find_any_of(StringView haystack, StringView needles, SearchDire String to_snakecase(StringView); String to_titlecase(StringView); +String invert_case(StringView); String replace(StringView, StringView needle, StringView replacement, bool all_occurrences = false); size_t count(StringView, StringView needle);