5 #ifndef INCLUDE_CPPGC_MEMBER_H_
6 #define INCLUDE_CPPGC_MEMBER_H_
10 #include <type_traits>
23 template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
24 typename CheckingPolicy>
25 class BasicMember :
private CheckingPolicy {
33 InitializingWriteBarrier();
34 this->CheckPointer(raw_);
39 template <
typename U,
typename OtherBarrierPolicy,
typename OtherWeaknessTag,
40 typename OtherCheckingPolicy,
41 typename = std::enable_if_t<std::is_base_of<T, U>::value>>
43 const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
44 OtherCheckingPolicy>& other)
47 template <
typename U,
typename PersistentWeaknessPolicy,
48 typename PersistentLocationPolicy,
49 typename PersistentCheckingPolicy,
50 typename = std::enable_if_t<std::is_base_of<T, U>::value>>
53 PersistentLocationPolicy, PersistentCheckingPolicy>&
61 template <
typename U,
typename OtherWeaknessTag,
typename OtherBarrierPolicy,
62 typename OtherCheckingPolicy,
63 typename = std::enable_if_t<std::is_base_of<T, U>::value>>
65 const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
66 OtherCheckingPolicy>& other) {
70 template <
typename U,
typename PersistentWeaknessPolicy,
71 typename PersistentLocationPolicy,
72 typename PersistentCheckingPolicy,
73 typename = std::enable_if_t<std::is_base_of<T, U>::value>>
76 PersistentLocationPolicy, PersistentCheckingPolicy>&
82 AssigningWriteBarrier();
83 this->CheckPointer(
Get());
95 template <
typename OtherWeaknessTag,
typename OtherBarrierPolicy,
96 typename OtherCheckingPolicy>
98 OtherCheckingPolicy>& other) {
104 explicit operator bool()
const {
return Get(); }
105 operator T*()
const {
return Get(); }
114 void Clear() { SetRawAtomic(
nullptr); }
123 void SetRawAtomic(T* raw) {
124 reinterpret_cast<std::atomic<T*>*
>(&raw_)->store(raw,
125 std::memory_order_relaxed);
127 T* GetRawAtomic()
const {
128 return reinterpret_cast<const std::atomic<T*>*
>(&raw_)->load(
129 std::memory_order_relaxed);
132 void InitializingWriteBarrier()
const {
133 WriteBarrierPolicy::InitializingBarrier(
134 reinterpret_cast<const void*
>(&raw_),
static_cast<const void*
>(raw_));
136 void AssigningWriteBarrier()
const {
137 WriteBarrierPolicy::AssigningBarrier(
reinterpret_cast<const void*
>(&raw_),
138 static_cast<const void*
>(raw_));
146 template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
147 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
148 typename WriteBarrierPolicy2,
typename CheckingPolicy2>
153 return member1.Get() == member2.Get();
156 template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
157 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
158 typename WriteBarrierPolicy2,
typename CheckingPolicy2>
163 return !(member1 == member2);
166 template <
typename T,
typename WriteBarrierPolicy,
typename CheckingPolicy>
168 internal::
BasicMember<T, WeakMemberTag, WriteBarrierPolicy, CheckingPolicy>>
178 template <
typename T>
190 template <
typename T>
200 template <
typename T>
206 #endif // INCLUDE_CPPGC_MEMBER_H_