diff --git a/absl/hash/hash_test.cc b/absl/hash/hash_test.cc index b38d46d47..39ba24a85 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 a71bd4a65..9e608f7c3 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(