-- 4eacae3ff1b14b1d309e8092185bc10e8a6203cf by Derek Mauro <dmauro@google.com>: Release SwissTable - a fast, efficient, cache-friendly hash table. https://www.youtube.com/watch?v=ncHmEUmJZf4 PiperOrigin-RevId: 214816527 -- df8c3dfab3cfb2f4365909a84d0683b193cfbb11 by Derek Mauro <dmauro@google.com>: Internal change PiperOrigin-RevId: 214785288 -- 1eabd5266bbcebc33eecc91e5309b751856a75c8 by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 214722931 -- 2ebbfac950f83146b46253038e7dd7dcde9f2951 by Derek Mauro <dmauro@google.com>: Internal change PiperOrigin-RevId: 214701684 GitOrigin-RevId: 4eacae3ff1b14b1d309e8092185bc10e8a6203cf Change-Id: I9ba64e395b22ad7863213d157b8019b082adc19d
		
			
				
	
	
		
			103 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// 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
 | 
						|
//
 | 
						|
//      http://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.
 | 
						|
 | 
						|
#include "absl/container/node_hash_set.h"
 | 
						|
 | 
						|
#include "absl/container/internal/unordered_set_constructor_test.h"
 | 
						|
#include "absl/container/internal/unordered_set_lookup_test.h"
 | 
						|
#include "absl/container/internal/unordered_set_modifiers_test.h"
 | 
						|
 | 
						|
namespace absl {
 | 
						|
namespace container_internal {
 | 
						|
namespace {
 | 
						|
using ::absl::container_internal::hash_internal::Enum;
 | 
						|
using ::absl::container_internal::hash_internal::EnumClass;
 | 
						|
using ::testing::Pointee;
 | 
						|
using ::testing::UnorderedElementsAre;
 | 
						|
 | 
						|
using SetTypes = ::testing::Types<
 | 
						|
    node_hash_set<int, StatefulTestingHash, StatefulTestingEqual, Alloc<int>>,
 | 
						|
    node_hash_set<std::string, StatefulTestingHash, StatefulTestingEqual,
 | 
						|
                  Alloc<int>>,
 | 
						|
    node_hash_set<Enum, StatefulTestingHash, StatefulTestingEqual, Alloc<Enum>>,
 | 
						|
    node_hash_set<EnumClass, StatefulTestingHash, StatefulTestingEqual,
 | 
						|
                  Alloc<EnumClass>>>;
 | 
						|
 | 
						|
INSTANTIATE_TYPED_TEST_CASE_P(NodeHashSet, ConstructorTest, SetTypes);
 | 
						|
INSTANTIATE_TYPED_TEST_CASE_P(NodeHashSet, LookupTest, SetTypes);
 | 
						|
INSTANTIATE_TYPED_TEST_CASE_P(NodeHashSet, ModifiersTest, SetTypes);
 | 
						|
 | 
						|
TEST(NodeHashSet, MoveableNotCopyableCompiles) {
 | 
						|
  node_hash_set<std::unique_ptr<void*>> t;
 | 
						|
  node_hash_set<std::unique_ptr<void*>> u;
 | 
						|
  u = std::move(t);
 | 
						|
}
 | 
						|
 | 
						|
TEST(NodeHashSet, MergeExtractInsert) {
 | 
						|
  struct Hash {
 | 
						|
    size_t operator()(const std::unique_ptr<int>& p) const { return *p; }
 | 
						|
  };
 | 
						|
  struct Eq {
 | 
						|
    bool operator()(const std::unique_ptr<int>& a,
 | 
						|
                    const std::unique_ptr<int>& b) const {
 | 
						|
      return *a == *b;
 | 
						|
    }
 | 
						|
  };
 | 
						|
  absl::node_hash_set<std::unique_ptr<int>, Hash, Eq> set1, set2;
 | 
						|
  set1.insert(absl::make_unique<int>(7));
 | 
						|
  set1.insert(absl::make_unique<int>(17));
 | 
						|
 | 
						|
  set2.insert(absl::make_unique<int>(7));
 | 
						|
  set2.insert(absl::make_unique<int>(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(absl::make_unique<int>(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(absl::make_unique<int>(17));
 | 
						|
  EXPECT_TRUE(node);
 | 
						|
  EXPECT_THAT(node.value(), Pointee(17));
 | 
						|
  EXPECT_THAT(set1, UnorderedElementsAre(Pointee(19)));
 | 
						|
 | 
						|
  node.value() = absl::make_unique<int>(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 container_internal
 | 
						|
}  // namespace absl
 |