From 64218990782c8eac000ca087b59e9b1224fd9780 Mon Sep 17 00:00:00 2001 From: Ben Wiederhake Date: Sat, 13 May 2023 20:25:22 +0200 Subject: [PATCH] AK: Rewrite HashMap::clone signature with template-args and const --- AK/HashMap.h | 5 +-- Tests/AK/TestHashMap.cpp | 76 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/AK/HashMap.h b/AK/HashMap.h index 429c2a7953..0baa5fe779 100644 --- a/AK/HashMap.h +++ b/AK/HashMap.h @@ -281,9 +281,10 @@ public: return hash; } - ErrorOr> clone() + template + ErrorOr> clone() const { - HashMap hash_map_clone; + HashMap hash_map_clone; for (auto& it : *this) TRY(hash_map_clone.try_set(it.key, it.value)); return hash_map_clone; diff --git a/Tests/AK/TestHashMap.cpp b/Tests/AK/TestHashMap.cpp index b16534d625..cd7d911d69 100644 --- a/Tests/AK/TestHashMap.cpp +++ b/Tests/AK/TestHashMap.cpp @@ -251,3 +251,79 @@ TEST_CASE(take) baz = map.take("baz"_short_string); EXPECT(!baz.has_value()); } + +TEST_CASE(clone_same_template_args) +{ + HashMap orig; + orig.set(1, 10); + orig.set(2, 20); + orig.set(3, 30); + EXPECT_EQ(orig.size(), static_cast(3)); + EXPECT_EQ(orig.get(2), Optional(20)); + + auto second = TRY_OR_FAIL(orig.clone()); + + EXPECT_EQ(orig.size(), static_cast(3)); + EXPECT_EQ(orig.get(2), Optional(20)); + EXPECT_EQ(second.size(), static_cast(3)); + EXPECT_EQ(second.get(2), Optional(20)); +} + +TEST_CASE(clone_different_traits) +{ + HashMap orig; + orig.set("Well"sv, "hello friends!"sv); + orig.set("Thank"sv, "you, very cool!"sv); + EXPECT_EQ(orig.size(), static_cast(2)); + EXPECT_EQ(orig.get("Well"sv), Optional("hello friends!"sv)); + EXPECT_EQ(orig.get("weLL"sv), Optional()); + + auto second = TRY_OR_FAIL(orig.clone()); + + EXPECT_EQ(orig.size(), static_cast(2)); + EXPECT_EQ(orig.get("Well"sv), Optional("hello friends!"sv)); + EXPECT_EQ(orig.get("weLL"sv), Optional()); + EXPECT_EQ(second.size(), static_cast(2)); + EXPECT_EQ(second.get("Well"sv), Optional("hello friends!"sv)); + EXPECT_EQ(second.get("weLL"sv), Optional("hello friends!"sv)); +} + +TEST_CASE(move_construct) +{ + HashMap orig; + orig.set(1, 10); + orig.set(2, 20); + orig.set(3, 30); + EXPECT_EQ(orig.size(), static_cast(3)); + EXPECT_EQ(orig.get(2), Optional(20)); + + HashMap second = move(orig); + + EXPECT_EQ(orig.size(), static_cast(0)); + EXPECT_EQ(orig.get(2), Optional()); + EXPECT_EQ(second.size(), static_cast(3)); + EXPECT_EQ(second.get(2), Optional(20)); +} + +TEST_CASE(move_assign) +{ + HashMap orig; + HashMap second; + orig.set(1, 10); + orig.set(2, 20); + orig.set(3, 30); + + EXPECT_EQ(orig.size(), static_cast(3)); + EXPECT_EQ(orig.get(2), Optional(20)); + EXPECT_EQ(second.size(), static_cast(0)); + EXPECT_EQ(second.get(2), Optional()); + + // 'Hashtable::operator=(Hashtable&&)' allocates temporarily an empty table, + // so we can't use NoAllocationGuard here. :( + second = move(orig); + + EXPECT_EQ(orig.size(), static_cast(0)); + EXPECT_EQ(orig.get(2), Optional()); + EXPECT_EQ(second.size(), static_cast(3)); + EXPECT_EQ(second.get(2), Optional(20)); +}