/development/std/mem/raw_buffer.nct
raw_buffer.nct
//! RawBuffer byte projection and destruction.
see ./index.nct
see ./allocation.nct
see ./layout.nct
see ./storage.nct
use /internal/mem.allocation_abort
use /internal/ptr.{from_addr, slice_from_raw_parts, slice_from_raw_parts_mut}
use /ptr.addr
func bytes(buffer: &RawBuffer): &[u8] {
return slice_from_raw_parts(buffer.ptr, buffer.len)
}
func bytes_mut(buffer: &+RawBuffer): &+[u8] {
return slice_from_raw_parts_mut(buffer.ptr, buffer.len)
}
func prefix(buffer: &RawBuffer, len: usize): &[u8]! {
if len > buffer.len {
return invalid_argument()
}
return slice_from_raw_parts(buffer.ptr, len)
}
func prefix_mut(buffer: &+RawBuffer, len: usize): &+[u8]! {
if len > buffer.len {
return invalid_argument()
}
return slice_from_raw_parts_mut(buffer.ptr, len)
}
instance RawBuffer {
method &self.bytes(): &[u8] {
return bytes(self)
}
method &+self.bytes_mut(): &+[u8] {
return bytes_mut(self)
}
method &self.prefix(len: usize): &[u8]! {
return prefix(self, len)?
}
method &+self.prefix_mut(len: usize): &+[u8]! {
return prefix_mut(self, len)?
}
}
drop RawBuffer(&+self) {
if self.len != 0 {
if self.allocator_kind == 0 {
free_pages(addr(self.ptr), self.len)
} else if self.allocator_kind != 1 {
return allocation_abort()
}
self.ptr = from_addr(1)
self.len = 0
}
return
}