#include #include "slab.h" //------------------------------------------------------------------------------ Pointer::Pointer(Slab* slab, const uint8* ptr) : _ptr(uintptr(ptr)) , _pinned(0) { uintptr bias = (uintptr(ptr) - uintptr(slab)) / alignof(Slab); _slab_offset = bias; } //------------------------------------------------------------------------------ Pointer::Pointer(Pointer&& rhs) { *this = std::move(rhs); } //------------------------------------------------------------------------------ Pointer::~Pointer() { if (_pinned) get_slab()->dec_ref(); } //------------------------------------------------------------------------------ void Pointer::operator = (Pointer&& rhs) { std::swap(_value, rhs._value); } //------------------------------------------------------------------------------ bool Pointer::is_valid() const { return _ptr != 0; } //------------------------------------------------------------------------------ void Pointer::pin() { if (!_pinned) get_slab()->inc_ref(); _pinned = 1; } //------------------------------------------------------------------------------ const uint8* Pointer::get() const { return (uint8*)_ptr; } //------------------------------------------------------------------------------ Slab* Pointer::get_slab() const { uintptr bias = _slab_offset * alignof(Slab); bias += uintptr(_ptr) & (alignof(Slab) - 1); return (Slab*)(_ptr - bias); } //------------------------------------------------------------------------------ BufferRef::BufferRef(Slab* slab, const uint8* ptr) : Pointer(slab, ptr) { pin(); }