diff --git a/AK/HashTable.h b/AK/HashTable.h index acfddf9b58..5d55c4f9cf 100644 --- a/AK/HashTable.h +++ b/AK/HashTable.h @@ -110,7 +110,8 @@ public: HashTable& operator=(HashTable&& other) noexcept { - swap(*this, other); + HashTable temporary { move(other) }; + swap(*this, temporary); return *this; } diff --git a/Tests/AK/TestHashTable.cpp b/Tests/AK/TestHashTable.cpp index 55c297e774..9729eac9a3 100644 --- a/Tests/AK/TestHashTable.cpp +++ b/Tests/AK/TestHashTable.cpp @@ -16,6 +16,31 @@ TEST_CASE(construct) EXPECT_EQ(IntTable().size(), 0u); } +TEST_CASE(basic_move) +{ + HashTable foo; + foo.set(1); + EXPECT_EQ(foo.size(), 1u); + auto bar = move(foo); + EXPECT_EQ(bar.size(), 1u); + EXPECT_EQ(foo.size(), 0u); + foo = move(bar); + EXPECT_EQ(bar.size(), 0u); + EXPECT_EQ(foo.size(), 1u); +} + +TEST_CASE(move_is_not_swap) +{ + HashTable foo; + foo.set(1); + HashTable bar; + bar.set(2); + foo = move(bar); + EXPECT(foo.contains(2)); + EXPECT(!bar.contains(1)); + EXPECT_EQ(bar.size(), 0u); +} + TEST_CASE(populate) { HashTable strings;