Skip to main content

FrameContext

Struct FrameContext 

Source
pub struct FrameContext<'a> {
    pub scratch: &'a Arena,
}
Expand description

Frame-scoped facilities a system may use for the duration of its step.

The scratch arena is reset by the frame loop, so nothing allocated from it may outlive the step that allocated it. That is enforced rather than documented: reset takes &mut Arena, so the borrow checker will not let the loop reclaim the arena while any allocation from it is still live.

Take the arena out before using the rest of the context:

let scratch = ctx.frame.scratch;   // an &Arena that outlives this borrow
let mut ids = scratch.vec::<Entity>(count)?;
// `ctx` is still free to be used mutably here

The copy matters. scratch is a shared reference with the context’s own lifetime, so copying it out detaches it from the borrow of ctx and leaves the context usable. Reaching through ctx.frame.scratch at each call site instead would hold ctx borrowed for as long as the allocation lives.

Fields§

§scratch: &'a Arena

Bump scratch for temporaries that do not outlive this frame. Returns None when full, which is the caller’s cue to fall back to the heap; the frame loop reports that it happened rather than absorbing it.

Implementations§

Source§

impl<'a> FrameContext<'a>

Source

pub fn new(scratch: &'a Arena) -> Self

A context over one frame’s scratch arena.

Source

pub fn collect<T, I>(&self, items: I) -> FrameVec<'a, T>
where T: Copy, I: IntoIterator<Item = T>,

Gather items into frame scratch, falling back to the heap if the reserve is exhausted.

This is the shape most frame temporaries take: a system reads something out of the context, needs the context mutably to act on it, and so has to copy the values out first to end the borrow. That copy is what the arena is for. Reserves from the iterator’s upper size bound, so anything that knows how much it can yield qualifies – not just ExactSizeIterator. An unbounded iterator goes to the heap rather than guessing a reservation.

Source

pub fn filled<T: Copy>(&self, len: usize, value: T) -> FrameVec<'a, T>

len copies of value in frame scratch, falling back to the heap if the reserve is exhausted.

The mutable counterpart to collect: a working frame a system fills in as it runs, rather than a gathered set it reads back.

Source

pub fn vec<T: Copy>(&self, capacity: usize) -> FrameVec<'a, T>

An empty frame temporary reserving room for capacity pushes, falling back to the heap if the reserve is exhausted.

For the gathers collect cannot express: values found by a loop that also mutates what it walks, so no iterator exists to hand over. Reserve the loop’s upper bound; a push past it moves the values to the heap (see FrameVec::push) rather than failing.

Trait Implementations§

Source§

impl<'a> Clone for FrameContext<'a>

Source§

fn clone(&self) -> FrameContext<'a>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<'a> Copy for FrameContext<'a>

Auto Trait Implementations§

§

impl<'a> !RefUnwindSafe for FrameContext<'a>

§

impl<'a> !Send for FrameContext<'a>

§

impl<'a> !Sync for FrameContext<'a>

§

impl<'a> !UnwindSafe for FrameContext<'a>

§

impl<'a> Freeze for FrameContext<'a>

§

impl<'a> Unpin for FrameContext<'a>

§

impl<'a> UnsafeUnpin for FrameContext<'a>

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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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 = !

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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more