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 hereThe 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 ArenaBump 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>
impl<'a> FrameContext<'a>
Sourcepub fn new(scratch: &'a Arena) -> FrameContext<'a>
pub fn new(scratch: &'a Arena) -> FrameContext<'a>
A context over one frame’s scratch arena.
Sourcepub fn collect<T, I>(&self, items: I) -> FrameVec<'a, T>where
T: Copy,
I: IntoIterator<Item = T>,
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.
Sourcepub fn filled<T>(&self, len: usize, value: T) -> FrameVec<'a, T>where
T: Copy,
pub fn filled<T>(&self, len: usize, value: T) -> FrameVec<'a, T>where
T: Copy,
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.
Sourcepub fn vec<T>(&self, capacity: usize) -> FrameVec<'a, T>where
T: Copy,
pub fn vec<T>(&self, capacity: usize) -> FrameVec<'a, T>where
T: Copy,
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>
impl<'a> Clone for FrameContext<'a>
Source§fn clone(&self) -> FrameContext<'a>
fn clone(&self) -> FrameContext<'a>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<'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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more