Author: Duncan P. N. Exon Smith Date: 2020-12-08T15:25:03-08:00 New Revision: caab41c08e36872d91dddd4a05a5d98948802ac7
URL: https://github.com/llvm/llvm-project/commit/caab41c08e36872d91dddd4a05a5d98948802ac7 DIFF: https://github.com/llvm/llvm-project/commit/caab41c08e36872d91dddd4a05a5d98948802ac7.diff LOG: ADT: Add hash_value overload for Optional Add a `hash_value` for Optional so that other data structures with optional fields can easily hash them. I have a use for this in an upcoming patch. Differential Revision: https://reviews.llvm.org/D92676 Added: Modified: llvm/include/llvm/ADT/Optional.h llvm/unittests/ADT/OptionalTest.cpp Removed: ################################################################################ diff --git a/llvm/include/llvm/ADT/Optional.h b/llvm/include/llvm/ADT/Optional.h index be32178cb185..daa9ee627fa9 100644 --- a/llvm/include/llvm/ADT/Optional.h +++ b/llvm/include/llvm/ADT/Optional.h @@ -15,6 +15,7 @@ #ifndef LLVM_ADT_OPTIONAL_H #define LLVM_ADT_OPTIONAL_H +#include "llvm/ADT/Hashing.h" #include "llvm/ADT/None.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/type_traits.h" @@ -299,6 +300,10 @@ template <typename T> class Optional { #endif }; +template <class T> llvm::hash_code hash_value(const Optional<T> &O) { + return O ? hash_combine(true, *O) : hash_value(false); +} + template <typename T, typename U> constexpr bool operator==(const Optional<T> &X, const Optional<U> &Y) { if (X && Y) diff --git a/llvm/unittests/ADT/OptionalTest.cpp b/llvm/unittests/ADT/OptionalTest.cpp index 17a764041c8c..c7fa796a2d7f 100644 --- a/llvm/unittests/ADT/OptionalTest.cpp +++ b/llvm/unittests/ADT/OptionalTest.cpp @@ -599,4 +599,21 @@ TEST(OptionalTest, UseInUnitTests) { EXPECT_NONFATAL_FAILURE(EXPECT_EQ(llvm::None, Comparable::get()), "object"); } +TEST(OptionalTest, HashValue) { + // Check that None, false, and true all hash diff erently. + Optional<bool> B, B0 = false, B1 = true; + EXPECT_NE(hash_value(B0), hash_value(B)); + EXPECT_NE(hash_value(B1), hash_value(B)); + EXPECT_NE(hash_value(B1), hash_value(B0)); + + // Check that None, 0, and 1 all hash diff erently. + Optional<int> I, I0 = 0, I1 = 1; + EXPECT_NE(hash_value(I0), hash_value(I)); + EXPECT_NE(hash_value(I1), hash_value(I)); + EXPECT_NE(hash_value(I1), hash_value(I0)); + + // Check None hash the same way regardless of type. + EXPECT_EQ(hash_value(B), hash_value(I)); +} + } // end anonymous namespace _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits