Struct PacCell

Source
pub struct PacCell<P, C>(/* private fields */);
Expand description

A cell of a parent and a child, which is created by mutably borrowing the parent. While the parent is in the cell, it cannot be accessed in any way. Provides mutable access to the child.

This is useful in a rare case when you need to store and move both parent and their child together.

§Examples

Basic usage:

struct Hello {
    world: i64,
}
let hello = Hello { world: 10 };

let mut pac = pac_cell::PacCell::new(hello, |h| &mut h.world);

let initial = pac.with_mut(|world| {
    let i = **world;
    **world = 12;
    i
});
assert_eq!(initial, 10);

let hello_again = pac.unwrap();
assert_eq!(hello_again.world, 12);

For a real-world-like example, see the crate tests.

Implementations§

Source§

impl<'p, P: 'p, C> PacCell<P, C>

Source

pub fn new<F>(parent: P, child_constructor: F) -> Self
where F: FnOnce(&'p mut P) -> C,

Creates Pac by moving the parent into a Box and then calling the child constructor.

Source

pub fn try_new<F, E>(parent: P, child_constructor: F) -> Result<Self, E>
where F: FnOnce(&'p mut P) -> Result<C, E>,

Creates Pac by moving the parent into a Box and then calling the child constructor.

Source

pub fn with_mut<F, R>(&mut self, f: F) -> R
where F: FnOnce(&mut C) -> R,

Executes a function with a mutable reference to the child.

Source

pub fn unwrap(self) -> P

Drop the child and return the parent.

Auto Trait Implementations§

§

impl<P, C> Freeze for PacCell<P, C>

§

impl<P, C> !RefUnwindSafe for PacCell<P, C>

§

impl<P, C> Send for PacCell<P, C>
where P: Send, C: Send,

§

impl<P, C> !Sync for PacCell<P, C>

§

impl<P, C> Unpin for PacCell<P, C>

§

impl<P, C> UnwindSafe for PacCell<P, C>
where P: UnwindSafe, C: 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>,

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.