| Index: third_party/WebKit/Source/wtf/HashTraits.h
|
| diff --git a/third_party/WebKit/Source/wtf/HashTraits.h b/third_party/WebKit/Source/wtf/HashTraits.h
|
| index 6c9580a413bfe1a2da552a9b0761ed97a811b255..c4319ce235c80284cfa1fb738401502c2bb5faef 100644
|
| --- a/third_party/WebKit/Source/wtf/HashTraits.h
|
| +++ b/third_party/WebKit/Source/wtf/HashTraits.h
|
| @@ -35,7 +35,7 @@
|
|
|
| namespace WTF {
|
|
|
| -template <bool isInteger, typename T>
|
| +template <bool isInteger, bool isEnum, typename T>
|
| struct GenericHashTraitsBase;
|
| template <typename T>
|
| struct HashTraits;
|
| @@ -46,7 +46,7 @@ enum ShouldWeakPointersBeMarkedStrongly {
|
| };
|
|
|
| template <typename T>
|
| -struct GenericHashTraitsBase<false, T> {
|
| +struct GenericHashTraitsBase<false, false, T> {
|
| // The emptyValueIsZero flag is used to optimize allocation of empty hash
|
| // tables with zeroed memory.
|
| static const bool emptyValueIsZero = false;
|
| @@ -88,12 +88,16 @@ struct GenericHashTraitsBase<false, T> {
|
| static const WeakHandlingFlag weakHandlingFlag =
|
| IsWeak<T>::value ? WeakHandlingInCollections
|
| : NoWeakHandlingInCollections;
|
| +
|
| + static T emptyValue() { return T(); }
|
| };
|
|
|
| // Default integer traits disallow both 0 and -1 as keys (max value instead of
|
| // -1 for unsigned).
|
| template <typename T>
|
| -struct GenericHashTraitsBase<true, T> : GenericHashTraitsBase<false, T> {
|
| +struct GenericHashTraitsBase<true, false, T>
|
| + : GenericHashTraitsBase<false, false, T> {
|
| + static_assert(std::is_integral<T>::value, "These traits are for integers");
|
| static const bool emptyValueIsZero = true;
|
| static void constructDeletedValue(T& slot, bool) {
|
| slot = static_cast<T>(-1);
|
| @@ -101,14 +105,26 @@ struct GenericHashTraitsBase<true, T> : GenericHashTraitsBase<false, T> {
|
| static bool isDeletedValue(T value) { return value == static_cast<T>(-1); }
|
| };
|
|
|
| +// Default enum traits disallow both -1 and -2 as keys (max and max-1 for
|
| +// enums with unsigned underlying types).
|
| template <typename T>
|
| -struct GenericHashTraits
|
| - : GenericHashTraitsBase<std::is_integral<T>::value, T> {
|
| +struct GenericHashTraitsBase<false, true, T>
|
| + : GenericHashTraitsBase<false, false, T> {
|
| + static_assert(std::is_enum<T>::value, "These traits are for enums");
|
| + static T emptyValue() { return static_cast<T>(-1); }
|
| + static void constructDeletedValue(T& slot, bool) {
|
| + slot = static_cast<T>(-2);
|
| + }
|
| + static bool isDeletedValue(T value) { return value == static_cast<T>(-2); }
|
| +};
|
| +
|
| +template <typename T>
|
| +struct GenericHashTraits : GenericHashTraitsBase<std::is_integral<T>::value,
|
| + std::is_enum<T>::value,
|
| + T> {
|
| typedef T TraitType;
|
| typedef T EmptyValueType;
|
|
|
| - static T emptyValue() { return T(); }
|
| -
|
| // Type for functions that do not take ownership, such as contains.
|
| typedef const T& PeekInType;
|
| typedef T* IteratorGetType;
|
|
|