#include #include "slab.h" //------------------------------------------------------------------------------ Buffer::~Buffer() { dec_ref(); } //------------------------------------------------------------------------------ Buffer::Buffer(Buffer&& rhs) { move(std::move(rhs)); } //------------------------------------------------------------------------------ void Buffer::operator = (Buffer&& rhs) { move(std::move(rhs)); } //------------------------------------------------------------------------------ const uint8* Buffer::get_pointer() const { return _slab->get_pointer() + _offset; } //------------------------------------------------------------------------------ uint32 Buffer::get_size() const { return _size; } //------------------------------------------------------------------------------ BufferStream Buffer::create_stream() const { return BufferStream(_slab, get_pointer(), get_size()); } //------------------------------------------------------------------------------ BufferRef Buffer::create_ref() const { return BufferRef(_slab, get_pointer()); } //------------------------------------------------------------------------------ void Buffer::inc_ref() { if (_slab != nullptr) _slab->inc_ref(); } //------------------------------------------------------------------------------ void Buffer::dec_ref() { if (_slab != nullptr) _slab->dec_ref(); _slab = nullptr; } //------------------------------------------------------------------------------ Buffer Buffer::create_sub_buffer(uint32 left, uint32 right) const { right = std::min(right, _size); return create_sub_buffer(get_pointer() + left, right - left); } //------------------------------------------------------------------------------ Buffer Buffer::create_sub_buffer(const uint8* ptr, uint32 size) const { uint32 offset = uint32(ptrdiff_t(ptr - get_pointer())); if (offset >= _size) return Buffer(); Buffer buffer = clone(); buffer._offset += offset; buffer._size = size; return buffer; } //------------------------------------------------------------------------------ void Buffer::move(Buffer&& rhs) { dec_ref(); std::swap(_slab, rhs._slab); std::swap(_offset, rhs._offset); std::swap(_size, rhs._size); } //------------------------------------------------------------------------------ Buffer Buffer::clone() const { Buffer buffer; buffer._slab = _slab; buffer._offset = _offset; buffer._size = _size; buffer.inc_ref(); return buffer; } //------------------------------------------------------------------------------ uint8* MutableBuffer::get_pointer() { return _slab->get_pointer() + _offset; } //------------------------------------------------------------------------------ MutableBuffer::MutableBuffer(Slab* slab, uint32 size, uint32 offset) { _slab = slab; _offset = offset; _size = size; inc_ref(); }