Index: third_party/WebKit/Source/wtf/TypeTraits.h |
diff --git a/third_party/WebKit/Source/wtf/TypeTraits.h b/third_party/WebKit/Source/wtf/TypeTraits.h |
index 987d3d36f005aafd5e77ca839c01bcfa198f3619..1fafd32ac4b210632f3d960523dc28adafd7efd8 100644 |
--- a/third_party/WebKit/Source/wtf/TypeTraits.h |
+++ b/third_party/WebKit/Source/wtf/TypeTraits.h |
@@ -1,383 +1,9 @@ |
-/* |
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. |
- * Copyright (C) 2009, 2010 Google Inc. All rights reserved. |
- * |
- * This library is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU Library General Public |
- * License as published by the Free Software Foundation; either |
- * version 2 of the License, or (at your option) any later version. |
- * |
- * This library is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
- * Library General Public License for more details. |
- * |
- * You should have received a copy of the GNU Library General Public License |
- * along with this library; see the file COPYING.LIB. If not, write to |
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
- * Boston, MA 02110-1301, USA. |
- * |
- */ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
-#ifndef TypeTraits_h |
-#define TypeTraits_h |
+#include "platform/wtf/TypeTraits.h" |
-#include <cstddef> |
-#include <type_traits> |
-#include <utility> |
- |
-#include "wtf/Compiler.h" |
- |
-namespace WTF { |
- |
-// Returns a string that contains the type name of |T| as a substring. |
-template <typename T> |
-inline const char* getStringWithTypeName() { |
- return WTF_PRETTY_FUNCTION; |
-} |
- |
-template <typename T> |
-struct IsWeak { |
- static const bool value = false; |
-}; |
- |
-enum WeakHandlingFlag { |
- NoWeakHandlingInCollections, |
- WeakHandlingInCollections |
-}; |
- |
-template <typename T, typename From> |
-class IsAssignable { |
- typedef char YesType; |
- struct NoType { |
- char padding[8]; |
- }; |
- |
- template <typename T2, |
- typename From2, |
- typename = decltype(std::declval<T2&>() = std::declval<From2>())> |
- static YesType checkAssignability(int); |
- template <typename T2, typename From2> |
- static NoType checkAssignability(...); |
- |
- public: |
- static const bool value = |
- sizeof(checkAssignability<T, From>(0)) == sizeof(YesType); |
-}; |
- |
-template <typename T> |
-struct IsCopyAssignable { |
- static_assert(!std::is_reference<T>::value, "T must not be a reference."); |
- static const bool value = IsAssignable<T, const T&>::value; |
-}; |
- |
-template <typename T> |
-struct IsMoveAssignable { |
- static_assert(!std::is_reference<T>::value, "T must not be a reference."); |
- static const bool value = IsAssignable<T, T&&>::value; |
-}; |
- |
-template <typename T> |
-struct IsTriviallyCopyAssignable { |
- static const bool value = |
- __has_trivial_assign(T) && IsCopyAssignable<T>::value; |
-}; |
- |
-template <typename T> |
-struct IsTriviallyMoveAssignable { |
- // TODO(yutak): This isn't really correct, because __has_trivial_assign |
- // appears to look only at copy assignment. However, |
- // std::is_trivially_move_assignable isn't available at this moment, and |
- // there isn't a good way to write that ourselves. |
- // |
- // Here we use IsTriviallyCopyAssignable as a conservative approximation: if T |
- // is trivially copy assignable, T is trivially move assignable, too. This |
- // definition misses a case where T is trivially move-only assignable, but |
- // such cases should be rare. |
- static const bool value = IsTriviallyCopyAssignable<T>::value; |
-}; |
- |
-template <typename T> |
-class IsDestructible { |
- typedef char YesType; |
- struct NoType { |
- char padding[8]; |
- }; |
- |
- template <typename T2, typename = decltype(std::declval<T2>().~T2())> |
- static YesType checkDestructibility(int); |
- template <typename T2> |
- static NoType checkDestructibility(...); |
- |
- public: |
- static const bool value = |
- sizeof(checkDestructibility<T>(0)) == sizeof(YesType); |
-}; |
- |
-template <typename T> |
-struct IsTriviallyDefaultConstructible { |
- static const bool value = |
- __has_trivial_constructor(T) && std::is_constructible<T>::value; |
-}; |
- |
-template <typename T> |
-struct IsTriviallyDestructible { |
- static const bool value = |
- __has_trivial_destructor(T) && IsDestructible<T>::value; |
-}; |
- |
-template <typename T, typename U> |
-struct IsSubclass { |
- private: |
- typedef char YesType; |
- struct NoType { |
- char padding[8]; |
- }; |
- |
- static YesType subclassCheck(U*); |
- static NoType subclassCheck(...); |
- static T* t; |
- |
- public: |
- static const bool value = sizeof(subclassCheck(t)) == sizeof(YesType); |
-}; |
- |
-template <typename T, template <typename... V> class U> |
-struct IsSubclassOfTemplate { |
- private: |
- typedef char YesType; |
- struct NoType { |
- char padding[8]; |
- }; |
- |
- template <typename... W> |
- static YesType subclassCheck(U<W...>*); |
- static NoType subclassCheck(...); |
- static T* t; |
- |
- public: |
- static const bool value = sizeof(subclassCheck(t)) == sizeof(YesType); |
-}; |
- |
-template <typename T, template <typename V, size_t W> class U> |
-struct IsSubclassOfTemplateTypenameSize { |
- private: |
- typedef char YesType; |
- struct NoType { |
- char padding[8]; |
- }; |
- |
- template <typename X, size_t Y> |
- static YesType subclassCheck(U<X, Y>*); |
- static NoType subclassCheck(...); |
- static T* t; |
- |
- public: |
- static const bool value = sizeof(subclassCheck(t)) == sizeof(YesType); |
-}; |
- |
-template <typename T, template <typename V, size_t W, typename X> class U> |
-struct IsSubclassOfTemplateTypenameSizeTypename { |
- private: |
- typedef char YesType; |
- struct NoType { |
- char padding[8]; |
- }; |
- |
- template <typename Y, size_t Z, typename A> |
- static YesType subclassCheck(U<Y, Z, A>*); |
- static NoType subclassCheck(...); |
- static T* t; |
- |
- public: |
- static const bool value = sizeof(subclassCheck(t)) == sizeof(YesType); |
-}; |
- |
-template <typename T, template <class V> class OuterTemplate> |
-struct RemoveTemplate { |
- typedef T Type; |
-}; |
- |
-template <typename T, template <class V> class OuterTemplate> |
-struct RemoveTemplate<OuterTemplate<T>, OuterTemplate> { |
- typedef T Type; |
-}; |
- |
-#if (COMPILER(MSVC) || !GCC_VERSION_AT_LEAST(4, 9, 0)) && !COMPILER(CLANG) |
-// FIXME: MSVC bug workaround. Remove once MSVC STL is fixed. |
-// FIXME: GCC before 4.9.0 seems to have the same issue. |
-// C++ 2011 Spec (ISO/IEC 14882:2011(E)) 20.9.6.2 Table 51 states that |
-// the template parameters shall be a complete type if they are different types. |
-// However, MSVC checks for type completeness even if they are the same type. |
-// Here, we use a template specialization for same type case to allow incomplete |
-// types. |
- |
-template <typename T, typename U> |
-struct IsConvertible { |
- static const bool value = std::is_convertible<T, U>::value; |
-}; |
- |
-template <typename T> |
-struct IsConvertible<T, T> { |
- static const bool value = true; |
-}; |
- |
-#define EnsurePtrConvertibleArgDecl(From, To) \ |
- typename std::enable_if<WTF::IsConvertible<From*, To*>::value>::type* = \ |
- nullptr |
-#define EnsurePtrConvertibleArgDefn(From, To) \ |
- typename std::enable_if<WTF::IsConvertible<From*, To*>::value>::type* |
-#else |
-#define EnsurePtrConvertibleArgDecl(From, To) \ |
- typename std::enable_if<std::is_convertible<From*, To*>::value>::type* = \ |
- nullptr |
-#define EnsurePtrConvertibleArgDefn(From, To) \ |
- typename std::enable_if<std::is_convertible<From*, To*>::value>::type* |
-#endif |
- |
-} // namespace WTF |
- |
-namespace blink { |
- |
-class Visitor; |
- |
-} // namespace blink |
- |
-namespace WTF { |
- |
-template <typename T> |
-class IsTraceable { |
- typedef char YesType; |
- typedef struct NoType { char padding[8]; } NoType; |
- |
- // Note that this also checks if a superclass of V has a trace method. |
- template <typename V> |
- static YesType checkHasTraceMethod( |
- V* v, |
- blink::Visitor* p = nullptr, |
- typename std::enable_if< |
- std::is_same<decltype(v->trace(p)), void>::value>::type* g = nullptr); |
- template <typename V> |
- static NoType checkHasTraceMethod(...); |
- |
- public: |
- // We add sizeof(T) to both sides here, because we want it to fail for |
- // incomplete types. Otherwise it just assumes that incomplete types do not |
- // have a trace method, which may not be true. |
- static const bool value = sizeof(YesType) + sizeof(T) == |
- sizeof(checkHasTraceMethod<T>(nullptr)) + sizeof(T); |
-}; |
- |
-// Convenience template wrapping the IsTraceableInCollection template in |
-// Collection Traits. It helps make the code more readable. |
-template <typename Traits> |
-class IsTraceableInCollectionTrait { |
- public: |
- static const bool value = Traits::template IsTraceableInCollection<>::value; |
-}; |
- |
-template <typename T, typename U> |
-struct IsTraceable<std::pair<T, U>> { |
- static const bool value = IsTraceable<T>::value || IsTraceable<U>::value; |
-}; |
- |
-// This is used to check that DISALLOW_NEW_EXCEPT_PLACEMENT_NEW objects are not |
-// stored in off-heap Vectors, HashTables etc. |
-template <typename T> |
-struct AllowsOnlyPlacementNew { |
- private: |
- using YesType = char; |
- struct NoType { |
- char padding[8]; |
- }; |
- |
- template <typename U> |
- static YesType checkMarker(typename U::IsAllowOnlyPlacementNew*); |
- template <typename U> |
- static NoType checkMarker(...); |
- |
- public: |
- static const bool value = sizeof(checkMarker<T>(nullptr)) == sizeof(YesType); |
-}; |
- |
-template <typename T> |
-class IsGarbageCollectedType { |
- typedef char YesType; |
- typedef struct NoType { char padding[8]; } NoType; |
- |
- static_assert(sizeof(T), "T must be fully defined"); |
- |
- using NonConstType = typename std::remove_const<T>::type; |
- template <typename U> |
- static YesType checkGarbageCollectedType( |
- typename U::IsGarbageCollectedTypeMarker*); |
- template <typename U> |
- static NoType checkGarbageCollectedType(...); |
- |
- // Separately check for GarbageCollectedMixin, which declares a different |
- // marker typedef, to avoid resolution ambiguity for cases like |
- // IsGarbageCollectedType<B> over: |
- // |
- // class A : public GarbageCollected<A>, public GarbageCollectedMixin { |
- // USING_GARBAGE_COLLECTED_MIXIN(A); |
- // ... |
- // }; |
- // class B : public A, public GarbageCollectedMixin { ... }; |
- // |
- template <typename U> |
- static YesType checkGarbageCollectedMixinType( |
- typename U::IsGarbageCollectedMixinMarker*); |
- template <typename U> |
- static NoType checkGarbageCollectedMixinType(...); |
- |
- public: |
- static const bool value = |
- (sizeof(YesType) == |
- sizeof(checkGarbageCollectedType<NonConstType>(nullptr))) || |
- (sizeof(YesType) == |
- sizeof(checkGarbageCollectedMixinType<NonConstType>(nullptr))); |
-}; |
- |
-template <> |
-class IsGarbageCollectedType<void> { |
- public: |
- static const bool value = false; |
-}; |
- |
-template <typename T> |
-class IsPersistentReferenceType { |
- typedef char YesType; |
- typedef struct NoType { char padding[8]; } NoType; |
- |
- template <typename U> |
- static YesType checkPersistentReferenceType( |
- typename U::IsPersistentReferenceTypeMarker*); |
- template <typename U> |
- static NoType checkPersistentReferenceType(...); |
- |
- public: |
- static const bool value = |
- (sizeof(YesType) == sizeof(checkPersistentReferenceType<T>(nullptr))); |
-}; |
- |
-template <typename T, |
- bool = std::is_function<typename std::remove_const< |
- typename std::remove_pointer<T>::type>::type>::value || |
- std::is_void<typename std::remove_const< |
- typename std::remove_pointer<T>::type>::type>::value> |
-class IsPointerToGarbageCollectedType { |
- public: |
- static const bool value = false; |
-}; |
- |
-template <typename T> |
-class IsPointerToGarbageCollectedType<T*, false> { |
- public: |
- static const bool value = IsGarbageCollectedType<T>::value; |
-}; |
- |
-} // namespace WTF |
- |
-using WTF::IsGarbageCollectedType; |
- |
-#endif // TypeTraits_h |
+// The contents of this header was moved to platform/wtf as part of |
+// WTF migration project. See the following post for details: |
+// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ |