// Copyright 2018 The Abseil Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef THIS_HASH_SET #define THIS_HASH_SET node_hash_set #define THIS_TEST_NAME NodeHashSet #endif #include "parallel_hashmap/phmap.h" #include "unordered_set_constructor_test.h" #include "unordered_set_lookup_test.h" #include "unordered_set_members_test.h" #include "unordered_set_modifiers_test.h" namespace phmap { namespace priv { namespace { using ::phmap::priv::hash_internal::Enum; using ::phmap::priv::hash_internal::EnumClass; using ::testing::Pointee; using ::testing::UnorderedElementsAre; using SetTypes = ::testing::Types< THIS_HASH_SET>, THIS_HASH_SET>, THIS_HASH_SET>, THIS_HASH_SET>>; INSTANTIATE_TYPED_TEST_SUITE_P(THIS_TEST_NAME, ConstructorTest, SetTypes); INSTANTIATE_TYPED_TEST_SUITE_P(THIS_TEST_NAME, LookupTest, SetTypes); INSTANTIATE_TYPED_TEST_SUITE_P(THIS_TEST_NAME, MembersTest, SetTypes); INSTANTIATE_TYPED_TEST_SUITE_P(THIS_TEST_NAME, ModifiersTest, SetTypes); TEST(THIS_TEST_NAME, MoveableNotCopyableCompiles) { THIS_HASH_SET> t; THIS_HASH_SET> u; u = std::move(t); } TEST(THIS_TEST_NAME, MergeExtractInsert) { struct Hash { size_t operator()(const std::unique_ptr& p) const { return *p; } }; struct Eq { bool operator()(const std::unique_ptr& a, const std::unique_ptr& b) const { return *a == *b; } }; phmap::THIS_HASH_SET, Hash, Eq> set1, set2; set1.insert(phmap::make_unique(7)); set1.insert(phmap::make_unique(17)); set2.insert(phmap::make_unique(7)); set2.insert(phmap::make_unique(19)); EXPECT_THAT(set1, UnorderedElementsAre(Pointee(7), Pointee(17))); EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7), Pointee(19))); set1.merge(set2); EXPECT_THAT(set1, UnorderedElementsAre(Pointee(7), Pointee(17), Pointee(19))); EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7))); auto node = set1.extract(phmap::make_unique(7)); EXPECT_TRUE(node); EXPECT_THAT(node.value(), Pointee(7)); EXPECT_THAT(set1, UnorderedElementsAre(Pointee(17), Pointee(19))); auto insert_result = set2.insert(std::move(node)); EXPECT_FALSE(node); EXPECT_FALSE(insert_result.inserted); EXPECT_TRUE(insert_result.node); EXPECT_THAT(insert_result.node.value(), Pointee(7)); EXPECT_EQ(**insert_result.position, 7); EXPECT_NE(insert_result.position->get(), insert_result.node.value().get()); EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7))); node = set1.extract(phmap::make_unique(17)); EXPECT_TRUE(node); EXPECT_THAT(node.value(), Pointee(17)); EXPECT_THAT(set1, UnorderedElementsAre(Pointee(19))); node.value() = phmap::make_unique(23); insert_result = set2.insert(std::move(node)); EXPECT_FALSE(node); EXPECT_TRUE(insert_result.inserted); EXPECT_FALSE(insert_result.node); EXPECT_EQ(**insert_result.position, 23); EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7), Pointee(23))); } } // namespace } // namespace priv } // namespace phmap