| Index: third_party/WebKit/Source/wtf/VectorTraits.h
|
| diff --git a/third_party/WebKit/Source/wtf/VectorTraits.h b/third_party/WebKit/Source/wtf/VectorTraits.h
|
| index 8d10684913d554b5176bb38a13848e746d0d81b1..490fccbdc414edc6eb8089e2e2c81e826faa56ad 100644
|
| --- a/third_party/WebKit/Source/wtf/VectorTraits.h
|
| +++ b/third_party/WebKit/Source/wtf/VectorTraits.h
|
| @@ -33,25 +33,30 @@ class AtomicString;
|
|
|
| template <typename T>
|
| struct VectorTraitsBase {
|
| - static const bool needsDestruction = !IsTriviallyDestructible<T>::value;
|
| -
|
| - static const bool canInitializeWithMemset = IsTriviallyDefaultConstructible<T>::value;
|
| - // true iff memset(slot, 0, size) constructs an unused slot value that is
|
| - // valid for Oilpan to trace and if the value needs destruction, its
|
| - // destructor can be invoked over. The zero'ed value representing an unused
|
| - // slot in the vector's backing storage; it does not have to be equal to
|
| - // what its constructor(s) would create, only be valid for those two uses.
|
| - static const bool canClearUnusedSlotsWithMemset = IsTriviallyDefaultConstructible<T>::value;
|
| -
|
| - static const bool canMoveWithMemcpy = IsTriviallyMoveAssignable<T>::value;
|
| - static const bool canCopyWithMemcpy = IsTriviallyCopyAssignable<T>::value;
|
| - static const bool canFillWithMemset = IsTriviallyDefaultConstructible<T>::value && (sizeof(T) == sizeof(char));
|
| - static const bool canCompareWithMemcmp = std::is_scalar<T>::value; // Types without padding.
|
| - template <typename U = void>
|
| - struct NeedsTracingLazily {
|
| - static const bool value = NeedsTracing<T>::value;
|
| - };
|
| - static const WeakHandlingFlag weakHandlingFlag = NoWeakHandlingInCollections; // We don't support weak handling in vectors.
|
| + static const bool needsDestruction = !IsTriviallyDestructible<T>::value;
|
| +
|
| + static const bool canInitializeWithMemset =
|
| + IsTriviallyDefaultConstructible<T>::value;
|
| + // true iff memset(slot, 0, size) constructs an unused slot value that is
|
| + // valid for Oilpan to trace and if the value needs destruction, its
|
| + // destructor can be invoked over. The zero'ed value representing an unused
|
| + // slot in the vector's backing storage; it does not have to be equal to
|
| + // what its constructor(s) would create, only be valid for those two uses.
|
| + static const bool canClearUnusedSlotsWithMemset =
|
| + IsTriviallyDefaultConstructible<T>::value;
|
| +
|
| + static const bool canMoveWithMemcpy = IsTriviallyMoveAssignable<T>::value;
|
| + static const bool canCopyWithMemcpy = IsTriviallyCopyAssignable<T>::value;
|
| + static const bool canFillWithMemset =
|
| + IsTriviallyDefaultConstructible<T>::value && (sizeof(T) == sizeof(char));
|
| + static const bool canCompareWithMemcmp =
|
| + std::is_scalar<T>::value; // Types without padding.
|
| + template <typename U = void>
|
| + struct NeedsTracingLazily {
|
| + static const bool value = NeedsTracing<T>::value;
|
| + };
|
| + static const WeakHandlingFlag weakHandlingFlag =
|
| + NoWeakHandlingInCollections; // We don't support weak handling in vectors.
|
| };
|
|
|
| template <typename T>
|
| @@ -62,10 +67,10 @@ struct VectorTraits : VectorTraitsBase<T> {};
|
| // comparison.
|
| template <typename T>
|
| struct SimpleClassVectorTraits : VectorTraitsBase<T> {
|
| - static const bool canInitializeWithMemset = true;
|
| - static const bool canClearUnusedSlotsWithMemset = true;
|
| - static const bool canMoveWithMemcpy = true;
|
| - static const bool canCompareWithMemcmp = true;
|
| + static const bool canInitializeWithMemset = true;
|
| + static const bool canClearUnusedSlotsWithMemset = true;
|
| + static const bool canMoveWithMemcpy = true;
|
| + static const bool canCompareWithMemcmp = true;
|
| };
|
|
|
| // We know OwnPtr and RefPtr are simple enough that initializing to 0 and moving
|
| @@ -75,79 +80,99 @@ struct VectorTraits<RefPtr<P>> : SimpleClassVectorTraits<RefPtr<P>> {};
|
|
|
| template <typename P>
|
| struct VectorTraits<OwnPtr<P>> : SimpleClassVectorTraits<OwnPtr<P>> {
|
| - // OwnPtr -> PassOwnPtr has a very particular structure that tricks the
|
| - // normal type traits into thinking that the class is "trivially copyable".
|
| - static const bool canCopyWithMemcpy = false;
|
| + // OwnPtr -> PassOwnPtr has a very particular structure that tricks the
|
| + // normal type traits into thinking that the class is "trivially copyable".
|
| + static const bool canCopyWithMemcpy = false;
|
| };
|
| -static_assert(VectorTraits<RefPtr<int>>::canInitializeWithMemset, "inefficient RefPtr Vector");
|
| -static_assert(VectorTraits<RefPtr<int>>::canMoveWithMemcpy, "inefficient RefPtr Vector");
|
| -static_assert(VectorTraits<RefPtr<int>>::canCompareWithMemcmp, "inefficient RefPtr Vector");
|
| -static_assert(VectorTraits<OwnPtr<int>>::canInitializeWithMemset, "inefficient OwnPtr Vector");
|
| -static_assert(VectorTraits<OwnPtr<int>>::canMoveWithMemcpy, "inefficient OwnPtr Vector");
|
| -static_assert(VectorTraits<OwnPtr<int>>::canCompareWithMemcmp, "inefficient OwnPtr Vector");
|
| +static_assert(VectorTraits<RefPtr<int>>::canInitializeWithMemset,
|
| + "inefficient RefPtr Vector");
|
| +static_assert(VectorTraits<RefPtr<int>>::canMoveWithMemcpy,
|
| + "inefficient RefPtr Vector");
|
| +static_assert(VectorTraits<RefPtr<int>>::canCompareWithMemcmp,
|
| + "inefficient RefPtr Vector");
|
| +static_assert(VectorTraits<OwnPtr<int>>::canInitializeWithMemset,
|
| + "inefficient OwnPtr Vector");
|
| +static_assert(VectorTraits<OwnPtr<int>>::canMoveWithMemcpy,
|
| + "inefficient OwnPtr Vector");
|
| +static_assert(VectorTraits<OwnPtr<int>>::canCompareWithMemcmp,
|
| + "inefficient OwnPtr Vector");
|
|
|
| template <typename First, typename Second>
|
| struct VectorTraits<std::pair<First, Second>> {
|
| - typedef VectorTraits<First> FirstTraits;
|
| - typedef VectorTraits<Second> SecondTraits;
|
| -
|
| - static const bool needsDestruction = FirstTraits::needsDestruction || SecondTraits::needsDestruction;
|
| - static const bool canInitializeWithMemset = FirstTraits::canInitializeWithMemset && SecondTraits::canInitializeWithMemset;
|
| - static const bool canMoveWithMemcpy = FirstTraits::canMoveWithMemcpy && SecondTraits::canMoveWithMemcpy;
|
| - static const bool canCopyWithMemcpy = FirstTraits::canCopyWithMemcpy && SecondTraits::canCopyWithMemcpy;
|
| - static const bool canFillWithMemset = false;
|
| - static const bool canCompareWithMemcmp = FirstTraits::canCompareWithMemcmp && SecondTraits::canCompareWithMemcmp;
|
| - static const bool canClearUnusedSlotsWithMemset = FirstTraits::canClearUnusedSlotsWithMemset && SecondTraits::canClearUnusedSlotsWithMemset;
|
| - template <typename U = void>
|
| - struct NeedsTracingLazily {
|
| - static const bool value = NeedsTracingTrait<FirstTraits>::value || NeedsTracingTrait<SecondTraits>::value;
|
| - };
|
| - static const WeakHandlingFlag weakHandlingFlag = NoWeakHandlingInCollections; // We don't support weak handling in vectors.
|
| + typedef VectorTraits<First> FirstTraits;
|
| + typedef VectorTraits<Second> SecondTraits;
|
| +
|
| + static const bool needsDestruction =
|
| + FirstTraits::needsDestruction || SecondTraits::needsDestruction;
|
| + static const bool canInitializeWithMemset =
|
| + FirstTraits::canInitializeWithMemset &&
|
| + SecondTraits::canInitializeWithMemset;
|
| + static const bool canMoveWithMemcpy =
|
| + FirstTraits::canMoveWithMemcpy && SecondTraits::canMoveWithMemcpy;
|
| + static const bool canCopyWithMemcpy =
|
| + FirstTraits::canCopyWithMemcpy && SecondTraits::canCopyWithMemcpy;
|
| + static const bool canFillWithMemset = false;
|
| + static const bool canCompareWithMemcmp =
|
| + FirstTraits::canCompareWithMemcmp && SecondTraits::canCompareWithMemcmp;
|
| + static const bool canClearUnusedSlotsWithMemset =
|
| + FirstTraits::canClearUnusedSlotsWithMemset &&
|
| + SecondTraits::canClearUnusedSlotsWithMemset;
|
| + template <typename U = void>
|
| + struct NeedsTracingLazily {
|
| + static const bool value = NeedsTracingTrait<FirstTraits>::value ||
|
| + NeedsTracingTrait<SecondTraits>::value;
|
| + };
|
| + static const WeakHandlingFlag weakHandlingFlag =
|
| + NoWeakHandlingInCollections; // We don't support weak handling in vectors.
|
| };
|
|
|
| -} // namespace WTF
|
| -
|
| -#define WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS(ClassName) \
|
| -namespace WTF { \
|
| -static_assert(!IsTriviallyDefaultConstructible<ClassName>::value || !IsTriviallyMoveAssignable<ClassName>::value || !std::is_scalar<ClassName>::value, "macro not needed"); \
|
| -template <> \
|
| -struct VectorTraits<ClassName> : SimpleClassVectorTraits<ClassName> {}; \
|
| -}
|
| -
|
| -#define WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(ClassName) \
|
| -namespace WTF { \
|
| -static_assert(!IsTriviallyDefaultConstructible<ClassName>::value || !IsTriviallyMoveAssignable<ClassName>::value, "macro not needed"); \
|
| -template <> \
|
| -struct VectorTraits<ClassName> : VectorTraitsBase<ClassName> \
|
| -{ \
|
| - static const bool canInitializeWithMemset = true; \
|
| - static const bool canClearUnusedSlotsWithMemset = true; \
|
| - static const bool canMoveWithMemcpy = true; \
|
| -}; \
|
| -}
|
| -
|
| -#define WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(ClassName) \
|
| -namespace WTF { \
|
| -static_assert(!IsTriviallyDefaultConstructible<ClassName>::value, "macro not needed"); \
|
| -template <> \
|
| -struct VectorTraits<ClassName> : VectorTraitsBase<ClassName> \
|
| -{ \
|
| - static const bool canInitializeWithMemset = true; \
|
| - static const bool canClearUnusedSlotsWithMemset = true; \
|
| -}; \
|
| -}
|
| -
|
| -#define WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(ClassName) \
|
| -namespace WTF { \
|
| -static_assert(!IsTriviallyDefaultConstructible<ClassName>::value, "macro not needed"); \
|
| -template <> \
|
| -struct VectorTraits<ClassName> : VectorTraitsBase<ClassName> \
|
| -{ \
|
| - static const bool canClearUnusedSlotsWithMemset = true; \
|
| -}; \
|
| -}
|
| +} // namespace WTF
|
| +
|
| +#define WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS(ClassName) \
|
| + namespace WTF { \
|
| + static_assert(!IsTriviallyDefaultConstructible<ClassName>::value || \
|
| + !IsTriviallyMoveAssignable<ClassName>::value || \
|
| + !std::is_scalar<ClassName>::value, \
|
| + "macro not needed"); \
|
| + template <> \
|
| + struct VectorTraits<ClassName> : SimpleClassVectorTraits<ClassName> {}; \
|
| + }
|
| +
|
| +#define WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(ClassName) \
|
| + namespace WTF { \
|
| + static_assert(!IsTriviallyDefaultConstructible<ClassName>::value || \
|
| + !IsTriviallyMoveAssignable<ClassName>::value, \
|
| + "macro not needed"); \
|
| + template <> \
|
| + struct VectorTraits<ClassName> : VectorTraitsBase<ClassName> { \
|
| + static const bool canInitializeWithMemset = true; \
|
| + static const bool canClearUnusedSlotsWithMemset = true; \
|
| + static const bool canMoveWithMemcpy = true; \
|
| + }; \
|
| + }
|
| +
|
| +#define WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(ClassName) \
|
| + namespace WTF { \
|
| + static_assert(!IsTriviallyDefaultConstructible<ClassName>::value, \
|
| + "macro not needed"); \
|
| + template <> \
|
| + struct VectorTraits<ClassName> : VectorTraitsBase<ClassName> { \
|
| + static const bool canInitializeWithMemset = true; \
|
| + static const bool canClearUnusedSlotsWithMemset = true; \
|
| + }; \
|
| + }
|
| +
|
| +#define WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(ClassName) \
|
| + namespace WTF { \
|
| + static_assert(!IsTriviallyDefaultConstructible<ClassName>::value, \
|
| + "macro not needed"); \
|
| + template <> \
|
| + struct VectorTraits<ClassName> : VectorTraitsBase<ClassName> { \
|
| + static const bool canClearUnusedSlotsWithMemset = true; \
|
| + }; \
|
| + }
|
|
|
| using WTF::VectorTraits;
|
| using WTF::SimpleClassVectorTraits;
|
|
|
| -#endif // WTF_VectorTraits_h
|
| +#endif // WTF_VectorTraits_h
|
|
|