mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:42:44 +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
					
				
					 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) 2018-2022, Andreas Kling <kling@serenityos.org> | ||||||
|  |  * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org> | ||||||
|  * |  * | ||||||
|  * SPDX-License-Identifier: BSD-2-Clause |  * SPDX-License-Identifier: BSD-2-Clause | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include <AK/CharacterTypes.h> | ||||||
| #include <AK/Concepts.h> | #include <AK/Concepts.h> | ||||||
| #include <AK/Format.h> | #include <AK/Format.h> | ||||||
| #include <AK/Forward.h> | #include <AK/Forward.h> | ||||||
|  | @ -16,6 +18,7 @@ | ||||||
| #include <AK/StringView.h> | #include <AK/StringView.h> | ||||||
| #include <AK/Traits.h> | #include <AK/Traits.h> | ||||||
| #include <AK/Types.h> | #include <AK/Types.h> | ||||||
|  | #include <AK/UnicodeUtils.h> | ||||||
| #include <AK/Vector.h> | #include <AK/Vector.h> | ||||||
| 
 | 
 | ||||||
| namespace AK { | namespace AK { | ||||||
|  | @ -74,6 +77,22 @@ public: | ||||||
|         return String { short_string }; |         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.
 |     // 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_lowercase(Optional<StringView> const& locale = {}) const; | ||||||
|     ErrorOr<String> to_uppercase(Optional<StringView> const& locale = {}) const; |     ErrorOr<String> to_uppercase(Optional<StringView> const& locale = {}) const; | ||||||
|  |  | ||||||
|  | @ -4,9 +4,12 @@ | ||||||
|  * SPDX-License-Identifier: BSD-2-Clause |  * 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 <LibTest/TestCase.h> | ||||||
| 
 | 
 | ||||||
| #include <AK/String.h> |  | ||||||
| #include <AK/StringBuilder.h> | #include <AK/StringBuilder.h> | ||||||
| #include <AK/Try.h> | #include <AK/Try.h> | ||||||
| #include <AK/Utf8View.h> | #include <AK/Utf8View.h> | ||||||
|  | @ -64,6 +67,26 @@ TEST_CASE(long_strings) | ||||||
|     EXPECT_EQ(string.bytes_as_string_view(), "abcdefgh"sv); |     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) | TEST_CASE(substring) | ||||||
| { | { | ||||||
|     auto superstring = MUST(String::from_utf8("Hello I am a long string"sv)); |     auto superstring = MUST(String::from_utf8("Hello I am a long string"sv)); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy Flynn
						Timothy Flynn