5#ifndef INCLUDE_CPPGC_PERSISTENT_H_
6#define INCLUDE_CPPGC_PERSISTENT_H_
10#include "cppgc/internal/persistent-node.h"
11#include "cppgc/internal/pointer-policies.h"
12#include "cppgc/sentinel-pointer.h"
13#include "cppgc/source-location.h"
14#include "cppgc/type-traits.h"
15#include "cppgc/visitor.h"
42 mutable const void*
raw_ =
nullptr;
43 mutable PersistentNode*
node_ =
nullptr;
49template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
50 typename CheckingPolicy>
52 public LocationPolicy,
53 private WeaknessPolicy,
54 private CheckingPolicy {
56 using typename WeaknessPolicy::IsStrongPersistent;
57 using PointeeType = T;
61 SourceLocation loc = SourceLocation::Current())
62 : LocationPolicy(loc) {}
65 SourceLocation loc = SourceLocation::Current())
66 : LocationPolicy(loc) {}
74 SourceLocation loc = SourceLocation::Current())
76 if (!IsValid())
return;
78 .AllocateNode(
this, &TraceAsRoot)
);
79 this->CheckPointer(Get());
83 SourceLocation loc = SourceLocation::Current())
88 SourceLocation loc = SourceLocation::Current())
92 template <
typename U,
typename OtherWeaknessPolicy,
93 typename OtherLocationPolicy,
typename OtherCheckingPolicy,
98 OtherCheckingPolicy>& other,
99 SourceLocation loc = SourceLocation::Current())
105 SourceLocation loc = SourceLocation::Current())
noexcept
106 :
PersistentBase(std::move(other)), LocationPolicy(std::move(other)) {
107 if (!IsValid())
return;
109 other.SetValue(
nullptr);
110 other.SetNode(
nullptr);
111 this->CheckPointer(Get());
115 template <
typename U,
typename MemberBarrierPolicy,
116 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
117 typename MemberStorageType,
121 U, MemberBarrierPolicy, MemberWeaknessTag,
122 MemberCheckingPolicy, MemberStorageType>& member,
123 SourceLocation loc = SourceLocation::Current())
130 return operator=(other.Get());
133 template <
typename U,
typename OtherWeaknessPolicy,
134 typename OtherLocationPolicy,
typename OtherCheckingPolicy,
138 OtherCheckingPolicy>& other) {
139 return operator=(other.Get());
144 if (
this == &other)
return *
this;
147 LocationPolicy::operator=(std::move(other));
148 if (!IsValid())
return *
this;
150 other.SetValue(
nullptr);
151 other.SetNode(
nullptr);
152 this->CheckPointer(Get());
157 template <
typename U,
typename MemberBarrierPolicy,
158 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
159 typename MemberStorageType,
163 MemberCheckingPolicy, MemberStorageType>&
165 return operator=(member.Get());
197 return static_cast<T*>(
const_cast<
void*>(
GetValue()));
216 template <
typename U,
typename OtherWeaknessPolicy = WeaknessPolicy,
217 typename OtherLocationPolicy = LocationPolicy,
218 typename OtherCheckingPolicy = CheckingPolicy>
223 OtherCheckingPolicy>(
static_cast<U*>(Get()));
227 static void TraceAsRoot(RootVisitor& root_visitor,
const void* ptr) {
231 bool IsValid()
const {
238 void Assign(T* ptr) {
243 this->CheckPointer(ptr);
250 if (!IsValid())
return;
252 .AllocateNode(
this, &TraceAsRoot)
);
253 this->CheckPointer(Get());
256 void ClearFromGC()
const {
265 T* GetFromGC()
const {
266 return static_cast<T*>(
const_cast<
void*>(
GetValue()));
272template <
typename T1,
typename WeaknessPolicy1,
typename LocationPolicy1,
273 typename CheckingPolicy1,
typename T2,
typename WeaknessPolicy2,
274 typename LocationPolicy2,
typename CheckingPolicy2>
276 CheckingPolicy1>& p1,
278 CheckingPolicy2>& p2) {
279 return p1.Get() == p2.Get();
282template <
typename T1,
typename WeaknessPolicy1,
typename LocationPolicy1,
283 typename CheckingPolicy1,
typename T2,
typename WeaknessPolicy2,
284 typename LocationPolicy2,
typename CheckingPolicy2>
286 CheckingPolicy1>& p1,
288 CheckingPolicy2>& p2) {
292template <
typename T1,
typename PersistentWeaknessPolicy,
293 typename PersistentLocationPolicy,
typename PersistentCheckingPolicy,
294 typename T2,
typename MemberWriteBarrierPolicy,
295 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
296 typename MemberStorageType>
299 PersistentLocationPolicy, PersistentCheckingPolicy>&
301 const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
302 MemberCheckingPolicy, MemberStorageType>& m) {
303 return p.Get() == m.Get();
306template <
typename T1,
typename PersistentWeaknessPolicy,
307 typename PersistentLocationPolicy,
typename PersistentCheckingPolicy,
308 typename T2,
typename MemberWriteBarrierPolicy,
309 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
310 typename MemberStorageType>
313 PersistentLocationPolicy, PersistentCheckingPolicy>&
315 const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
316 MemberCheckingPolicy, MemberStorageType>& m) {
320template <
typename T1,
typename MemberWriteBarrierPolicy,
321 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
322 typename MemberStorageType,
typename T2,
323 typename PersistentWeaknessPolicy,
typename PersistentLocationPolicy,
324 typename PersistentCheckingPolicy>
326 const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
327 MemberCheckingPolicy, MemberStorageType>& m,
329 PersistentLocationPolicy, PersistentCheckingPolicy>&
331 return m.Get() == p.Get();
334template <
typename T1,
typename MemberWriteBarrierPolicy,
335 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
336 typename MemberStorageType,
typename T2,
337 typename PersistentWeaknessPolicy,
typename PersistentLocationPolicy,
338 typename PersistentCheckingPolicy>
340 const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
341 MemberCheckingPolicy, MemberStorageType>& m,
343 PersistentLocationPolicy, PersistentCheckingPolicy>&
348template <
typename T,
typename LocationPolicy,
typename CheckingPolicy>
350 CheckingPolicy>> : std::true_type {};
354
355
356
357
358
359
365
366
367
368
369
friend class internal::BasicPersistent
BasicPersistent & operator=(BasicPersistent &&other) noexcept
BasicPersistent(T *raw, SourceLocation loc=SourceLocation::Current())
BasicPersistent(const internal::BasicMember< U, MemberBarrierPolicy, MemberWeaknessTag, MemberCheckingPolicy, MemberStorageType > &member, SourceLocation loc=SourceLocation::Current())
BasicPersistent & operator=(T *other)
BasicPersistent & operator=(std::nullptr_t)
BasicPersistent(SentinelPointer s, SourceLocation loc=SourceLocation::Current())
BasicPersistent(BasicPersistent &&other, SourceLocation loc=SourceLocation::Current()) noexcept
BasicPersistent & operator=(SentinelPointer s)
BasicPersistent< U, OtherWeaknessPolicy, OtherLocationPolicy, OtherCheckingPolicy > To() const
BasicPersistent(std::nullptr_t, SourceLocation loc=SourceLocation::Current())
BasicPersistent(const BasicPersistent &other, SourceLocation loc=SourceLocation::Current())
BasicPersistent(SourceLocation loc=SourceLocation::Current())
BasicPersistent & operator=(const BasicPersistent &other)
BasicPersistent & operator=(const BasicPersistent< U, OtherWeaknessPolicy, OtherLocationPolicy, OtherCheckingPolicy > &other)
BasicPersistent(const BasicPersistent< U, OtherWeaknessPolicy, OtherLocationPolicy, OtherCheckingPolicy > &other, SourceLocation loc=SourceLocation::Current())
BasicPersistent(T &raw, SourceLocation loc=SourceLocation::Current())
BasicPersistent & operator=(const internal::BasicMember< U, MemberBarrierPolicy, MemberWeaknessTag, MemberCheckingPolicy, MemberStorageType > &member)
const void * GetValue() const
PersistentBase(const void *raw)
void SetValue(const void *value)
PersistentNode * GetNode() const
void SetNode(PersistentNode *node)
bool operator==(const BasicMember< T2, MemberWeaknessTag, MemberWriteBarrierPolicy, MemberCheckingPolicy, MemberStorageType > &m, const BasicPersistent< T1, PersistentWeaknessPolicy, PersistentLocationPolicy, PersistentCheckingPolicy > &p)
bool operator!=(const BasicMember< T2, MemberWeaknessTag, MemberWriteBarrierPolicy, MemberCheckingPolicy, MemberStorageType > &m, const BasicPersistent< T1, PersistentWeaknessPolicy, PersistentLocationPolicy, PersistentCheckingPolicy > &p)
bool operator==(const BasicPersistent< T1, WeaknessPolicy1, LocationPolicy1, CheckingPolicy1 > &p1, const BasicPersistent< T2, WeaknessPolicy2, LocationPolicy2, CheckingPolicy2 > &p2)
bool operator!=(const BasicPersistent< T1, PersistentWeaknessPolicy, PersistentLocationPolicy, PersistentCheckingPolicy > &p, const BasicMember< T2, MemberWeaknessTag, MemberWriteBarrierPolicy, MemberCheckingPolicy, MemberStorageType > &m)
bool operator==(const BasicPersistent< T1, PersistentWeaknessPolicy, PersistentLocationPolicy, PersistentCheckingPolicy > &p, const BasicMember< T2, MemberWeaknessTag, MemberWriteBarrierPolicy, MemberCheckingPolicy, MemberStorageType > &m)
bool operator!=(const BasicPersistent< T1, WeaknessPolicy1, LocationPolicy1, CheckingPolicy1 > &p1, const BasicPersistent< T2, WeaknessPolicy2, LocationPolicy2, CheckingPolicy2 > &p2)
constexpr internal::SentinelPointer kSentinelPointer
#define V8_CLANG_NO_SANITIZE(what)
defined(V8_TRIVIAL_ABI)