mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-21 23:20:20 +00:00
AK: Add a String factory to create a string from a single code point
This commit is contained in:
parent
8aca8e82cb
commit
12c8bc3e85
Notes:
sideshowbarker
2024-07-17 03:27:40 +09:00
Author: https://github.com/trflynn89 Commit: https://github.com/SerenityOS/serenity/commit/12c8bc3e85 Pull-request: https://github.com/SerenityOS/serenity/pull/17122 Reviewed-by: https://github.com/Hendiadyoin1 Reviewed-by: https://github.com/nico
2 changed files with 43 additions and 1 deletions
19
AK/String.h
19
AK/String.h
|
@ -1,11 +1,13 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org>
|
||||
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/CharacterTypes.h>
|
||||
#include <AK/Concepts.h>
|
||||
#include <AK/Format.h>
|
||||
#include <AK/Forward.h>
|
||||
|
@ -16,6 +18,7 @@
|
|||
#include <AK/StringView.h>
|
||||
#include <AK/Traits.h>
|
||||
#include <AK/Types.h>
|
||||
#include <AK/UnicodeUtils.h>
|
||||
#include <AK/Vector.h>
|
||||
|
||||
namespace AK {
|
||||
|
@ -74,6 +77,22 @@ public:
|
|||
return String { short_string };
|
||||
}
|
||||
|
||||
// Creates a new String from a single code point.
|
||||
static constexpr String from_code_point(u32 code_point)
|
||||
{
|
||||
VERIFY(is_unicode(code_point));
|
||||
|
||||
ShortString short_string;
|
||||
size_t i = 0;
|
||||
|
||||
auto length = UnicodeUtils::code_point_to_utf8(code_point, [&](auto byte) {
|
||||
short_string.storage[i++] = static_cast<u8>(byte);
|
||||
});
|
||||
short_string.byte_count_and_short_string_flag = (length << 1) | SHORT_STRING_FLAG;
|
||||
|
||||
return String { short_string };
|
||||
}
|
||||
|
||||
// Creates a new String by case-transforming this String. Using these methods require linking LibUnicode into your application.
|
||||
ErrorOr<String> to_lowercase(Optional<StringView> const& locale = {}) const;
|
||||
ErrorOr<String> to_uppercase(Optional<StringView> const& locale = {}) const;
|
||||
|
|
|
@ -4,9 +4,12 @@
|
|||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
// This is included first on purpose. We specifically do not want LibTest to override VERIFY here so
|
||||
// that we can actually test that some String factory methods cause a crash with invalid input.
|
||||
#include <AK/String.h>
|
||||
|
||||
#include <LibTest/TestCase.h>
|
||||
|
||||
#include <AK/String.h>
|
||||
#include <AK/StringBuilder.h>
|
||||
#include <AK/Try.h>
|
||||
#include <AK/Utf8View.h>
|
||||
|
@ -64,6 +67,26 @@ TEST_CASE(long_strings)
|
|||
EXPECT_EQ(string.bytes_as_string_view(), "abcdefgh"sv);
|
||||
}
|
||||
|
||||
TEST_CASE(from_code_points)
|
||||
{
|
||||
for (u32 code_point = 0; code_point < 0x80; ++code_point) {
|
||||
auto string = String::from_code_point(code_point);
|
||||
|
||||
auto ch = static_cast<char>(code_point);
|
||||
StringView view { &ch, 1 };
|
||||
|
||||
EXPECT_EQ(string, view);
|
||||
}
|
||||
|
||||
auto string = String::from_code_point(0x10ffff);
|
||||
EXPECT_EQ(string, "\xF4\x8F\xBF\xBF"sv);
|
||||
|
||||
EXPECT_CRASH("Creating a string from an invalid code point", [] {
|
||||
String::from_code_point(0xffffffff);
|
||||
return Test::Crash::Failure::DidNotCrash;
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE(substring)
|
||||
{
|
||||
auto superstring = MUST(String::from_utf8("Hello I am a long string"sv));
|
||||
|
|
Loading…
Reference in a new issue