Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(833)

Side by Side Diff: base/containers/hash_tables.h

Issue 1445013002: Replace base::HashPair macros with a templated function. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Change type size test. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 5
6 // 6 //
7 // Deal with the differences between Microsoft and GNU implemenations 7 // Deal with the differences between Microsoft and GNU implemenations
8 // of hash_map. Allows all platforms to use |base::hash_map| and 8 // of hash_map. Allows all platforms to use |base::hash_map| and
9 // |base::hash_set|. 9 // |base::hash_set|.
10 // eg: 10 // eg:
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 240
241 uint64 odd_random = 1578233944LL << 32 | 194370989LL; 241 uint64 odd_random = 1578233944LL << 32 | 194370989LL;
242 uint32 shift_random = 20591U << 16; 242 uint32 shift_random = 20591U << 16;
243 243
244 hash64 = hash64 * odd_random + shift_random; 244 hash64 = hash64 * odd_random + shift_random;
245 std::size_t high_bits = static_cast<std::size_t>( 245 std::size_t high_bits = static_cast<std::size_t>(
246 hash64 >> (8 * (sizeof(uint64) - sizeof(std::size_t)))); 246 hash64 >> (8 * (sizeof(uint64) - sizeof(std::size_t))));
247 return high_bits; 247 return high_bits;
248 } 248 }
249 249
250 #define DEFINE_32BIT_PAIR_HASH(Type1, Type2) \ 250 template<typename T1, typename T2>
251 inline std::size_t HashPair(Type1 value1, Type2 value2) { \ 251 inline std::size_t HashPair(T1 value1, T2 value2) {
252 return HashInts32(value1, value2); \ 252 // This condition is expected to be compile-time evaluated and optimised away
253 // in release builds.
254 if (sizeof(T1) > sizeof(uint32_t) || (sizeof(T2) > sizeof(uint32_t)))
255 return HashInts64(value1, value2);
256
257 return HashInts32(value1, value2);
253 } 258 }
254 259
255 DEFINE_32BIT_PAIR_HASH(int16, int16);
256 DEFINE_32BIT_PAIR_HASH(int16, uint16);
257 DEFINE_32BIT_PAIR_HASH(int16, int32);
258 DEFINE_32BIT_PAIR_HASH(int16, uint32);
259 DEFINE_32BIT_PAIR_HASH(uint16, int16);
260 DEFINE_32BIT_PAIR_HASH(uint16, uint16);
261 DEFINE_32BIT_PAIR_HASH(uint16, int32);
262 DEFINE_32BIT_PAIR_HASH(uint16, uint32);
263 DEFINE_32BIT_PAIR_HASH(int32, int16);
264 DEFINE_32BIT_PAIR_HASH(int32, uint16);
265 DEFINE_32BIT_PAIR_HASH(int32, int32);
266 DEFINE_32BIT_PAIR_HASH(int32, uint32);
267 DEFINE_32BIT_PAIR_HASH(uint32, int16);
268 DEFINE_32BIT_PAIR_HASH(uint32, uint16);
269 DEFINE_32BIT_PAIR_HASH(uint32, int32);
270 DEFINE_32BIT_PAIR_HASH(uint32, uint32);
271
272 #undef DEFINE_32BIT_PAIR_HASH
273
274 #define DEFINE_64BIT_PAIR_HASH(Type1, Type2) \
275 inline std::size_t HashPair(Type1 value1, Type2 value2) { \
276 return HashInts64(value1, value2); \
277 }
278
279 DEFINE_64BIT_PAIR_HASH(int16, int64);
280 DEFINE_64BIT_PAIR_HASH(int16, uint64);
281 DEFINE_64BIT_PAIR_HASH(uint16, int64);
282 DEFINE_64BIT_PAIR_HASH(uint16, uint64);
283 DEFINE_64BIT_PAIR_HASH(int32, int64);
284 DEFINE_64BIT_PAIR_HASH(int32, uint64);
285 DEFINE_64BIT_PAIR_HASH(uint32, int64);
286 DEFINE_64BIT_PAIR_HASH(uint32, uint64);
287 DEFINE_64BIT_PAIR_HASH(int64, int16);
288 DEFINE_64BIT_PAIR_HASH(int64, uint16);
289 DEFINE_64BIT_PAIR_HASH(int64, int32);
290 DEFINE_64BIT_PAIR_HASH(int64, uint32);
291 DEFINE_64BIT_PAIR_HASH(int64, int64);
292 DEFINE_64BIT_PAIR_HASH(int64, uint64);
293 DEFINE_64BIT_PAIR_HASH(uint64, int16);
294 DEFINE_64BIT_PAIR_HASH(uint64, uint16);
295 DEFINE_64BIT_PAIR_HASH(uint64, int32);
296 DEFINE_64BIT_PAIR_HASH(uint64, uint32);
297 DEFINE_64BIT_PAIR_HASH(uint64, int64);
298 DEFINE_64BIT_PAIR_HASH(uint64, uint64);
299
300 #undef DEFINE_64BIT_PAIR_HASH
301 } // namespace base 260 } // namespace base
302 261
303 namespace BASE_HASH_NAMESPACE { 262 namespace BASE_HASH_NAMESPACE {
304 263
305 // Implement methods for hashing a pair of integers, so they can be used as 264 // Implement methods for hashing a pair of integers, so they can be used as
306 // keys in STL containers. 265 // keys in STL containers.
307 266
308 template<typename Type1, typename Type2> 267 template<typename Type1, typename Type2>
309 struct hash<std::pair<Type1, Type2> > { 268 struct hash<std::pair<Type1, Type2> > {
310 std::size_t operator()(std::pair<Type1, Type2> value) const { 269 std::size_t operator()(std::pair<Type1, Type2> value) const {
311 return base::HashPair(value.first, value.second); 270 return base::HashPair(value.first, value.second);
312 } 271 }
313 }; 272 };
314 273
315 } // namespace BASE_HASH_NAMESPACE 274 } // namespace BASE_HASH_NAMESPACE
316 275
317 #undef DEFINE_PAIR_HASH_FUNCTION_START 276 #undef DEFINE_PAIR_HASH_FUNCTION_START
318 #undef DEFINE_PAIR_HASH_FUNCTION_END 277 #undef DEFINE_PAIR_HASH_FUNCTION_END
319 278
320 #endif // BASE_CONTAINERS_HASH_TABLES_H_ 279 #endif // BASE_CONTAINERS_HASH_TABLES_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698