Struct typed_arena::Arena

source ·
pub struct Arena<T> { /* private fields */ }
Expand description

An arena of objects of type T.

§Example

use typed_arena::Arena;

struct Monster {
    level: u32,
}

let monsters = Arena::new();

let vegeta = monsters.alloc(Monster { level: 9001 });
assert!(vegeta.level > 9000);

Implementations§

source§

impl<T> Arena<T>

source

pub fn new() -> Arena<T>

Construct a new arena.

§Example
use typed_arena::Arena;

let arena = Arena::new();
source

pub fn with_capacity(n: usize) -> Arena<T>

Construct a new arena with capacity for n values pre-allocated.

§Example
use typed_arena::Arena;

let arena = Arena::with_capacity(1337);
source

pub fn alloc(&self, value: T) -> &mut T

Allocates a value in the arena, and returns a mutable reference to that value.

§Example
use typed_arena::Arena;

let arena = Arena::new();
let x = arena.alloc(42);
assert_eq!(*x, 42);
source

pub fn alloc_extend<I>(&self, iterable: I) -> &mut [T]
where I: IntoIterator<Item = T>,

Uses the contents of an iterator to allocate values in the arena. Returns a mutable slice that contains these values.

§Example
use typed_arena::Arena;

let arena = Arena::new();
let abc = arena.alloc_extend("abcdefg".chars().take(3));
assert_eq!(abc, ['a', 'b', 'c']);
source

pub unsafe fn alloc_uninitialized(&self, num: usize) -> *mut [T]

Allocates space for a given number of values, but doesn’t initialize it.

§Unsafety and Undefined Behavior

The same caveats that apply to std::mem::uninitialized apply here:

This is incredibly dangerous and should not be done lightly. Deeply consider initializing your memory with a default value instead.

In particular, it is easy to trigger undefined behavior by allocating uninitialized values, failing to properly initialize them, and then the Arena will attempt to drop them when it is dropped. Initializing an uninitialized value is trickier than it might seem: a normal assignment to a field will attempt to drop the old, uninitialized value, which almost certainly also triggers undefined behavior. You must also consider all the places where your code might “unexpectedly” drop values earlier than it “should” because of unwinding during panics.

source

pub fn uninitialized_array(&self) -> *mut [T]

Returns unused space.

This unused space is still not considered “allocated”. Therefore, it won’t be dropped unless there are further calls to alloc, alloc_uninitialized, or alloc_extend which is why the method is safe.

source

pub fn into_vec(self) -> Vec<T>

Convert this Arena into a Vec<T>.

Items in the resulting Vec<T> appear in the order that they were allocated in.

§Example
use typed_arena::Arena;

let arena = Arena::new();

arena.alloc("a");
arena.alloc("b");
arena.alloc("c");

let easy_as_123 = arena.into_vec();

assert_eq!(easy_as_123, vec!["a", "b", "c"]);

Auto Trait Implementations§

§

impl<T> !Freeze for Arena<T>

§

impl<T> !RefUnwindSafe for Arena<T>

§

impl<T> Send for Arena<T>
where T: Send,

§

impl<T> !Sync for Arena<T>

§

impl<T> Unpin for Arena<T>
where T: Unpin,

§

impl<T> UnwindSafe for Arena<T>
where T: UnwindSafe,

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>,

§

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>,

§

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.