rust-lang / wg-allocators

Home of the Allocators working group: Paving a path for a standard set of allocator traits to be used in collections!
http://bit.ly/hello-wg-allocators
205 stars 9 forks source link

Use a struct to represent a memory block #51

Closed TimDiekmann closed 4 years ago

TimDiekmann commented 4 years ago

EDIT: Removed MemoryLayout<T> as #50 was closed.

While adding ReallocPlacement to get rid of grow_in_place and shrink_in_place I noticed, that neither of them returning a pointer, so the signatures can't be merged. If we restructure the signatures of AllocRef a bit, we'll get a more convenient interface. First, I'll introduce a new struct:

struct MemoryBlock {
    ptr: Unique<u8>,
    layout: Layout,
}

Now, the signatures of AllocRef can be changed:

pub unsafe trait AllocRef {
    fn alloc(
        &mut self,
        layout: Layout,
        init: AllocInit,
    ) -> Result<MemoryBlock, AllocError>;

    unsafe fn dealloc(&mut self, memory: MemoryBlock);

    unsafe fn grow(
        &mut self,
        memory: &mut MemoryBlock,
        new_size: usize,
        placement: ReallocPlacement,
        init: AllocInit,
    ) -> Result<(), AllocError> { ... }

    unsafe fn shrink(
        &mut self,
        memory: &mut MemoryBlock,
        new_size: usize,
        placement: ReallocPlacement,
    ) -> Result<(), AllocError> { ... }
}

This API feels much more rusty. It returns a block when allocating, it's passed as mutable reference, when it is changed, and it's moved out of scope when deallocating.