From 62cf6a70414e15b356ec4f712ca8758133674f28 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Fri, 15 May 2020 08:23:25 -0700 Subject: Export of internal Abseil changes -- dc36565216b3022abb5a3c92f46fb4079bda869e by Samuel Benzaquen : Add support for std::reference_wrapper to absl::Hash. PiperOrigin-RevId: 311733171 GitOrigin-RevId: dc36565216b3022abb5a3c92f46fb4079bda869e Change-Id: I74543390446c2b7f6d856935aa36f28539810eef --- absl/hash/hash_test.cc | 18 ++++++++++++++++++ absl/hash/internal/hash.h | 7 +++++++ 2 files changed, 25 insertions(+) (limited to 'absl') diff --git a/absl/hash/hash_test.cc b/absl/hash/hash_test.cc index b38d46d47dd3..39ba24a85afb 100644 --- a/absl/hash/hash_test.cc +++ b/absl/hash/hash_test.cc @@ -581,6 +581,24 @@ TEST(HashValueTest, Maps) { MM{{1, "foo"}, {1, "foo"}, {43, "bar"}}, MM{{1, "foo"}, {43, "baz"}}))); } +TEST(HashValueTest, ReferenceWrapper) { + EXPECT_TRUE(is_hashable>::value); + + Private p1{1}, p10{10}; + EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(std::make_tuple( + p1, p10, std::ref(p1), std::ref(p10), std::cref(p1), std::cref(p10)))); + + EXPECT_TRUE(is_hashable>::value); + int one = 1, ten = 10; + EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(std::make_tuple( + one, ten, std::ref(one), std::ref(ten), std::cref(one), std::cref(ten)))); + + EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly( + std::make_tuple(std::tuple>(std::ref(one)), + std::tuple>(std::ref(ten)), + std::tuple(one), std::tuple(ten)))); +} + template struct IsHashCallable : std::false_type {}; diff --git a/absl/hash/internal/hash.h b/absl/hash/internal/hash.h index a71bd4a65df8..9e608f7c3c29 100644 --- a/absl/hash/internal/hash.h +++ b/absl/hash/internal/hash.h @@ -551,6 +551,13 @@ typename std::enable_if::value, H>::type AbslHashValue( // AbslHashValue for Wrapper Types // ----------------------------------------------------------------------------- +// AbslHashValue for hashing std::reference_wrapper +template +typename std::enable_if::value, H>::type AbslHashValue( + H hash_state, std::reference_wrapper opt) { + return H::combine(std::move(hash_state), opt.get()); +} + // AbslHashValue for hashing absl::optional template typename std::enable_if::value, H>::type AbslHashValue( -- cgit 1.4.1