pub trait Place<Data> where Data: ?Sized, { fn pointer(&mut self) -> *mut Data; }
Both PLACE <- EXPR
and box EXPR
desugar into expressions that allocate an intermediate "place" that holds uninitialized state. The desugaring evaluates EXPR, and writes the result at the address returned by the pointer
method of this trait.
A Place
can be thought of as a special representation for a hypothetical &uninit
reference (which Rust cannot currently express directly). That is, it represents a pointer to uninitialized storage.
The client is responsible for two steps: First, initializing the payload (it can access its address via pointer
). Second, converting the agent to an instance of the owning pointer, via the appropriate finalize
method (see the InPlace
.
If evaluating EXPR fails, then it is up to the destructor for the implementation of Place to clean up any intermediate state (e.g. deallocate box storage, pop a stack, etc).
fn pointer(&mut self) -> *mut Data
Returns the address where the input value will be written. Note that the data at this address is generally uninitialized, and thus one should use ptr::write
for initializing it.
impl<'a, T> Place<T> for PlaceFront<'a, T>
impl<'a, T> Place<T> for BinaryHeapPlace<'a, T> where
T: Clone + Ord,
impl<'a, T> Place<T> for BackPlace<'a, T>
impl<'a, T> Place<T> for std::vec::PlaceBack<'a, T>
impl<'a, T> Place<T> for FrontPlace<'a, T>
impl<'a, T> Place<T> for std::collections::vec_deque::PlaceBack<'a, T>
impl<T> Place<T> for IntermediateBox<T>
impl<'a, K, V> Place<V> for EntryPlace<'a, K, V>
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/std/ops/trait.Place.html