[PATCH] D109024: [Support] Automatically support `hash_value` when `HashBuilder` support is available.
Alexandre Rames via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 7 09:56:27 PDT 2021
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGc3c9312f7049: [Support] Automatically support `hash_value` when `HashBuilder` support is… (authored by arames).
Changed prior to commit:
https://reviews.llvm.org/D109024?vs=370444&id=371110#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D109024/new/
https://reviews.llvm.org/D109024
Files:
llvm/include/llvm/Support/HashBuilder.h
llvm/unittests/ADT/HashingTest.cpp
Index: llvm/unittests/ADT/HashingTest.cpp
===================================================================
--- llvm/unittests/ADT/HashingTest.cpp
+++ llvm/unittests/ADT/HashingTest.cpp
@@ -12,6 +12,7 @@
#include "llvm/ADT/Hashing.h"
#include "llvm/Support/DataTypes.h"
+#include "llvm/Support/HashBuilder.h"
#include "gtest/gtest.h"
#include <deque>
#include <list>
@@ -402,4 +403,36 @@
#undef CHECK_SAME
}
+struct StructWithHashBuilderSupport {
+ char C;
+ int I;
+ template <typename HasherT, llvm::support::endianness Endianness>
+ friend void addHash(llvm::HashBuilderImpl<HasherT, Endianness> &HBuilder,
+ const StructWithHashBuilderSupport &Value) {
+ HBuilder.add(Value.C, Value.I);
+ }
+};
+
+TEST(HashingTest, HashWithHashBuilder) {
+ StructWithHashBuilderSupport S{'c', 1};
+ EXPECT_NE(static_cast<size_t>(llvm::hash_value(S)), static_cast<size_t>(0));
}
+
+struct StructWithHashBuilderAndHashValueSupport {
+ char C;
+ int I;
+ template <typename HasherT, llvm::support::endianness Endianness>
+ friend void addHash(llvm::HashBuilderImpl<HasherT, Endianness> &HBuilder,
+ const StructWithHashBuilderAndHashValueSupport &Value) {}
+ friend hash_code
+ hash_value(const StructWithHashBuilderAndHashValueSupport &Value) {
+ return 0xbeef;
+ }
+};
+
+TEST(HashingTest, HashBuilderAndHashValue) {
+ StructWithHashBuilderAndHashValueSupport S{'c', 1};
+ EXPECT_EQ(static_cast<size_t>(hash_value(S)), static_cast<size_t>(0xbeef));
+}
+
+} // namespace
Index: llvm/include/llvm/Support/HashBuilder.h
===================================================================
--- llvm/include/llvm/Support/HashBuilder.h
+++ llvm/include/llvm/Support/HashBuilder.h
@@ -16,6 +16,7 @@
#define LLVM_SUPPORT_HASHBUILDER_H
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Endian.h"
@@ -405,6 +406,33 @@
HashBuilderImpl<HasherT, (Endianness == support::endianness::native
? support::endian::system_endianness()
: Endianness)>;
+
+namespace hashbuilder_detail {
+class HashCodeHasher {
+public:
+ HashCodeHasher() : Code(0) {}
+ void update(ArrayRef<uint8_t> Data) {
+ hash_code DataCode = hash_value(Data);
+ Code = hash_combine(Code, DataCode);
+ }
+ hash_code Code;
+};
+
+using HashCodeHashBuilder = HashBuilder<hashbuilder_detail::HashCodeHasher,
+ support::endianness::native>;
+} // namespace hashbuilder_detail
+
+/// Provide a default implementation of `hash_value` when `addHash(const T &)`
+/// is supported.
+template <typename T>
+std::enable_if_t<
+ is_detected<hashbuilder_detail::HashCodeHashBuilder::HasAddHashT, T>::value,
+ hash_code>
+hash_value(const T &Value) {
+ hashbuilder_detail::HashCodeHashBuilder HBuilder;
+ HBuilder.add(Value);
+ return HBuilder.getHasher().Code;
+}
} // end namespace llvm
#endif // LLVM_SUPPORT_HASHBUILDER_H
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109024.371110.patch
Type: text/x-patch
Size: 3069 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210907/600b4fb8/attachment.bin>
More information about the llvm-commits
mailing list