5#ifndef INCLUDE_CPPGC_TYPE_TRAITS_H_
6#define INCLUDE_CPPGC_TYPE_TRAITS_H_
19template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
20 typename CheckingPolicy,
typename StorageType>
25class UntracedMemberTag;
34template <
typename T,
typename =
void>
39 std::declval<Visitor*>()))>> : std::true_type {
42template <
typename T,
typename =
void>
44 static_assert(
sizeof(
T),
"T must be fully defined");
49 T,
std::void_t<decltype(std::declval<T>().Trace(std::declval<Visitor*>()))>>
55 "Trace methods should be marked as const.");
61template <
typename T,
typename =
void>
63 static_assert(
sizeof(
T),
"T must be fully defined");
69 typename std::remove_const_t<T>::IsGarbageCollectedMixinTypeMarker>>
71 static_assert(
sizeof(
T),
"T must be fully defined");
74template <
typename T,
typename =
void>
76 static_assert(
sizeof(
T),
"T must be fully defined");
82 std::void_t<typename std::remove_const_t<T>::IsGarbageCollectedTypeMarker>>
84 static_assert(
sizeof(
T),
"T must be fully defined");
87template <typename T, bool = HasGarbageCollectedTypeMarker<T>::value,
90 static_assert(
sizeof(
T),
"T must be fully defined");
95 static_assert(
sizeof(
T),
"T must be fully defined");
98template <typename T, bool = HasGarbageCollectedTypeMarker<T>::value>
100 static_assert(
sizeof(
T),
"T must be fully defined");
105 static_assert(
sizeof(
T),
"T must be fully defined");
110 : std::integral_constant<bool, IsGarbageCollectedType<T>::value ||
111 IsGarbageCollectedMixinType<T>::value> {
112 static_assert(
sizeof(
T),
"T must be fully defined");
115template <
typename T,
bool = (HasGarbageCollectedTypeMarker<T>::value &&
116 HasGarbageCollectedMixinTypeMarker<T>::value)>
118 static_assert(
sizeof(
T),
"T must be fully defined");
123 static_assert(
sizeof(
T),
"T must be fully defined");
126template <
typename BasicMemberCandidate,
typename WeaknessTag,
127 typename WriteBarrierPolicy>
130 template <
typename T,
typename CheckingPolicy,
typename StorageType>
132 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
138 std::declval<std::decay_t<BasicMemberCandidate>*>()))::value;
166 template <
typename U,
size_t = sizeof(U)>
171 static constexpr bool value =
175template <
typename T,
typename U>
177 std::is_same_v<std::decay_t<T>, std::decay_t<U>>;
179template <
typename B,
typename D>
181 std::is_base_of_v<std::decay_t<B>, std::decay_t<D>> &&
187template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
188 typename CheckingPolicy,
typename StorageType>
190 T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType>> =
true;
constexpr bool IsStrictlyBaseOfV
constexpr bool IsDecayedSameV
constexpr bool IsAnyMemberTypeV
constexpr bool IsTraceableV
constexpr bool IsGarbageCollectedOrMixinTypeV
constexpr bool IsMemberTypeV
constexpr bool IsCompleteV
constexpr bool IsWeakMemberTypeV
constexpr bool IsGarbageCollectedTypeV
constexpr bool IsMemberOrWeakMemberTypeV
constexpr bool IsGarbageCollectedWithMixinTypeV
constexpr bool IsUntracedMemberTypeV
constexpr bool IsAnyMemberTypeV
constexpr bool IsGarbageCollectedMixinTypeV
static std::false_type IsSizeOfKnown(...)
static std::true_type IsSizeOfKnown(U *)
static std::true_type SubclassCheck(const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > *)
static std::false_type SubclassCheck(...)