diff --git a/llvm/include/llvm/ADT/Hashing.h b/llvm/include/llvm/ADT/Hashing.h index 17dcf31c616aa..9b8643b7765cf 100644 --- a/llvm/include/llvm/ADT/Hashing.h +++ b/llvm/include/llvm/ADT/Hashing.h @@ -44,6 +44,7 @@ #ifndef LLVM_ADT_HASHING_H #define LLVM_ADT_HASHING_H +#include "llvm/ADT/ADL.h" #include "llvm/Config/abi-breaking.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/ErrorHandling.h" @@ -469,6 +470,10 @@ hash_code hash_combine_range(InputIteratorT first, InputIteratorT last) { return ::llvm::hashing::detail::hash_combine_range_impl(first, last); } +// A wrapper for hash_combine_range above. +template hash_code hash_combine_range(RangeT &&R) { + return hash_combine_range(adl_begin(R), adl_end(R)); +} // Implementation details for hash_combine. namespace hashing { diff --git a/llvm/unittests/ADT/HashingTest.cpp b/llvm/unittests/ADT/HashingTest.cpp index c28356e229e66..e116ee934a0a4 100644 --- a/llvm/unittests/ADT/HashingTest.cpp +++ b/llvm/unittests/ADT/HashingTest.cpp @@ -166,15 +166,19 @@ TEST(HashingTest, HashCombineRangeBasicTest) { hash_code arr1_hash = hash_combine_range(begin(arr1), end(arr1)); EXPECT_NE(dummy_hash, arr1_hash); EXPECT_EQ(arr1_hash, hash_combine_range(begin(arr1), end(arr1))); + EXPECT_EQ(arr1_hash, hash_combine_range(arr1)); const std::vector vec(begin(arr1), end(arr1)); EXPECT_EQ(arr1_hash, hash_combine_range(vec.begin(), vec.end())); + EXPECT_EQ(arr1_hash, hash_combine_range(vec)); const std::list list(begin(arr1), end(arr1)); EXPECT_EQ(arr1_hash, hash_combine_range(list.begin(), list.end())); + EXPECT_EQ(arr1_hash, hash_combine_range(list)); const std::deque deque(begin(arr1), end(arr1)); EXPECT_EQ(arr1_hash, hash_combine_range(deque.begin(), deque.end())); + EXPECT_EQ(arr1_hash, hash_combine_range(deque)); const int arr2[] = { 3, 2, 1 }; hash_code arr2_hash = hash_combine_range(begin(arr2), end(arr2));