#ifndef INCLUDE_CPPGC_TYPE_TRAITS_H_
#define INCLUDE_CPPGC_TYPE_TRAITS_H_
#include <cstddef>
#include <type_traits>
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;
template <typename T>
struct IsWeak : std::false_type { … };
template <typename T, typename = void>
struct IsTraceMethodConst : std::false_type { … };
IsTraceMethodConst<T, std::void_t<decltype(std::declval<const T>().Trace(std::declval<Visitor *>()))>>;
template <typename T, typename = void>
struct IsTraceable : std::false_type { … };
IsTraceable<T, std::void_t<decltype(std::declval<T>().Trace(std::declval<Visitor *>()))>>;
IsTraceableV;
template <typename T, typename = void>
struct HasGarbageCollectedMixinTypeMarker : std::false_type { … };
HasGarbageCollectedMixinTypeMarker<T, std::void_t<typename std::remove_const_t<T>::IsGarbageCollectedMixinTypeMarker>>;
template <typename T, typename = void>
struct HasGarbageCollectedTypeMarker : std::false_type { … };
HasGarbageCollectedTypeMarker<T, std::void_t<typename std::remove_const_t<T>::IsGarbageCollectedTypeMarker>>;
template <typename T, bool = HasGarbageCollectedTypeMarker<T>::value,
bool = HasGarbageCollectedMixinTypeMarker<T>::value>
struct IsGarbageCollectedMixinType : std::false_type { … };
IsGarbageCollectedMixinType<T, false, true>;
template <typename T, bool = HasGarbageCollectedTypeMarker<T>::value>
struct IsGarbageCollectedType : std::false_type { … };
IsGarbageCollectedType<T, true>;
template <typename T>
struct IsGarbageCollectedOrMixinType
: std::integral_constant<bool, IsGarbageCollectedType<T>::value ||
IsGarbageCollectedMixinType<T>::value> { … };
template <typename T, bool = (HasGarbageCollectedTypeMarker<T>::value &&
HasGarbageCollectedMixinTypeMarker<T>::value)>
struct IsGarbageCollectedWithMixinType : std::false_type { … };
IsGarbageCollectedWithMixinType<T, true>;
template <typename BasicMemberCandidate, typename WeaknessTag,
typename WriteBarrierPolicy>
struct IsSubclassOfBasicMemberTemplate { … };
template <typename T,
bool = IsSubclassOfBasicMemberTemplate<
T, StrongMemberTag, DijkstraWriteBarrierPolicy>::value>
struct IsMemberType : std::false_type { … };
IsMemberType<T, true>;
template <typename T, bool = IsSubclassOfBasicMemberTemplate<
T, WeakMemberTag, DijkstraWriteBarrierPolicy>::value>
struct IsWeakMemberType : std::false_type { … };
IsWeakMemberType<T, true>;
template <typename T, bool = IsSubclassOfBasicMemberTemplate<
T, UntracedMemberTag, NoWriteBarrierPolicy>::value>
struct IsUntracedMemberType : std::false_type { … };
IsUntracedMemberType<T, true>;
template <typename T>
struct IsComplete { … };
IsDecayedSameV;
IsStrictlyBaseOfV;
IsAnyMemberTypeV;
IsAnyMemberTypeV;
}
IsGarbageCollectedMixinTypeV;
IsGarbageCollectedTypeV;
IsGarbageCollectedOrMixinTypeV;
IsGarbageCollectedWithMixinTypeV;
IsMemberTypeV;
IsUntracedMemberTypeV;
IsWeakMemberTypeV;
IsWeakV;
IsCompleteV;
IsMemberOrWeakMemberTypeV;
IsAnyMemberTypeV;
}
#endif