[][src]Struct kernel::common::cells::TakeCell

pub struct TakeCell<'a, T> where
    T: 'a + ?Sized
{ val: UnsafeCell<Option<&'a mut T>>, }

A shared reference to a mutable reference.

A TakeCell wraps potential reference to mutable memory that may be available at a given point. Rather than enforcing borrow rules at compile-time, TakeCell enables multiple clients to hold references to it, but ensures that only one referrer has access to the underlying mutable reference at a time. Clients either move the memory out of the TakeCell or operate on a borrow within a closure. Attempts to take the value from inside a TakeCell may fail by returning None.

Fields

val: UnsafeCell<Option<&'a mut T>>

Methods

impl<'a, T> TakeCell<'a, T> where
    T: ?Sized
[src]

pub fn empty() -> TakeCell<'a, T>[src]

pub fn new(value: &'a mut T) -> TakeCell<'a, T>[src]

Creates a new TakeCell containing value

pub fn is_none(&self) -> bool[src]

pub fn is_some(&self) -> bool[src]

pub fn take(&self) -> Option<&'a mut T>[src]

Takes the mutable reference out of the TakeCell leaving a None in it's place. If the value has already been taken elsewhere (and not replaceed), the returned Option will be empty.

Examples

extern crate tock_cells;
use tock_cells::take_cell::TakeCell;

let mut value = 1234;
let cell = TakeCell::new(&mut value);
let x = &cell;
let y = &cell;

x.take();
assert_eq!(y.take(), None);

pub fn put(&self, val: Option<&'a mut T>)[src]

Stores val in the TakeCell

pub fn replace(&self, val: &'a mut T) -> Option<&'a mut T>[src]

Replaces the contents of the TakeCell with val. If the cell was not empty, the previous value is returned, otherwise None is returned.

pub fn map<F, R>(&self, closure: F) -> Option<R> where
    F: FnOnce(&mut T) -> R, 
[src]

Allows closure to borrow the contents of the TakeCell if-and-only-if it is not taken already. The state of the TakeCell is unchanged after the closure completes.

Examples

extern crate tock_cells;
use tock_cells::take_cell::TakeCell;

let mut value = 1234;
let cell = TakeCell::new(&mut value);
let x = &cell;
let y = &cell;

x.map(|value| {
    // We have mutable access to the value while in the closure
    *value += 1;
});

// After the closure completes, the mutable memory is still in the cell,
// but potentially changed.
assert_eq!(y.take(), Some(&mut 1235));

pub fn map_or<F, R>(&self, default: R, closure: F) -> R where
    F: FnOnce(&mut T) -> R, 
[src]

Performs a map or returns a default value if the TakeCell is empty

pub fn map_or_else<U, D, F>(&self, default: D, f: F) -> U where
    D: FnOnce() -> U,
    F: FnOnce(&mut T) -> U, 
[src]

Performs a map or generates a value with the default closure if the TakeCell is empty

pub fn and_then<F, R>(&self, closure: F) -> Option<R> where
    F: FnOnce(&mut T) -> Option<R>, 
[src]

Behaves the same as map, except the closure is allowed to return an Option.

pub fn modify_or_replace<F, G>(&self, modify: F, mkval: G) where
    F: FnOnce(&mut T),
    G: FnOnce() -> &'a mut T, 
[src]

Uses the first closure (modify) to modify the value in the TakeCell if it is present, otherwise, fills the TakeCell with the result of mkval.

Auto Trait Implementations

impl<'a, T: ?Sized> Unpin for TakeCell<'a, T>

impl<'a, T: ?Sized> Send for TakeCell<'a, T> where
    T: Send

impl<'a, T> !Sync for TakeCell<'a, T>

Blanket Implementations

impl<T> From<T> for T[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]