OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All rights | 2 * Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All rights |
3 * reserved. | 3 * reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "wtf/StdLibExtras.h" | 28 #include "wtf/StdLibExtras.h" |
29 #include "wtf/TypeTraits.h" | 29 #include "wtf/TypeTraits.h" |
30 #include <limits> | 30 #include <limits> |
31 #include <memory> | 31 #include <memory> |
32 #include <string.h> // For memset. | 32 #include <string.h> // For memset. |
33 #include <type_traits> | 33 #include <type_traits> |
34 #include <utility> | 34 #include <utility> |
35 | 35 |
36 namespace WTF { | 36 namespace WTF { |
37 | 37 |
38 template <bool isInteger, typename T> | 38 template <bool isInteger, bool isEnum, typename T> |
39 struct GenericHashTraitsBase; | 39 struct GenericHashTraitsBase; |
40 template <typename T> | 40 template <typename T> |
41 struct HashTraits; | 41 struct HashTraits; |
42 | 42 |
43 enum ShouldWeakPointersBeMarkedStrongly { | 43 enum ShouldWeakPointersBeMarkedStrongly { |
44 WeakPointersActStrong, | 44 WeakPointersActStrong, |
45 WeakPointersActWeak | 45 WeakPointersActWeak |
46 }; | 46 }; |
47 | 47 |
48 template <typename T> | 48 template <typename T> |
49 struct GenericHashTraitsBase<false, T> { | 49 struct GenericHashTraitsBase<false, false, T> { |
50 // The emptyValueIsZero flag is used to optimize allocation of empty hash | 50 // The emptyValueIsZero flag is used to optimize allocation of empty hash |
51 // tables with zeroed memory. | 51 // tables with zeroed memory. |
52 static const bool emptyValueIsZero = false; | 52 static const bool emptyValueIsZero = false; |
53 | 53 |
54 // The hasIsEmptyValueFunction flag allows the hash table to automatically | 54 // The hasIsEmptyValueFunction flag allows the hash table to automatically |
55 // generate code to check for the empty value when it can be done with the | 55 // generate code to check for the empty value when it can be done with the |
56 // equality operator, but allows custom functions for cases like String that | 56 // equality operator, but allows custom functions for cases like String that |
57 // need them. | 57 // need them. |
58 static const bool hasIsEmptyValueFunction = false; | 58 static const bool hasIsEmptyValueFunction = false; |
59 | 59 |
(...skipping 21 matching lines...) Expand all Loading... |
81 template <typename U = void> | 81 template <typename U = void> |
82 struct NeedsToForbidGCOnMove { | 82 struct NeedsToForbidGCOnMove { |
83 // TODO(yutak): Consider using of std:::is_trivially_move_constructible | 83 // TODO(yutak): Consider using of std:::is_trivially_move_constructible |
84 // when it is accessible. | 84 // when it is accessible. |
85 static const bool value = !std::is_pod<T>::value; | 85 static const bool value = !std::is_pod<T>::value; |
86 }; | 86 }; |
87 | 87 |
88 static const WeakHandlingFlag weakHandlingFlag = | 88 static const WeakHandlingFlag weakHandlingFlag = |
89 IsWeak<T>::value ? WeakHandlingInCollections | 89 IsWeak<T>::value ? WeakHandlingInCollections |
90 : NoWeakHandlingInCollections; | 90 : NoWeakHandlingInCollections; |
| 91 |
| 92 static T emptyValue() { return T(); } |
91 }; | 93 }; |
92 | 94 |
93 // Default integer traits disallow both 0 and -1 as keys (max value instead of | 95 // Default integer traits disallow both 0 and -1 as keys (max value instead of |
94 // -1 for unsigned). | 96 // -1 for unsigned). |
95 template <typename T> | 97 template <typename T> |
96 struct GenericHashTraitsBase<true, T> : GenericHashTraitsBase<false, T> { | 98 struct GenericHashTraitsBase<true, false, T> |
| 99 : GenericHashTraitsBase<false, false, T> { |
| 100 static_assert(std::is_integral<T>::value, "These traits are for integers"); |
97 static const bool emptyValueIsZero = true; | 101 static const bool emptyValueIsZero = true; |
98 static void constructDeletedValue(T& slot, bool) { | 102 static void constructDeletedValue(T& slot, bool) { |
99 slot = static_cast<T>(-1); | 103 slot = static_cast<T>(-1); |
100 } | 104 } |
101 static bool isDeletedValue(T value) { return value == static_cast<T>(-1); } | 105 static bool isDeletedValue(T value) { return value == static_cast<T>(-1); } |
102 }; | 106 }; |
103 | 107 |
| 108 // Default enum traits disallow both -1 and -2 as keys (max and max-1 for |
| 109 // enums with unsigned underlying types). |
104 template <typename T> | 110 template <typename T> |
105 struct GenericHashTraits | 111 struct GenericHashTraitsBase<false, true, T> |
106 : GenericHashTraitsBase<std::is_integral<T>::value, T> { | 112 : GenericHashTraitsBase<false, false, T> { |
| 113 static_assert(std::is_enum<T>::value, "These traits are for enums"); |
| 114 static T emptyValue() { return static_cast<T>(-1); } |
| 115 static void constructDeletedValue(T& slot, bool) { |
| 116 slot = static_cast<T>(-2); |
| 117 } |
| 118 static bool isDeletedValue(T value) { return value == static_cast<T>(-2); } |
| 119 }; |
| 120 |
| 121 template <typename T> |
| 122 struct GenericHashTraits : GenericHashTraitsBase<std::is_integral<T>::value, |
| 123 std::is_enum<T>::value, |
| 124 T> { |
107 typedef T TraitType; | 125 typedef T TraitType; |
108 typedef T EmptyValueType; | 126 typedef T EmptyValueType; |
109 | 127 |
110 static T emptyValue() { return T(); } | |
111 | |
112 // Type for functions that do not take ownership, such as contains. | 128 // Type for functions that do not take ownership, such as contains. |
113 typedef const T& PeekInType; | 129 typedef const T& PeekInType; |
114 typedef T* IteratorGetType; | 130 typedef T* IteratorGetType; |
115 typedef const T* IteratorConstGetType; | 131 typedef const T* IteratorConstGetType; |
116 typedef T& IteratorReferenceType; | 132 typedef T& IteratorReferenceType; |
117 typedef const T& IteratorConstReferenceType; | 133 typedef const T& IteratorConstReferenceType; |
118 static IteratorReferenceType getToReferenceConversion(IteratorGetType x) { | 134 static IteratorReferenceType getToReferenceConversion(IteratorGetType x) { |
119 return *x; | 135 return *x; |
120 } | 136 } |
121 static IteratorConstReferenceType getToReferenceConstConversion( | 137 static IteratorConstReferenceType getToReferenceConstConversion( |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 }; | 436 }; |
421 | 437 |
422 } // namespace WTF | 438 } // namespace WTF |
423 | 439 |
424 using WTF::HashTraits; | 440 using WTF::HashTraits; |
425 using WTF::PairHashTraits; | 441 using WTF::PairHashTraits; |
426 using WTF::NullableHashTraits; | 442 using WTF::NullableHashTraits; |
427 using WTF::SimpleClassHashTraits; | 443 using WTF::SimpleClassHashTraits; |
428 | 444 |
429 #endif // WTF_HashTraits_h | 445 #endif // WTF_HashTraits_h |
OLD | NEW |