ChainAllocator

Struct ChainAllocator 

Source
pub struct ChainAllocator<A, F> { /* private fields */ }
Expand description

A ChainAllocator<A> create a new allocator of type A when the existing allocators of this type are exausted.

It can be useful when used with a LinearAllocator for example. When all of its memory is used, the ChainAllocator will create a new one. This is useful when you want to use fixed-sized allocators but you’re worried that your program will run out of memory.

There’s some overhead when using the ChainAllocator. Currently, every allocation has an extra pointer that refers to the allocator, to make deallocation possible. Also the allocators themselves are allocated using the Box.

§Usage:

#![cfg_attr(not(feature = "stable"), feature(allocator_api))]
#[cfg(feature="vec")]
{
    use core::mem::size_of;

    use piece::vec::Vec;
    use piece::LinearAllocator;
    use piece::ChainAllocator;

    // Make room for the allocator pointer
    let chain_allocator = ChainAllocator::new(|| {
        LinearAllocator::with_capacity(32 * size_of::<i32>() + size_of::<*const ()>())
    });

    // Create two vectors that fills the whole `LinearAllocator` so
    // each `Vec` creates a new allocator
    let mut vec1 = Vec::with_capacity_in(32, &chain_allocator);
    let mut vec2 = Vec::with_capacity_in(32, &chain_allocator);

    vec1.extend_from_slice(&[1, 2, 3, 4, 5]);
    vec2.extend_from_slice(&[6, 7, 8, 9, 10]);

    assert_eq!(vec1, &[1, 2, 3, 4, 5]);
    assert_eq!(vec2, &[6, 7, 8, 9, 10]);

    assert_eq!(2, chain_allocator.allocator_count());
}

Implementations§

Source§

impl<A, F> ChainAllocator<A, F>
where F: Fn() -> A,

Source

pub const fn new(allocator_factory: F) -> Self

Creates a empty ChainAllocator<A>. allocator_factory should create a fresh allocator.

Source

pub fn allocator_count(&self) -> usize

Returns the number of allocators created by this ChainAllocator<A>.

Trait Implementations§

Source§

impl<A, F> Allocator for ChainAllocator<A, F>
where A: Allocator, F: Fn() -> A,

Source§

fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)
Attempts to allocate a block of memory. Read more
Source§

unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout)

🔬This is a nightly-only experimental API. (allocator_api)
Deallocates the memory referenced by ptr. Read more
Source§

unsafe fn grow( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout, ) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)
Attempts to extend the memory block. Read more
Source§

unsafe fn grow_zeroed( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout, ) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)
Behaves like grow, but also ensures that the new contents are set to zero before being returned. Read more
Source§

unsafe fn shrink( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout, ) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)
Attempts to shrink the memory block. Read more
Source§

fn allocate_zeroed(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api)
Behaves like allocate, but also ensures that the returned memory is zero-initialized. Read more
Source§

fn by_ref(&self) -> &Self
where Self: Sized,

🔬This is a nightly-only experimental API. (allocator_api)
Creates a “by reference” adapter for this instance of Allocator. Read more
Source§

impl<A, F> Drop for ChainAllocator<A, F>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<A: Send, F> Send for ChainAllocator<A, F>

Auto Trait Implementations§

§

impl<A, F> !Freeze for ChainAllocator<A, F>

§

impl<A, F> !RefUnwindSafe for ChainAllocator<A, F>

§

impl<A, F> !Sync for ChainAllocator<A, F>

§

impl<A, F> Unpin for ChainAllocator<A, F>
where F: Unpin, A: Unpin,

§

impl<A, F> !UnwindSafe for ChainAllocator<A, F>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.