5#ifndef INCLUDE_CPPGC_PERSISTENT_H_
6#define INCLUDE_CPPGC_PERSISTENT_H_
42 mutable const void*
raw_ =
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;
62 : LocationPolicy(loc) {}
66 : LocationPolicy(loc) {}
76 if (!IsValid())
return;
78 .AllocateNode(
this, &TraceAsRoot));
79 this->CheckPointer(
Get());
92 template <
typename U,
typename OtherWeaknessPolicy,
93 typename OtherLocationPolicy,
typename OtherCheckingPolicy,
94 typename = std::enable_if_t<std::is_base_of_v<T, U>>>
98 OtherCheckingPolicy>& other,
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,
118 typename = std::enable_if_t<std::is_base_of_v<T, U>>>
121 U, MemberBarrierPolicy, MemberWeaknessTag,
122 MemberCheckingPolicy, MemberStorageType>& member,
133 template <
typename U,
typename OtherWeaknessPolicy,
134 typename OtherLocationPolicy,
typename OtherCheckingPolicy,
135 typename = std::enable_if_t<std::is_base_of_v<T, U>>>
138 OtherCheckingPolicy>& other) {
144 if (
this == &other)
return *
this;
146 PersistentBase::operator=(std::move(other));
147 LocationPolicy::operator=(std::move(other));
148 if (!IsValid())
return *
this;
152 this->CheckPointer(
Get());
157 template <
typename U,
typename MemberBarrierPolicy,
158 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
159 typename MemberStorageType,
160 typename = std::enable_if_t<std::is_base_of_v<T, U>>>
163 MemberCheckingPolicy, MemberStorageType>&
183 explicit operator bool()
const {
return Get(); }
186 operator T*()
const {
return 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 {};
Definition: persistent.h:54
BasicPersistent(BasicPersistent &&other, SourceLocation loc=SourceLocation::Current()) noexcept
Definition: persistent.h:104
BasicPersistent(SourceLocation loc=SourceLocation::Current())
Definition: persistent.h:60
BasicPersistent(std::nullptr_t, SourceLocation loc=SourceLocation::Current())
Definition: persistent.h:64
T PointeeType
Definition: persistent.h:57
BasicPersistent< U, OtherWeaknessPolicy, OtherLocationPolicy, OtherCheckingPolicy > To() const
Definition: persistent.h:221
BasicPersistent(T &raw, SourceLocation loc=SourceLocation::Current())
Definition: persistent.h:82
BasicPersistent(SentinelPointer s, SourceLocation loc=SourceLocation::Current())
Definition: persistent.h:68
BasicPersistent & operator=(BasicPersistent &&other) noexcept
Definition: persistent.h:143
T * Release()
Definition: persistent.h:210
BasicPersistent(const BasicPersistent< U, OtherWeaknessPolicy, OtherLocationPolicy, OtherCheckingPolicy > &other, SourceLocation loc=SourceLocation::Current())
Definition: persistent.h:96
~BasicPersistent()
Definition: persistent.h:126
void Clear()
Definition: persistent.h:200
T * operator->() const
Definition: persistent.h:187
BasicPersistent & operator=(const BasicPersistent< U, OtherWeaknessPolicy, OtherLocationPolicy, OtherCheckingPolicy > &other)
Definition: persistent.h:136
BasicPersistent & operator=(const BasicPersistent &other)
Definition: persistent.h:129
T & operator*() const
Definition: persistent.h:188
BasicPersistent & operator=(const internal::BasicMember< U, MemberBarrierPolicy, MemberWeaknessTag, MemberCheckingPolicy, MemberStorageType > &member)
Definition: persistent.h:161
BasicPersistent(const BasicPersistent &other, SourceLocation loc=SourceLocation::Current())
Definition: persistent.h:87
BasicPersistent(T *raw, SourceLocation loc=SourceLocation::Current())
Definition: persistent.h:73
T * Get() const
Definition: persistent.h:193
BasicPersistent & operator=(T *other)
Definition: persistent.h:168
BasicPersistent(const internal::BasicMember< U, MemberBarrierPolicy, MemberWeaknessTag, MemberCheckingPolicy, MemberStorageType > &member, SourceLocation loc=SourceLocation::Current())
Definition: persistent.h:120
BasicPersistent & operator=(std::nullptr_t)
Definition: persistent.h:173
BasicPersistent & operator=(SentinelPointer s)
Definition: persistent.h:178
Definition: persistent.h:23
void ClearFromGC() const
Definition: persistent.h:36
const void * GetValue() const
Definition: persistent.h:28
PersistentBase(const void *raw)
Definition: persistent.h:26
void SetValue(const void *value)
Definition: persistent.h:29
PersistentNode * GetNode() const
Definition: persistent.h:31
const void * raw_
Definition: persistent.h:42
PersistentNode * node_
Definition: persistent.h:43
void SetNode(PersistentNode *node)
Definition: persistent.h:32
Definition: persistent-node.h:27
void UpdateOwner(void *owner)
Definition: persistent-node.h:45
Definition: persistent-node.h:78
Definition: visitor.h:470
void Trace(const AnyStrongPersistentType &p)
Definition: visitor.h:479
Definition: v8-source-location.h:22
static constexpr SourceLocation Current(const std::source_location &loc=std::source_location::current())
Definition: v8-source-location.h:28
bool operator!=(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
Definition: member.h:369
bool operator==(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
Definition: member.h:350
Definition: allocation.h:38
constexpr internal::SentinelPointer kSentinelPointer
Definition: sentinel-pointer.h:35
Definition: type-traits.h:30
Definition: sentinel-pointer.h:17
Definition: pointer-policies.h:245
#define V8_CLANG_NO_SANITIZE(what)
defined(V8_TRIVIAL_ABI)
Definition: v8config.h:824