mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-25 02:38:59 +00:00
AK: Add template specializations for Optional<{,Fly}String>
Slice the size of `Optional<{,Fly}String>` in half by introducing `UINTPTR_MAX` as an invalid bit pattern for these values.
This commit is contained in:
parent
fcdf3014f1
commit
2457118024
Notes:
github-actions[bot]
2024-10-31 22:27:23 +00:00
Author: https://github.com/yyny
Commit: 2457118024
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2032
Reviewed-by: https://github.com/Hendiadyoin1
Reviewed-by: https://github.com/awesomekling
8 changed files with 427 additions and 2 deletions
|
@ -8,7 +8,9 @@
|
|||
#include <LibTest/TestCase.h>
|
||||
|
||||
#include <AK/ByteString.h>
|
||||
#include <AK/FlyString.h>
|
||||
#include <AK/Optional.h>
|
||||
#include <AK/String.h>
|
||||
#include <AK/Vector.h>
|
||||
|
||||
TEST_CASE(basic_optional)
|
||||
|
@ -269,3 +271,173 @@ TEST_CASE(comparison_reference)
|
|||
EXPECT_EQ(opt1, opt2);
|
||||
EXPECT_NE(opt1, opt3);
|
||||
}
|
||||
|
||||
TEST_CASE(string_specialization)
|
||||
{
|
||||
EXPECT_EQ(sizeof(Optional<String>), sizeof(String));
|
||||
|
||||
{
|
||||
Optional<String> foo;
|
||||
|
||||
EXPECT(!foo.has_value());
|
||||
|
||||
foo = "long_enough_to_be_allocated"_string;
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<String> foo = "initial_value"_string;
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "initial_value"sv);
|
||||
|
||||
foo = "long_enough_to_be_allocated"_string;
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<String> foo;
|
||||
|
||||
EXPECT(!foo.has_value());
|
||||
|
||||
String bar = "long_enough_to_be_allocated"_string;
|
||||
foo = bar;
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<String> foo;
|
||||
|
||||
EXPECT(!foo.has_value());
|
||||
|
||||
Optional<String> bar = "long_enough_to_be_allocated"_string;
|
||||
foo = bar;
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
EXPECT(bar.has_value());
|
||||
EXPECT_EQ(bar.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<String> foo;
|
||||
|
||||
EXPECT(!foo.has_value());
|
||||
|
||||
foo = Optional<String> { "long_enough_to_be_allocated"_string };
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<String> foo = "long_enough_to_be_allocated"_string;
|
||||
|
||||
EXPECT_EQ(foo.value_or("fallback_value"_string), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<String> foo;
|
||||
|
||||
EXPECT_EQ(foo.value_or("fallback_value"_string), "fallback_value"sv);
|
||||
}
|
||||
|
||||
{
|
||||
EXPECT_EQ((Optional<String> { "long_enough_to_be_allocated"_string }).value_or("fallback_value"_string), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
EXPECT_EQ((Optional<String> {}).value_or("fallback_value"_string), "fallback_value"sv);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE(flystring_specialization)
|
||||
{
|
||||
EXPECT_EQ(sizeof(Optional<FlyString>), sizeof(FlyString));
|
||||
|
||||
{
|
||||
Optional<FlyString> foo;
|
||||
|
||||
EXPECT(!foo.has_value());
|
||||
|
||||
foo = "long_enough_to_be_allocated"_fly_string;
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<FlyString> foo = "initial_value"_fly_string;
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "initial_value"sv);
|
||||
|
||||
foo = "long_enough_to_be_allocated"_fly_string;
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<FlyString> foo;
|
||||
|
||||
EXPECT(!foo.has_value());
|
||||
|
||||
FlyString bar = "long_enough_to_be_allocated"_fly_string;
|
||||
foo = bar;
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<FlyString> foo;
|
||||
|
||||
EXPECT(!foo.has_value());
|
||||
|
||||
Optional<FlyString> bar = "long_enough_to_be_allocated"_fly_string;
|
||||
foo = bar;
|
||||
|
||||
EXPECT(bar.has_value());
|
||||
EXPECT_EQ(bar.value(), "long_enough_to_be_allocated"sv);
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<FlyString> foo;
|
||||
|
||||
EXPECT(!foo.has_value());
|
||||
|
||||
foo = Optional<FlyString> { "long_enough_to_be_allocated"_fly_string };
|
||||
|
||||
EXPECT(foo.has_value());
|
||||
EXPECT_EQ(foo.value(), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<FlyString> foo = "long_enough_to_be_allocated"_fly_string;
|
||||
|
||||
EXPECT_EQ(foo.value_or("fallback_value"_fly_string), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
Optional<FlyString> foo;
|
||||
|
||||
EXPECT_EQ(foo.value_or("fallback_value"_fly_string), "fallback_value"sv);
|
||||
}
|
||||
|
||||
{
|
||||
EXPECT_EQ((Optional<FlyString> { "long_enough_to_be_allocated"_fly_string }).value_or("fallback_value"_fly_string), "long_enough_to_be_allocated"sv);
|
||||
}
|
||||
|
||||
{
|
||||
EXPECT_EQ((Optional<FlyString> {}).value_or("fallback_value"_fly_string), "fallback_value"sv);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue