Struct Allocator

Source
pub struct Allocator { /* private fields */ }
Expand description

A super-simple soft-realtime allocator for managing an external pool of memory

Implementations§

Source§

impl Allocator

Source

pub fn new(capacity: u32) -> Self

Create a new allocator to manage a pool of memory

Panics:

  • Panics if capacity == 0
Source

pub fn alloc(&mut self, size: u32) -> Option<Allocation>

Try to allocate a region with the provided size

Uses a best-fit strategy, and returns Allocations with arbitrary alignment.

Returns None if:

  • size == 0, or
  • size + 1 overflows.
Source

pub fn alloc_with_align(&mut self, size: u32, align: u32) -> Option<Allocation>

Try to allocate a region with the provided size & alignment

Implements the following strategy (not quite best-fit):

  • Search for a region with at least size + align - 1, and then truncate the start of the region such that alignment is reached.

This is more prone to causing fragmentation compared to an unaligned alloc.

Returns None if:

  • there are no free-regions with size + align - 1 available space, or
  • size == 0, or
  • align == 0, or
  • size + align overflows.
Source

pub fn free(&mut self, alloc: Allocation)

Free the given allocation

§Panics
  • May panic if the allocation’s location gets freed twice, without first being re-allocated.

    Note: This panic will not catch all double frees.

Source

pub fn reset(&mut self)

Free all allocations

Source

pub fn grow_capacity(&mut self, additional: u32) -> Result<(), Overflow>

Add new free space at the end of the allocator

Returns Err(Overflow) if self.capacity + additional would overflow.

Source

pub fn try_reallocate( &mut self, alloc: Allocation, new_size: u32, ) -> Result<Allocation, ReallocateError>

Try to re-size an existing allocation in-place

Will not change the offset of the allocation and tries to expand the allocation to the right if there is sufficient free space.

Returns:

  • Ok(Allocation) on success.
  • Err(InsufficientSpace) if there is not enough available space to expand the allocation to new_size. In this case, the existing allocation is left untouched.
Source

pub fn capacity(&self) -> u32

Get the total capacity of the pool

Source

pub fn total_available(&self) -> u32

Get the total available memory in this pool

Note: The memory may be fragmented, so it may not be possible to allocate an object of this size.

Source

pub fn largest_available(&self) -> u32

Get the size of the largest available memory region in this pool

Source

pub fn is_empty(&self) -> bool

Returns true if there are no allocations

Source

pub fn report_free_regions(&self) -> impl Iterator<Item = Allocation> + use<'_>

Returns an iterator over the unallocated regions

This should be used only for gathering metadata about the internal state of the allocator for debugging purposes.

You must not use this instead of allocating; subsequent calls to alloc will freely allocate from the reported regions.

Trait Implementations§

Source§

impl Clone for Allocator

Source§

fn clone(&self) -> Allocator

Returns a duplicate of the value. Read more
1.0.0 · Source§

const fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Allocator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.