blob: f00cac253f5a53b6af2e6afb48876a484e599493 [file] [log] [blame]
Talin1a4b19e2012-02-18 21:00:49 +00001//===- llvm/unittest/ADT/HashingTest.cpp ----------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Hashing.h unit tests.
11//
12//===----------------------------------------------------------------------===//
13
14#include "gtest/gtest.h"
15#include "llvm/ADT/Hashing.h"
Chandler Carruth0b66c6f2012-03-01 18:55:25 +000016#include "llvm/Support/DataTypes.h"
17#include <deque>
18#include <list>
19#include <map>
20#include <vector>
21
22namespace llvm {
23
24// Helper for test code to print hash codes.
25void PrintTo(const hash_code &code, std::ostream *os) {
26 *os << static_cast<size_t>(code);
27}
28
29// Fake an object that is recognized as hashable data to test super large
30// objects.
31struct LargeTestInteger { uint64_t arr[8]; };
32
Francois Pichet5fa6f5b2012-03-03 09:39:54 +000033struct NonPOD {
34 uint64_t x, y;
35 NonPOD(uint64_t x, uint64_t y) : x(x), y(y) {}
36 ~NonPOD() {}
37 friend hash_code hash_value(const NonPOD &obj) {
38 return hash_combine(obj.x, obj.y);
39 }
40};
41
Chandler Carruth0b66c6f2012-03-01 18:55:25 +000042namespace hashing {
43namespace detail {
44template <> struct is_hashable_data<LargeTestInteger> : true_type {};
45} // namespace detail
46} // namespace hashing
47
48} // namespace llvm
Talin1a4b19e2012-02-18 21:00:49 +000049
50using namespace llvm;
51
52namespace {
53
Chandler Carruth1c144892012-03-02 10:56:40 +000054
Chandler Carruth0b66c6f2012-03-01 18:55:25 +000055TEST(HashingTest, HashValueBasicTest) {
56 int x = 42, y = 43, c = 'x';
57 void *p = 0;
58 uint64_t i = 71;
59 const unsigned ci = 71;
60 volatile int vi = 71;
61 const volatile int cvi = 71;
62 uintptr_t addr = reinterpret_cast<uintptr_t>(&y);
Francois Pichet5fa6f5b2012-03-03 09:39:54 +000063 EXPECT_EQ(hash_value(42), hash_value(x));
64 EXPECT_NE(hash_value(42), hash_value(y));
65 EXPECT_NE(hash_value(42), hash_value(p));
66 EXPECT_EQ(hash_value(71), hash_value(i));
67 EXPECT_EQ(hash_value(71), hash_value(ci));
68 EXPECT_EQ(hash_value(71), hash_value(vi));
69 EXPECT_EQ(hash_value(71), hash_value(cvi));
70 EXPECT_EQ(hash_value(c), hash_value('x'));
71 EXPECT_EQ(hash_value('4'), hash_value('0' + 4));
72 EXPECT_EQ(hash_value(addr), hash_value(&y));
Chandler Carruth21d60d52012-03-04 10:23:11 +000073}
Chandler Carruthc7384cf2012-03-02 08:32:29 +000074
Chandler Carruth21d60d52012-03-04 10:23:11 +000075TEST(HashingTest, HashValueStdPair) {
Francois Pichet5fa6f5b2012-03-03 09:39:54 +000076 EXPECT_EQ(hash_combine(42, 43), hash_value(std::make_pair(42, 43)));
77 EXPECT_NE(hash_combine(43, 42), hash_value(std::make_pair(42, 43)));
78 EXPECT_NE(hash_combine(42, 43), hash_value(std::make_pair(42ull, 43ull)));
79 EXPECT_NE(hash_combine(42, 43), hash_value(std::make_pair(42, 43ull)));
80 EXPECT_NE(hash_combine(42, 43), hash_value(std::make_pair(42ull, 43)));
Chandler Carruth4d628e22012-03-02 09:26:36 +000081
82 // Note that pairs are implicitly flattened to a direct sequence of data and
83 // hashed efficiently as a consequence.
Francois Pichet5fa6f5b2012-03-03 09:39:54 +000084 EXPECT_EQ(hash_combine(42, 43, 44),
85 hash_value(std::make_pair(42, std::make_pair(43, 44))));
86 EXPECT_EQ(hash_value(std::make_pair(42, std::make_pair(43, 44))),
87 hash_value(std::make_pair(std::make_pair(42, 43), 44)));
Chandler Carruth1c144892012-03-02 10:56:40 +000088
89 // Ensure that pairs which have padding bytes *inside* them don't get treated
90 // this way.
Francois Pichet5fa6f5b2012-03-03 09:39:54 +000091 EXPECT_EQ(hash_combine('0', hash_combine(1ull, '2')),
92 hash_value(std::make_pair('0', std::make_pair(1ull, '2'))));
Chandler Carruth1c144892012-03-02 10:56:40 +000093
94 // Ensure that non-POD pairs don't explode the traits used.
95 NonPOD obj1(1, 2), obj2(3, 4), obj3(5, 6);
Francois Pichet5fa6f5b2012-03-03 09:39:54 +000096 EXPECT_EQ(hash_combine(obj1, hash_combine(obj2, obj3)),
97 hash_value(std::make_pair(obj1, std::make_pair(obj2, obj3))));
Talin1a4b19e2012-02-18 21:00:49 +000098}
99
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000100template <typename T, size_t N> T *begin(T (&arr)[N]) { return arr; }
101template <typename T, size_t N> T *end(T (&arr)[N]) { return arr + N; }
102
103// Provide a dummy, hashable type designed for easy verification: its hash is
104// the same as its value.
105struct HashableDummy { size_t value; };
106hash_code hash_value(HashableDummy dummy) { return dummy.value; }
107
108TEST(HashingTest, HashCombineRangeBasicTest) {
109 // Leave this uninitialized in the hope that valgrind will catch bad reads.
110 int dummy;
111 hash_code dummy_hash = hash_combine_range(&dummy, &dummy);
Chandler Carruth41669892012-03-02 00:48:38 +0000112 EXPECT_NE(hash_code(0), dummy_hash);
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000113
114 const int arr1[] = { 1, 2, 3 };
115 hash_code arr1_hash = hash_combine_range(begin(arr1), end(arr1));
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000116 EXPECT_NE(dummy_hash, arr1_hash);
117 EXPECT_EQ(arr1_hash, hash_combine_range(begin(arr1), end(arr1)));
118
119 const std::vector<int> vec(begin(arr1), end(arr1));
120 EXPECT_EQ(arr1_hash, hash_combine_range(vec.begin(), vec.end()));
121
122 const std::list<int> list(begin(arr1), end(arr1));
123 EXPECT_EQ(arr1_hash, hash_combine_range(list.begin(), list.end()));
124
125 const std::deque<int> deque(begin(arr1), end(arr1));
126 EXPECT_EQ(arr1_hash, hash_combine_range(deque.begin(), deque.end()));
127
128 const int arr2[] = { 3, 2, 1 };
129 hash_code arr2_hash = hash_combine_range(begin(arr2), end(arr2));
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000130 EXPECT_NE(dummy_hash, arr2_hash);
131 EXPECT_NE(arr1_hash, arr2_hash);
132
133 const int arr3[] = { 1, 1, 2, 3 };
134 hash_code arr3_hash = hash_combine_range(begin(arr3), end(arr3));
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000135 EXPECT_NE(dummy_hash, arr3_hash);
136 EXPECT_NE(arr1_hash, arr3_hash);
137
138 const int arr4[] = { 1, 2, 3, 3 };
139 hash_code arr4_hash = hash_combine_range(begin(arr4), end(arr4));
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000140 EXPECT_NE(dummy_hash, arr4_hash);
141 EXPECT_NE(arr1_hash, arr4_hash);
142
143 const size_t arr5[] = { 1, 2, 3 };
144 const HashableDummy d_arr5[] = { {1}, {2}, {3} };
145 hash_code arr5_hash = hash_combine_range(begin(arr5), end(arr5));
146 hash_code d_arr5_hash = hash_combine_range(begin(d_arr5), end(d_arr5));
147 EXPECT_EQ(arr5_hash, d_arr5_hash);
Talin1a4b19e2012-02-18 21:00:49 +0000148}
149
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000150TEST(HashingTest, HashCombineRangeLengthDiff) {
151 // Test that as only the length varies, we compute different hash codes for
152 // sequences.
153 std::map<size_t, size_t> code_to_size;
154 std::vector<char> all_one_c(256, '\xff');
155 for (unsigned Idx = 1, Size = all_one_c.size(); Idx < Size; ++Idx) {
156 hash_code code = hash_combine_range(&all_one_c[0], &all_one_c[0] + Idx);
157 std::map<size_t, size_t>::iterator
158 I = code_to_size.insert(std::make_pair(code, Idx)).first;
159 EXPECT_EQ(Idx, I->second);
160 }
161 code_to_size.clear();
162 std::vector<char> all_zero_c(256, '\0');
163 for (unsigned Idx = 1, Size = all_zero_c.size(); Idx < Size; ++Idx) {
164 hash_code code = hash_combine_range(&all_zero_c[0], &all_zero_c[0] + Idx);
165 std::map<size_t, size_t>::iterator
166 I = code_to_size.insert(std::make_pair(code, Idx)).first;
167 EXPECT_EQ(Idx, I->second);
168 }
169 code_to_size.clear();
170 std::vector<unsigned> all_one_int(512, -1);
171 for (unsigned Idx = 1, Size = all_one_int.size(); Idx < Size; ++Idx) {
172 hash_code code = hash_combine_range(&all_one_int[0], &all_one_int[0] + Idx);
173 std::map<size_t, size_t>::iterator
174 I = code_to_size.insert(std::make_pair(code, Idx)).first;
175 EXPECT_EQ(Idx, I->second);
176 }
177 code_to_size.clear();
178 std::vector<unsigned> all_zero_int(512, 0);
179 for (unsigned Idx = 1, Size = all_zero_int.size(); Idx < Size; ++Idx) {
180 hash_code code = hash_combine_range(&all_zero_int[0], &all_zero_int[0] + Idx);
181 std::map<size_t, size_t>::iterator
182 I = code_to_size.insert(std::make_pair(code, Idx)).first;
183 EXPECT_EQ(Idx, I->second);
184 }
Talin1a4b19e2012-02-18 21:00:49 +0000185}
186
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000187TEST(HashingTest, HashCombineRangeGoldenTest) {
188 struct { const char *s; uint64_t hash; } golden_data[] = {
Chandler Carruth97312942012-03-01 23:06:19 +0000189#if SIZE_MAX == UINT64_MAX
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000190 { "a", 0xaeb6f9d5517c61f8ULL },
191 { "ab", 0x7ab1edb96be496b4ULL },
192 { "abc", 0xe38e60bf19c71a3fULL },
193 { "abcde", 0xd24461a66de97f6eULL },
194 { "abcdefgh", 0x4ef872ec411dec9dULL },
195 { "abcdefghijklm", 0xe8a865539f4eadfeULL },
196 { "abcdefghijklmnopqrstu", 0x261cdf85faaf4e79ULL },
197 { "abcdefghijklmnopqrstuvwxyzabcdef", 0x43ba70e4198e3b2aULL },
198 { "abcdefghijklmnopqrstuvwxyzabcdef"
199 "abcdefghijklmnopqrstuvwxyzghijkl"
200 "abcdefghijklmnopqrstuvwxyzmnopqr"
201 "abcdefghijklmnopqrstuvwxyzstuvwx"
202 "abcdefghijklmnopqrstuvwxyzyzabcd", 0xdcd57fb2afdf72beULL },
203 { "a", 0xaeb6f9d5517c61f8ULL },
204 { "aa", 0xf2b3b69a9736a1ebULL },
205 { "aaa", 0xf752eb6f07b1cafeULL },
206 { "aaaaa", 0x812bd21e1236954cULL },
207 { "aaaaaaaa", 0xff07a2cff08ac587ULL },
208 { "aaaaaaaaaaaaa", 0x84ac949d54d704ecULL },
209 { "aaaaaaaaaaaaaaaaaaaaa", 0xcb2c8fb6be8f5648ULL },
210 { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0xcc40ab7f164091b6ULL },
211 { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
212 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
213 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
214 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
215 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0xc58e174c1e78ffe9ULL },
216 { "z", 0x1ba160d7e8f8785cULL },
217 { "zz", 0x2c5c03172f1285d7ULL },
218 { "zzz", 0x9d2c4f4b507a2ac3ULL },
219 { "zzzzz", 0x0f03b9031735693aULL },
220 { "zzzzzzzz", 0xe674147c8582c08eULL },
221 { "zzzzzzzzzzzzz", 0x3162d9fa6938db83ULL },
222 { "zzzzzzzzzzzzzzzzzzzzz", 0x37b9a549e013620cULL },
223 { "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", 0x8921470aff885016ULL },
224 { "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
225 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
226 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
227 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
228 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", 0xf60fdcd9beb08441ULL },
229 { "a", 0xaeb6f9d5517c61f8ULL },
230 { "ab", 0x7ab1edb96be496b4ULL },
231 { "aba", 0x3edb049950884d0aULL },
232 { "ababa", 0x8f2de9e73a97714bULL },
233 { "abababab", 0xee14a29ddf0ce54cULL },
234 { "ababababababa", 0x38b3ddaada2d52b4ULL },
235 { "ababababababababababa", 0xd3665364219f2b85ULL },
Chandler Carruthc3f99182012-03-02 10:01:29 +0000236 { "abababababababababababababababab", 0xa75cd6afbf1bc972ULL },
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000237 { "abababababababababababababababab"
238 "abababababababababababababababab"
239 "abababababababababababababababab"
240 "abababababababababababababababab"
241 "abababababababababababababababab", 0x840192d129f7a22bULL }
Chandler Carruth97312942012-03-01 23:06:19 +0000242#elif SIZE_MAX == UINT32_MAX
Chandler Carruth4fc5bdf2012-03-02 10:01:27 +0000243 { "a", 0x000000004605f745ULL },
244 { "ab", 0x00000000d5f06301ULL },
245 { "abc", 0x00000000559fe1eeULL },
246 { "abcde", 0x00000000424028d7ULL },
247 { "abcdefgh", 0x000000007bb119f8ULL },
248 { "abcdefghijklm", 0x00000000edbca513ULL },
249 { "abcdefghijklmnopqrstu", 0x000000007c15712eULL },
250 { "abcdefghijklmnopqrstuvwxyzabcdef", 0x000000000b3aad66ULL },
251 { "abcdefghijklmnopqrstuvwxyzabcdef"
252 "abcdefghijklmnopqrstuvwxyzghijkl"
253 "abcdefghijklmnopqrstuvwxyzmnopqr"
254 "abcdefghijklmnopqrstuvwxyzstuvwx"
255 "abcdefghijklmnopqrstuvwxyzyzabcd", 0x000000008c758c8bULL },
256 { "a", 0x000000004605f745ULL },
257 { "aa", 0x00000000dc0a52daULL },
258 { "aaa", 0x00000000b309274fULL },
259 { "aaaaa", 0x00000000203b5ef6ULL },
260 { "aaaaaaaa", 0x00000000a429e18fULL },
261 { "aaaaaaaaaaaaa", 0x000000008662070bULL },
262 { "aaaaaaaaaaaaaaaaaaaaa", 0x000000003f11151cULL },
263 { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0x000000008600fe20ULL },
264 { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
265 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
266 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
267 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
268 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0x000000004e0e0804ULL },
269 { "z", 0x00000000c5e405e9ULL },
270 { "zz", 0x00000000a8d8a2c6ULL },
271 { "zzz", 0x00000000fc2af672ULL },
272 { "zzzzz", 0x0000000047d9efe6ULL },
273 { "zzzzzzzz", 0x0000000080d77794ULL },
274 { "zzzzzzzzzzzzz", 0x00000000405f93adULL },
275 { "zzzzzzzzzzzzzzzzzzzzz", 0x00000000fc72838dULL },
276 { "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", 0x000000007ce160f1ULL },
277 { "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
278 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
279 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
280 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
281 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", 0x00000000aed9ed1bULL },
282 { "a", 0x000000004605f745ULL },
283 { "ab", 0x00000000d5f06301ULL },
284 { "aba", 0x00000000a85cd91bULL },
285 { "ababa", 0x000000009e3bb52eULL },
286 { "abababab", 0x000000002709b3b9ULL },
287 { "ababababababa", 0x000000003a234174ULL },
288 { "ababababababababababa", 0x000000005c63e5ceULL },
289 { "abababababababababababababababab", 0x0000000013f74334ULL },
290 { "abababababababababababababababab"
291 "abababababababababababababababab"
292 "abababababababababababababababab"
293 "abababababababababababababababab"
294 "abababababababababababababababab", 0x00000000c1a6f135ULL },
Chandler Carruth97312942012-03-01 23:06:19 +0000295#else
296#error This test only supports 64-bit and 32-bit systems.
297#endif
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000298 };
299 for (unsigned i = 0; i < sizeof(golden_data)/sizeof(*golden_data); ++i) {
300 StringRef str = golden_data[i].s;
301 hash_code hash = hash_combine_range(str.begin(), str.end());
Chandler Carruth5a491ca2012-03-01 23:20:45 +0000302#if 0 // Enable this to generate paste-able text for the above structure.
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000303 std::string member_str = "\"" + str.str() + "\",";
Chandler Carruth97312942012-03-01 23:06:19 +0000304 fprintf(stderr, " { %-35s 0x%016llxULL },\n",
305 member_str.c_str(), static_cast<uint64_t>(hash));
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000306#endif
307 EXPECT_EQ(static_cast<size_t>(golden_data[i].hash),
308 static_cast<size_t>(hash));
309 }
Talin1a4b19e2012-02-18 21:00:49 +0000310}
311
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000312TEST(HashingTest, HashCombineBasicTest) {
313 // Hashing a sequence of homogenous types matches range hashing.
314 const int i1 = 42, i2 = 43, i3 = 123, i4 = 999, i5 = 0, i6 = 79;
315 const int arr1[] = { i1, i2, i3, i4, i5, i6 };
316 EXPECT_EQ(hash_combine_range(arr1, arr1 + 1), hash_combine(i1));
317 EXPECT_EQ(hash_combine_range(arr1, arr1 + 2), hash_combine(i1, i2));
318 EXPECT_EQ(hash_combine_range(arr1, arr1 + 3), hash_combine(i1, i2, i3));
319 EXPECT_EQ(hash_combine_range(arr1, arr1 + 4), hash_combine(i1, i2, i3, i4));
320 EXPECT_EQ(hash_combine_range(arr1, arr1 + 5),
321 hash_combine(i1, i2, i3, i4, i5));
322 EXPECT_EQ(hash_combine_range(arr1, arr1 + 6),
323 hash_combine(i1, i2, i3, i4, i5, i6));
Talin1a4b19e2012-02-18 21:00:49 +0000324
Chandler Carruth0b66c6f2012-03-01 18:55:25 +0000325 // Hashing a sequence of heterogenous types which *happen* to all produce the
326 // same data for hashing produces the same as a range-based hash of the
327 // fundamental values.
328 const size_t s1 = 1024, s2 = 8888, s3 = 9000000;
329 const HashableDummy d1 = { 1024 }, d2 = { 8888 }, d3 = { 9000000 };
330 const size_t arr2[] = { s1, s2, s3 };
331 EXPECT_EQ(hash_combine_range(begin(arr2), end(arr2)),
332 hash_combine(s1, s2, s3));
333 EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(s1, s2, d3));
334 EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(s1, d2, s3));
335 EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(d1, s2, s3));
336 EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(d1, d2, s3));
337 EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(d1, d2, d3));
338
339 // Permuting values causes hashes to change.
340 EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i1, i1, i2));
341 EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i1, i2, i1));
342 EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i2, i1, i1));
343 EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i2, i2, i1));
344 EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i2, i2, i2));
345 EXPECT_NE(hash_combine(i2, i1, i1), hash_combine(i1, i1, i2));
346 EXPECT_NE(hash_combine(i1, i1, i2), hash_combine(i1, i2, i1));
347 EXPECT_NE(hash_combine(i1, i2, i1), hash_combine(i2, i1, i1));
348
349 // Changing type w/o changing value causes hashes to change.
350 EXPECT_NE(hash_combine(i1, i2, i3), hash_combine((char)i1, i2, i3));
351 EXPECT_NE(hash_combine(i1, i2, i3), hash_combine(i1, (char)i2, i3));
352 EXPECT_NE(hash_combine(i1, i2, i3), hash_combine(i1, i2, (char)i3));
353
354 // This is array of uint64, but it should have the exact same byte pattern as
355 // an array of LargeTestIntegers.
356 const uint64_t bigarr[] = {
357 0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL,
358 0xdeadbeafdeadbeefULL, 0xfefefefededededeULL, 0xafafafafededededULL,
359 0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL,
360 0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL,
361 0xdeadbeafdeadbeefULL, 0xfefefefededededeULL, 0xafafafafededededULL,
362 0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL,
363 0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL,
364 0xdeadbeafdeadbeefULL, 0xfefefefededededeULL, 0xafafafafededededULL,
365 0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL
366 };
367 // Hash a preposterously large integer, both aligned with the buffer and
368 // misaligned.
369 const LargeTestInteger li = { {
370 0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL,
371 0xdeadbeafdeadbeefULL, 0xfefefefededededeULL, 0xafafafafededededULL,
372 0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL
373 } };
374 // Rotate the storage from 'li'.
375 const LargeTestInteger l2 = { {
376 0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL, 0xdeadbeafdeadbeefULL,
377 0xfefefefededededeULL, 0xafafafafededededULL, 0xffffeeeeddddccccULL,
378 0xaaaacbcbffffababULL, 0xaaaaaaaaababababULL
379 } };
380 const LargeTestInteger l3 = { {
381 0xccddeeffeeddccbbULL, 0xdeadbeafdeadbeefULL, 0xfefefefededededeULL,
382 0xafafafafededededULL, 0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL,
383 0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL
384 } };
385 EXPECT_EQ(hash_combine_range(begin(bigarr), end(bigarr)),
386 hash_combine(li, li, li));
387 EXPECT_EQ(hash_combine_range(bigarr, bigarr + 9),
388 hash_combine(bigarr[0], l2));
389 EXPECT_EQ(hash_combine_range(bigarr, bigarr + 10),
390 hash_combine(bigarr[0], bigarr[1], l3));
391 EXPECT_EQ(hash_combine_range(bigarr, bigarr + 17),
392 hash_combine(li, bigarr[0], l2));
393 EXPECT_EQ(hash_combine_range(bigarr, bigarr + 18),
394 hash_combine(li, bigarr[0], bigarr[1], l3));
395 EXPECT_EQ(hash_combine_range(bigarr, bigarr + 18),
396 hash_combine(bigarr[0], l2, bigarr[9], l3));
397 EXPECT_EQ(hash_combine_range(bigarr, bigarr + 20),
398 hash_combine(bigarr[0], l2, bigarr[9], l3, bigarr[18], bigarr[19]));
Talin1a4b19e2012-02-18 21:00:49 +0000399}
400
401}