Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/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
}