89template <
typename T >
133 &&
"CowPtr::Borrow() requires a 2-byte-aligned payload");
145 return IsBorrowedSlot(mSlot);
156 if (mSlot && !IsBorrowedSlot(mSlot))
168 if (mSlot !=
other.mSlot)
172 if (mSlot && !IsBorrowedSlot(mSlot))
176 if (
old && !IsBorrowedSlot(
old))
189 if (mSlot && !IsBorrowedSlot(mSlot))
206 if (IsBorrowedSlot(mSlot))
208 return BorrowedPayload(mSlot);
210 return mSlot->mPayload;
219 return mSlot && !IsBorrowedSlot(mSlot) &&
CowLoad(mSlot->mRefCount) > 1;
243 template <
typename CLONE >
250 if (IsBorrowedSlot(mSlot))
252 return BorrowedPayload(mSlot);
254 if (mSlot->mImmutable ||
CowLoad(mSlot->mRefCount) > 1)
261 return mSlot->mPayload;
280 if (IsBorrowedSlot(mSlot))
282 return BorrowedPayload(mSlot);
284 assert(!
IsShared() &&
"CowPtr::Mutable() on a shared payload — use Moo(cloner)");
285 return mSlot ? mSlot->mPayload :
NULL;
295 if (mSlot && !IsBorrowedSlot(mSlot))
316 static T* BorrowedPayload(CowControlBlock< T >* slot)
318 return reinterpret_cast< T*
>(
reinterpret_cast< uintptr_t
>(slot) & ~TAG);
321 static void Release(CowControlBlock< T >* block)
325 if (!block->mImmutable)
328 #if BIO_COMPACT_POINTER_STORAGE
335 delete block->mPayload;
338 delete block->mPayload;
bool IsNull() const
Definition CowPtr.h:225
const T * View() const
Definition CowPtr.h:200
~CowPtr()
Definition CowPtr.h:187
T Type
Definition CowPtr.h:93
CowPtr(const CowPtr &other)
Definition CowPtr.h:152
T * Moo(CLONE cloneFn)
Definition CowPtr.h:244
static CowPtr Borrow(T *borrowed)
Definition CowPtr.h:127
CowPtr & operator=(const CowPtr &other)
Definition CowPtr.h:166
CowPtr(T *owned, bool immutable=false)
Definition CowPtr.h:110
CowPtr()
Definition CowPtr.h:98
bool IsShared() const
Definition CowPtr.h:217
bool IsBorrowed() const
Definition CowPtr.h:143
void Reset(T *owned)
Definition CowPtr.h:293
T * Mutable()
Definition CowPtr.h:278
bool Owns(const void *raw)
Definition PointerArena.cpp:2302
void Delete(T *raw)
Definition PointerArena.h:525
Definition FinalCell.h:29
bool CowDecAndIsLast(CowRefCount &count)
Definition CowRefCount.h:98
unsigned int CowLoad(const CowRefCount &count)
Definition CowRefCount.h:103
void CowInc(CowRefCount &count)
Definition CowRefCount.h:93
Definition CowControlBlock.h:36