5#ifndef INCLUDE_CPPGC_MEMBER_H_
6#define INCLUDE_CPPGC_MEMBER_H_
12#include "cppgc/internal/api-constants.h"
13#include "cppgc/internal/member-storage.h"
14#include "cppgc/internal/pointer-policies.h"
15#include "cppgc/sentinel-pointer.h"
16#include "cppgc/type-traits.h"
23template <
typename,
typename,
typename>
33template <
typename StorageType>
36 using RawStorage = StorageType;
44 : raw_(value,
typename RawStorage::AtomicInitializerTag{}) {}
51 return reinterpret_cast<
const void**>(
const_cast<
MemberBase*>(
this));
61 reinterpret_cast<std::atomic<RawStorage>&>(raw_).store(
62 other, std::memory_order_relaxed);
70 friend class MemberDebugHelper;
72 mutable RawStorage raw_;
76template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
77 typename CheckingPolicy,
typename StorageType>
79 private CheckingPolicy {
83 using PointeeType = T;
84 using RawStorage =
typename Base::RawStorage;
90 InitializingWriteBarrier(raw);
99 using AtomicInitializerTag =
typename Base::AtomicInitializerTag;
101 : Base(
nullptr, atomic) {}
105 : Base(raw, atomic) {
106 InitializingWriteBarrier(raw);
119 template <
typename U,
typename OtherBarrierPolicy,
typename OtherWeaknessTag,
120 typename OtherCheckingPolicy,
121 std::enable_if_t<IsDecayedSameV<T, U>>* =
nullptr>
123 const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
124 OtherCheckingPolicy, StorageType>& other)
127 template <
typename U,
typename OtherBarrierPolicy,
typename OtherWeaknessTag,
128 typename OtherCheckingPolicy,
129 std::enable_if_t<IsStrictlyBaseOfV<T, U>>* =
nullptr>
131 const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
132 OtherCheckingPolicy, StorageType>& other)
144 template <
typename U,
typename OtherBarrierPolicy,
typename OtherWeaknessTag,
145 typename OtherCheckingPolicy,
146 std::enable_if_t<IsDecayedSameV<T, U>>* =
nullptr>
148 BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
149 StorageType>&& other)
noexcept
154 template <
typename U,
typename OtherBarrierPolicy,
typename OtherWeaknessTag,
155 typename OtherCheckingPolicy,
156 std::enable_if_t<IsStrictlyBaseOfV<T, U>>* =
nullptr>
158 BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
159 StorageType>&& other)
noexcept
165 template <
typename U,
typename PersistentWeaknessPolicy,
166 typename PersistentLocationPolicy,
167 typename PersistentCheckingPolicy,
170 PersistentLocationPolicy,
171 PersistentCheckingPolicy>& p)
176 return operator=(other.GetRawStorage());
182 template <
typename U,
typename OtherWeaknessTag,
typename OtherBarrierPolicy,
183 typename OtherCheckingPolicy>
185 const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
186 OtherCheckingPolicy, StorageType>& other) {
187 if constexpr (IsDecayedSameV<T, U>) {
188 return operator=(other.GetRawStorage());
190 static_assert(IsStrictlyBaseOfV<T, U>);
191 return operator=(other.Get());
197 operator=(other.GetRawStorage());
205 template <
typename U,
typename OtherWeaknessTag,
typename OtherBarrierPolicy,
206 typename OtherCheckingPolicy>
208 BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
209 StorageType>&& other)
noexcept {
210 if constexpr (IsDecayedSameV<T, U>) {
211 operator=(other.GetRawStorage());
213 static_assert(IsStrictlyBaseOfV<T, U>);
214 operator=(other.Get());
221 template <
typename U,
typename PersistentWeaknessPolicy,
222 typename PersistentLocationPolicy,
223 typename PersistentCheckingPolicy,
227 PersistentLocationPolicy, PersistentCheckingPolicy>&
229 return operator=(other.Get());
233 Base::SetRawAtomic(other);
234 AssigningWriteBarrier(other);
244 Base::SetRawAtomic(s);
248 template <
typename OtherWeaknessTag,
typename OtherBarrierPolicy,
249 typename OtherCheckingPolicy>
251 OtherCheckingPolicy, StorageType>& other) {
271 return static_cast<T*>(
const_cast<
void*>(Base::GetRaw()));
283 return reinterpret_cast<
const T**>(Base::GetRawSlot());
289 V8_INLINE explicit BasicMember(RawStorage raw) : Base(raw) {
290 InitializingWriteBarrier();
295 Base::SetRawStorageAtomic(other);
296 AssigningWriteBarrier();
301 V8_INLINE const void* GetRawAtomic()
const {
return Base::GetRawAtomic(); }
304 return static_cast<
const T*>(GetRawAtomic());
307 V8_INLINE void InitializingWriteBarrier(T* value)
const {
308 WriteBarrierPolicy::InitializingBarrier(Base::GetRawSlot(), value);
310 V8_INLINE void InitializingWriteBarrier()
const {
311 WriteBarrierPolicy::InitializingBarrier(Base::GetRawSlot(),
312 Base::GetRawStorage());
314 V8_INLINE void AssigningWriteBarrier(T* value)
const {
315 WriteBarrierPolicy::
template AssigningBarrier<
316 StorageType::kWriteBarrierSlotType>(Base::GetRawSlot(), value);
318 V8_INLINE void AssigningWriteBarrier()
const {
319 WriteBarrierPolicy::
template AssigningBarrier<
320 StorageType::kWriteBarrierSlotType>(Base::GetRawSlot(),
321 Base::GetRawStorage());
324 CheckingPolicy::
template CheckPointer<T>(value);
327 CheckingPolicy::
template CheckPointer<T>(Base::GetRawStorage());
330 V8_INLINE void ClearFromGC()
const { Base::ClearFromGC(); }
332 V8_INLINE T* GetFromGC()
const {
return Get(); }
335 template <
typename,
typename,
typename>
338 template <
typename U>
340 template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
341 typename CheckingPolicy1,
typename StorageType1>
346template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
347 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
348 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
349 typename StorageType>
351 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
352 StorageType>& member1,
353 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
354 StorageType>& member2) {
355 if constexpr (IsDecayedSameV<T1, T2>) {
357 return member1.GetRawStorage() == member2.GetRawStorage();
359 static_assert(IsStrictlyBaseOfV<T1, T2> || IsStrictlyBaseOfV<T2, T1>);
361 return member1.Get() == member2.Get();
365template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
366 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
367 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
368 typename StorageType>
370 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
371 StorageType>& member1,
372 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
373 StorageType>& member2) {
374 return !(member1 == member2);
378template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
379 typename CheckingPolicy,
typename StorageType,
typename U>
381 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
382 StorageType>& member,
385 static_assert(!IsDecayedSameV<
void, U>);
387 if constexpr (IsDecayedSameV<T, U>) {
389 return member.GetRawStorage() == StorageType(raw);
390 }
else if constexpr (IsStrictlyBaseOfV<T, U>) {
392 return member.GetRawStorage() == StorageType(
static_cast<T*>(raw));
395 return member.Get() == raw;
399template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
400 typename CheckingPolicy,
typename StorageType,
typename U>
402 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
403 StorageType>& member,
405 return !(member == raw);
408template <
typename T,
typename U,
typename WeaknessTag,
409 typename WriteBarrierPolicy,
typename CheckingPolicy,
410 typename StorageType>
412 T* raw,
const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
413 CheckingPolicy, StorageType>& member) {
414 return member == raw;
417template <
typename T,
typename U,
typename WeaknessTag,
418 typename WriteBarrierPolicy,
typename CheckingPolicy,
419 typename StorageType>
421 T* raw,
const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
422 CheckingPolicy, StorageType>& member) {
423 return !(raw == member);
427template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
428 typename CheckingPolicy,
typename StorageType>
430 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
431 StorageType>& member,
433 return member.GetRawStorage().IsSentinel();
436template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
437 typename CheckingPolicy,
typename StorageType>
439 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
440 StorageType>& member,
442 return !(member == s);
445template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
446 typename CheckingPolicy,
typename StorageType>
449 CheckingPolicy, StorageType>& member) {
453template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
454 typename CheckingPolicy,
typename StorageType>
457 CheckingPolicy, StorageType>& member) {
458 return !(s == member);
462template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
463 typename CheckingPolicy,
typename StorageType>
465 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
466 StorageType>& member,
468 return !
static_cast<
bool>(member);
471template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
472 typename CheckingPolicy,
typename StorageType>
474 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
475 StorageType>& member,
477 return !(member == n);
480template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
481 typename CheckingPolicy,
typename StorageType>
483 std::nullptr_t n,
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
484 CheckingPolicy, StorageType>& member) {
488template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
489 typename CheckingPolicy,
typename StorageType>
491 std::nullptr_t n,
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
492 CheckingPolicy, StorageType>& member) {
493 return !(n == member);
497template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
498 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
499 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
500 typename StorageType>
502 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
503 StorageType>& member1,
504 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
505 StorageType>& member2) {
507 IsDecayedSameV<T1, T2>,
508 "Comparison works only for same pointer type modulo cv-qualifiers");
509 return member1.GetRawStorage() < member2.GetRawStorage();
512template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
513 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
514 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
515 typename StorageType>
517 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
518 StorageType>& member1,
519 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
520 StorageType>& member2) {
522 IsDecayedSameV<T1, T2>,
523 "Comparison works only for same pointer type modulo cv-qualifiers");
524 return member1.GetRawStorage() <= member2.GetRawStorage();
527template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
528 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
529 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
530 typename StorageType>
532 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
533 StorageType>& member1,
534 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
535 StorageType>& member2) {
537 IsDecayedSameV<T1, T2>,
538 "Comparison works only for same pointer type modulo cv-qualifiers");
539 return member1.GetRawStorage() > member2.GetRawStorage();
542template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
543 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
544 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
545 typename StorageType>
547 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
548 StorageType>& member1,
549 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
550 StorageType>& member2) {
552 IsDecayedSameV<T1, T2>,
553 "Comparison works only for same pointer type modulo cv-qualifiers");
554 return member1.GetRawStorage() >= member2.GetRawStorage();
557template <
typename T,
typename WriteBarrierPolicy,
typename CheckingPolicy,
558 typename StorageType>
560 StorageType>> : std::true_type {};
565
566
567
568
575
576
577
578
579
580
581
588
589
590
591
592
601
602
603
609#if defined(CPPGC_POINTER_COMPRESSION)
611
612
613
626static constexpr size_t kSizeOfMember =
sizeof(
Member<
Dummy>);
627static constexpr size_t kSizeOfUncompressedMember =
629#if defined(CPPGC_POINTER_COMPRESSION)
648template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
649 typename CheckingPolicy,
typename StorageType,
650 template <
typename>
typename TQ,
template <
typename>
typename UQ>
651struct std::basic_common_reference<
652 cppgc::internal::BasicMember<T, WeaknessTag, WriteBarrierPolicy,
653 CheckingPolicy, StorageType>,
658template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
659 typename CheckingPolicy,
typename StorageType,
660 template <
typename>
typename TQ,
template <
typename>
typename UQ>
661struct std::basic_common_reference<
663 cppgc::internal::BasicMember<T, WeaknessTag, WriteBarrierPolicy,
664 CheckingPolicy, StorageType>,
friend class internal::BasicPersistent
V8_INLINE BasicMember & operator=(BasicMember< U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &&other) noexcept
V8_INLINE operator bool() const
V8_INLINE BasicMember(T &raw)
V8_INLINE T * operator->() const
V8_INLINE constexpr BasicMember()=default
V8_INLINE BasicMember & operator=(T *other)
friend class cppgc::subtle::TaggedUncompressedMember
V8_INLINE BasicMember & operator=(const BasicPersistent< U, PersistentWeaknessPolicy, PersistentLocationPolicy, PersistentCheckingPolicy > &other)
V8_INLINE BasicMember(BasicMember< U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &&other) noexcept
V8_INLINE BasicMember(T &raw, AtomicInitializerTag atomic)
V8_INLINE RawStorage GetRawStorage() const
V8_INLINE void Swap(BasicMember< T, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &other)
V8_INLINE operator T*() const
V8_INLINE BasicMember(const BasicMember< U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &other)
V8_INLINE T & operator*() const
V8_INLINE BasicMember & operator=(const BasicMember &other)
V8_INLINE BasicMember(T *raw, AtomicInitializerTag atomic)
V8_INLINE const T ** GetSlotForTesting() const
V8_INLINE BasicMember & operator=(const BasicMember< U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &other)
V8_INLINE BasicMember & operator=(std::nullptr_t)
V8_INLINE constexpr BasicMember(std::nullptr_t)
V8_INLINE BasicMember(BasicMember &&other) noexcept
V8_INLINE BasicMember & operator=(BasicMember &&other) noexcept
V8_INLINE BasicMember(std::nullptr_t, AtomicInitializerTag atomic)
V8_INLINE BasicMember(SentinelPointer s, AtomicInitializerTag atomic)
V8_INLINE BasicMember(T *raw)
V8_INLINE BasicMember & operator=(SentinelPointer s)
V8_INLINE BasicMember(const BasicMember &other)
V8_INLINE BasicMember(SentinelPointer s)
V8_INLINE BasicMember(const BasicPersistent< U, PersistentWeaknessPolicy, PersistentLocationPolicy, PersistentCheckingPolicy > &p)
V8_INLINE MemberBase(std::nullptr_t)
V8_INLINE MemberBase(const void *value)
V8_INLINE const void * GetRawAtomic() const
V8_INLINE RawStorage GetRawStorage() const
V8_INLINE const void * GetRaw() const
V8_INLINE void SetRawStorageAtomic(RawStorage other)
V8_INLINE void SetRaw(void *value)
V8_INLINE MemberBase(const void *value, AtomicInitializerTag)
V8_INLINE void ClearFromGC() const
V8_INLINE MemberBase()=default
V8_INLINE const void ** GetRawSlot() const
V8_INLINE bool IsCleared() const
V8_INLINE MemberBase(SentinelPointer s)
V8_INLINE void SetRawAtomic(const void *value)
V8_INLINE MemberBase(RawStorage raw)
V8_INLINE bool operator==(T *raw, const BasicMember< U, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member)
V8_INLINE bool operator<(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
V8_INLINE bool operator>(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
V8_INLINE bool operator==(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
V8_INLINE bool operator!=(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
V8_INLINE bool operator<=(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
V8_INLINE bool operator!=(const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member, std::nullptr_t n)
V8_INLINE bool operator==(const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member, U *raw)
V8_INLINE bool operator==(const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member, std::nullptr_t)
V8_INLINE bool operator!=(T *raw, const BasicMember< U, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member)
V8_INLINE bool operator!=(const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member, SentinelPointer s)
V8_INLINE bool operator==(SentinelPointer s, const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member)
V8_INLINE bool operator!=(std::nullptr_t n, const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member)
V8_INLINE bool operator==(const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member, SentinelPointer)
V8_INLINE bool operator!=(const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member, U *raw)
V8_INLINE bool operator>=(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
V8_INLINE bool operator==(std::nullptr_t n, const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member)
V8_INLINE bool operator!=(SentinelPointer s, const BasicMember< T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy, StorageType > &member)
#define V8_CLANG_NO_SANITIZE(what)
defined(V8_TRIVIAL_ABI)