File Explorer

/proc/4/root/var/lang/include/node/cppgc

This explorer reads the filesystem of the server it runs on, so /workspace/user isn't present here. Browsing and the terminal still work against this server's own disk from /.

1 dir
27 files
type-traits.h8.5 KB · 273 lines
// Copyright 2020 the V8 project 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 INCLUDE_CPPGC_TYPE_TRAITS_H_#define INCLUDE_CPPGC_TYPE_TRAITS_H_ // This file should stay with minimal dependencies to allow embedder to check// against Oilpan types without including any other parts.#include <cstddef>#include <type_traits>#include <utility> namespace cppgc { class Visitor; namespace internal {template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,          typename CheckingPolicy, typename StorageType>class BasicMember;struct DijkstraWriteBarrierPolicy;struct NoWriteBarrierPolicy;class StrongMemberTag;class UntracedMemberTag;class WeakMemberTag; // Not supposed to be specialized by the user.template <typename T>struct IsWeak : std::false_type {}; // IsTraceMethodConst is used to verify that all Trace methods are marked as// const. It is equivalent to IsTraceable but for a non-const object.template <typename T, typename = void>struct IsTraceMethodConst : std::false_type {}; template <typename T>struct IsTraceMethodConst<T, std::void_t<decltype(std::declval<const T>().Trace(                                 std::declval<Visitor*>()))>> : std::true_type {}; template <typename T, typename = void>struct IsTraceable : std::false_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T>struct IsTraceable<    T, std::void_t<decltype(std::declval<T>().Trace(std::declval<Visitor*>()))>>    : std::true_type {  // All Trace methods should be marked as const. If an object of type  // 'T' is traceable then any object of type 'const T' should also  // be traceable.  static_assert(IsTraceMethodConst<T>(),                "Trace methods should be marked as const.");}; template <typename T>constexpr bool IsTraceableV = IsTraceable<T>::value; template <typename T, typename = void>struct HasGarbageCollectedMixinTypeMarker : std::false_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T>struct HasGarbageCollectedMixinTypeMarker<    T, std::void_t<           typename std::remove_const_t<T>::IsGarbageCollectedMixinTypeMarker>>    : std::true_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T, typename = void>struct HasGarbageCollectedTypeMarker : std::false_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T>struct HasGarbageCollectedTypeMarker<    T,    std::void_t<typename std::remove_const_t<T>::IsGarbageCollectedTypeMarker>>    : std::true_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T, bool = HasGarbageCollectedTypeMarker<T>::value,          bool = HasGarbageCollectedMixinTypeMarker<T>::value>struct IsGarbageCollectedMixinType : std::false_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T>struct IsGarbageCollectedMixinType<T, false, true> : std::true_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T, bool = HasGarbageCollectedTypeMarker<T>::value>struct IsGarbageCollectedType : std::false_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T>struct IsGarbageCollectedType<T, true> : std::true_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T>struct IsGarbageCollectedOrMixinType    : std::integral_constant<bool, IsGarbageCollectedType<T>::value ||                                       IsGarbageCollectedMixinType<T>::value> {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T, bool = (HasGarbageCollectedTypeMarker<T>::value &&                              HasGarbageCollectedMixinTypeMarker<T>::value)>struct IsGarbageCollectedWithMixinType : std::false_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename T>struct IsGarbageCollectedWithMixinType<T, true> : std::true_type {  static_assert(sizeof(T), "T must be fully defined");}; template <typename BasicMemberCandidate, typename WeaknessTag,          typename WriteBarrierPolicy>struct IsSubclassOfBasicMemberTemplate { private:  template <typename T, typename CheckingPolicy, typename StorageType>  static std::true_type SubclassCheck(      const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,                        StorageType>*);  static std::false_type SubclassCheck(...);  public:  static constexpr bool value = decltype(SubclassCheck(      std::declval<std::decay_t<BasicMemberCandidate>*>()))::value;}; template <typename T,          bool = IsSubclassOfBasicMemberTemplate<              T, StrongMemberTag, DijkstraWriteBarrierPolicy>::value>struct IsMemberType : std::false_type {}; template <typename T>struct IsMemberType<T, true> : std::true_type {}; template <typename T, bool = IsSubclassOfBasicMemberTemplate<                          T, WeakMemberTag, DijkstraWriteBarrierPolicy>::value>struct IsWeakMemberType : std::false_type {}; template <typename T>struct IsWeakMemberType<T, true> : std::true_type {}; template <typename T, bool = IsSubclassOfBasicMemberTemplate<                          T, UntracedMemberTag, NoWriteBarrierPolicy>::value>struct IsUntracedMemberType : std::false_type {}; template <typename T>struct IsUntracedMemberType<T, true> : std::true_type {}; template <typename T>struct IsComplete { private:  template <typename U, size_t = sizeof(U)>  static std::true_type IsSizeOfKnown(U*);  static std::false_type IsSizeOfKnown(...);  public:  static constexpr bool value =      decltype(IsSizeOfKnown(std::declval<T*>()))::value;}; template <typename T, typename U>constexpr bool IsDecayedSameV =    std::is_same_v<std::decay_t<T>, std::decay_t<U>>; template <typename B, typename D>constexpr bool IsStrictlyBaseOfV =    std::is_base_of_v<std::decay_t<B>, std::decay_t<D>> &&    !IsDecayedSameV<B, D>; template <typename T>constexpr bool IsAnyMemberTypeV = false; template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,          typename CheckingPolicy, typename StorageType>constexpr bool IsAnyMemberTypeV<internal::BasicMember<    T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType>> = true; }  // namespace internal /** * Value is true for types that inherit from `GarbageCollectedMixin` but not * `GarbageCollected<T>` (i.e., they are free mixins), and false otherwise. */template <typename T>constexpr bool IsGarbageCollectedMixinTypeV =    internal::IsGarbageCollectedMixinType<T>::value; /** * Value is true for types that inherit from `GarbageCollected<T>`, and false * otherwise. */template <typename T>constexpr bool IsGarbageCollectedTypeV =    internal::IsGarbageCollectedType<T>::value; /** * Value is true for types that inherit from either `GarbageCollected<T>` or * `GarbageCollectedMixin`, and false otherwise. */template <typename T>constexpr bool IsGarbageCollectedOrMixinTypeV =    internal::IsGarbageCollectedOrMixinType<T>::value; /** * Value is true for types that inherit from `GarbageCollected<T>` and * `GarbageCollectedMixin`, and false otherwise. */template <typename T>constexpr bool IsGarbageCollectedWithMixinTypeV =    internal::IsGarbageCollectedWithMixinType<T>::value; /** * Value is true for types of type `Member<T>`, and false otherwise. */template <typename T>constexpr bool IsMemberTypeV = internal::IsMemberType<T>::value; /** * Value is true for types of type `UntracedMember<T>`, and false otherwise. */template <typename T>constexpr bool IsUntracedMemberTypeV = internal::IsUntracedMemberType<T>::value; /** * Value is true for types of type `WeakMember<T>`, and false otherwise. */template <typename T>constexpr bool IsWeakMemberTypeV = internal::IsWeakMemberType<T>::value; /** * Value is true for types that are considered weak references, and false * otherwise. */template <typename T>constexpr bool IsWeakV = internal::IsWeak<T>::value; /** * Value is true for types that are complete, and false otherwise. */template <typename T>constexpr bool IsCompleteV = internal::IsComplete<T>::value; /** * Value is true for member types `Member<T>` and `WeakMember<T>`. */template <typename T>constexpr bool IsMemberOrWeakMemberTypeV =    IsMemberTypeV<T> || IsWeakMemberTypeV<T>; /** * Value is true for any member type. */template <typename T>constexpr bool IsAnyMemberTypeV = internal::IsAnyMemberTypeV<std::decay_t<T>>; }  // namespace cppgc #endif  // INCLUDE_CPPGC_TYPE_TRAITS_H_