String.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*
  2. * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/String.h>
  7. #include <AK/StringBuilder.h>
  8. #include <LibUnicode/UnicodeUtils.h>
  9. // This file contains definitions of AK::String methods which require UCD data.
  10. namespace AK {
  11. ErrorOr<String> String::to_lowercase(Optional<StringView> const& locale) const
  12. {
  13. StringBuilder builder;
  14. TRY(Unicode::Detail::build_lowercase_string(code_points(), builder, locale));
  15. return builder.to_string();
  16. }
  17. ErrorOr<String> String::to_uppercase(Optional<StringView> const& locale) const
  18. {
  19. StringBuilder builder;
  20. TRY(Unicode::Detail::build_uppercase_string(code_points(), builder, locale));
  21. return builder.to_string();
  22. }
  23. ErrorOr<String> String::to_titlecase(Optional<StringView> const& locale) const
  24. {
  25. StringBuilder builder;
  26. TRY(Unicode::Detail::build_titlecase_string(code_points(), builder, locale));
  27. return builder.to_string();
  28. }
  29. ErrorOr<String> String::to_casefold() const
  30. {
  31. StringBuilder builder;
  32. TRY(Unicode::Detail::build_casefold_string(code_points(), builder));
  33. return builder.to_string();
  34. }
  35. // https://www.unicode.org/versions/Unicode15.0.0/ch03.pdf#G34145
  36. ErrorOr<bool> String::equals_ignoring_case(String const& other) const
  37. {
  38. // A string X is a caseless match for a string Y if and only if:
  39. // toCasefold(X) = toCasefold(Y)
  40. return TRY(to_casefold()) == TRY(other.to_casefold());
  41. }
  42. }