Struct caffe2_imports::Cell
1.0.0 · source · pub struct Cell<T>where
T: ?Sized,{ /* private fields */ }
Expand description
A mutable memory location.
Memory layout
Cell<T>
has the same memory layout and caveats as
UnsafeCell<T>
. In particular, this means that
Cell<T>
has the same in-memory representation as its inner type T
.
Examples
In this example, you can see that Cell<T>
enables mutation inside an
immutable struct. In other words, it enables “interior mutability”.
use std::cell::Cell;
struct SomeStruct {
regular_field: u8,
special_field: Cell<u8>,
}
let my_struct = SomeStruct {
regular_field: 0,
special_field: Cell::new(1),
};
let new_value = 100;
// ERROR: `my_struct` is immutable
// my_struct.regular_field = new_value;
// WORKS: although `my_struct` is immutable, `special_field` is a `Cell`,
// which can always be mutated
my_struct.special_field.set(new_value);
assert_eq!(my_struct.special_field.get(), new_value);
See the module-level documentation for more.
Implementations§
source§impl<T> Cell<T>
impl<T> Cell<T>
1.17.0 · sourcepub fn swap(&self, other: &Cell<T>)
pub fn swap(&self, other: &Cell<T>)
Swaps the values of two Cell
s.
Difference with std::mem::swap
is that this function doesn’t require &mut
reference.
Examples
use std::cell::Cell;
let c1 = Cell::new(5i32);
let c2 = Cell::new(10i32);
c1.swap(&c2);
assert_eq!(10, c1.get());
assert_eq!(5, c2.get());
1.17.0 · sourcepub fn replace(&self, val: T) -> T
pub fn replace(&self, val: T) -> T
Replaces the contained value with val
, and returns the old contained value.
Examples
use std::cell::Cell;
let cell = Cell::new(5);
assert_eq!(cell.get(), 5);
assert_eq!(cell.replace(10), 5);
assert_eq!(cell.get(), 10);
1.17.0 (const: unstable) · sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Unwraps the value.
Examples
use std::cell::Cell;
let c = Cell::new(5);
let five = c.into_inner();
assert_eq!(five, 5);
source§impl<T> Cell<T>where
T: Copy,
impl<T> Cell<T>where T: Copy,
sourcepub fn get(&self) -> T
pub fn get(&self) -> T
Returns a copy of the contained value.
Examples
use std::cell::Cell;
let c = Cell::new(5);
let five = c.get();
sourcepub fn update<F>(&self, f: F) -> Twhere
F: FnOnce(T) -> T,
🔬This is a nightly-only experimental API. (cell_update
)
pub fn update<F>(&self, f: F) -> Twhere F: FnOnce(T) -> T,
cell_update
)Updates the contained value using a function and returns the new value.
Examples
#![feature(cell_update)]
use std::cell::Cell;
let c = Cell::new(5);
let new = c.update(|x| x + 1);
assert_eq!(new, 6);
assert_eq!(c.get(), 6);
source§impl<T> Cell<T>where
T: ?Sized,
impl<T> Cell<T>where T: ?Sized,
1.12.0 (const: 1.32.0) · sourcepub const fn as_ptr(&self) -> *mut T
pub const fn as_ptr(&self) -> *mut T
Returns a raw pointer to the underlying data in this cell.
Examples
use std::cell::Cell;
let c = Cell::new(5);
let ptr = c.as_ptr();
1.11.0 · sourcepub fn get_mut(&mut self) -> &mut T
pub fn get_mut(&mut self) -> &mut T
Returns a mutable reference to the underlying data.
This call borrows Cell
mutably (at compile-time) which guarantees
that we possess the only reference.
However be cautious: this method expects self
to be mutable, which is
generally not the case when using a Cell
. If you require interior
mutability by reference, consider using RefCell
which provides
run-time checked mutable borrows through its borrow_mut
method.
Examples
use std::cell::Cell;
let mut c = Cell::new(5);
*c.get_mut() += 1;
assert_eq!(c.get(), 6);
1.37.0 · sourcepub fn from_mut(t: &mut T) -> &Cell<T>
pub fn from_mut(t: &mut T) -> &Cell<T>
Returns a &Cell<T>
from a &mut T
Examples
use std::cell::Cell;
let slice: &mut [i32] = &mut [1, 2, 3];
let cell_slice: &Cell<[i32]> = Cell::from_mut(slice);
let slice_cell: &[Cell<i32>] = cell_slice.as_slice_of_cells();
assert_eq!(slice_cell.len(), 3);
source§impl<T> Cell<[T]>
impl<T> Cell<[T]>
1.37.0 · sourcepub fn as_slice_of_cells(&self) -> &[Cell<T>]
pub fn as_slice_of_cells(&self) -> &[Cell<T>]
Returns a &[Cell<T>]
from a &Cell<[T]>
Examples
use std::cell::Cell;
let slice: &mut [i32] = &mut [1, 2, 3];
let cell_slice: &Cell<[i32]> = Cell::from_mut(slice);
let slice_cell: &[Cell<i32>] = cell_slice.as_slice_of_cells();
assert_eq!(slice_cell.len(), 3);
source§impl<T, const N: usize> Cell<[T; N]>
impl<T, const N: usize> Cell<[T; N]>
sourcepub fn as_array_of_cells(&self) -> &[Cell<T>; N]
🔬This is a nightly-only experimental API. (as_array_of_cells
)
pub fn as_array_of_cells(&self) -> &[Cell<T>; N]
as_array_of_cells
)Returns a &[Cell<T>; N]
from a &Cell<[T; N]>
Examples
#![feature(as_array_of_cells)]
use std::cell::Cell;
let mut array: [i32; 3] = [1, 2, 3];
let cell_array: &Cell<[i32; 3]> = Cell::from_mut(&mut array);
let array_cell: &[Cell<i32>; 3] = cell_array.as_array_of_cells();
Trait Implementations§
§impl<T> AbsDiffEq<Cell<T>> for Cell<T>where
T: AbsDiffEq<T> + Copy,
impl<T> AbsDiffEq<Cell<T>> for Cell<T>where T: AbsDiffEq<T> + Copy,
§fn default_epsilon() -> <T as AbsDiffEq<T>>::Epsilon
fn default_epsilon() -> <T as AbsDiffEq<T>>::Epsilon
§fn abs_diff_eq(
&self,
other: &Cell<T>,
epsilon: <T as AbsDiffEq<T>>::Epsilon
) -> bool
fn abs_diff_eq( &self, other: &Cell<T>, epsilon: <T as AbsDiffEq<T>>::Epsilon ) -> bool
§fn abs_diff_ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool
fn abs_diff_ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool
AbsDiffEq::abs_diff_eq
].source§impl<'a, T> AssignElem<T> for &'a Cell<T>
impl<'a, T> AssignElem<T> for &'a Cell<T>
Assignable element, simply self.set(input)
.
source§fn assign_elem(self, input: T)
fn assign_elem(self, input: T)
input
to the element that self represents.source§impl<'a, T> FromPyObject<'a> for Cell<T>where
T: FromPyObject<'a>,
impl<'a, T> FromPyObject<'a> for Cell<T>where T: FromPyObject<'a>,
1.10.0 · source§impl<T> Ord for Cell<T>where
T: Ord + Copy,
impl<T> Ord for Cell<T>where T: Ord + Copy,
1.10.0 · source§impl<T> PartialOrd<Cell<T>> for Cell<T>where
T: PartialOrd<T> + Copy,
impl<T> PartialOrd<Cell<T>> for Cell<T>where T: PartialOrd<T> + Copy,
§impl<T> RelativeEq<Cell<T>> for Cell<T>where
T: RelativeEq<T> + Copy,
impl<T> RelativeEq<Cell<T>> for Cell<T>where T: RelativeEq<T> + Copy,
§fn default_max_relative() -> <T as AbsDiffEq<T>>::Epsilon
fn default_max_relative() -> <T as AbsDiffEq<T>>::Epsilon
§fn relative_eq(
&self,
other: &Cell<T>,
epsilon: <T as AbsDiffEq<T>>::Epsilon,
max_relative: <T as AbsDiffEq<T>>::Epsilon
) -> bool
fn relative_eq( &self, other: &Cell<T>, epsilon: <T as AbsDiffEq<T>>::Epsilon, max_relative: <T as AbsDiffEq<T>>::Epsilon ) -> bool
§fn relative_ne(
&self,
other: &Rhs,
epsilon: Self::Epsilon,
max_relative: Self::Epsilon
) -> bool
fn relative_ne( &self, other: &Rhs, epsilon: Self::Epsilon, max_relative: Self::Epsilon ) -> bool
RelativeEq::relative_eq
].source§impl<T> ToPyObject for Cell<T>where
T: Copy + ToPyObject,
impl<T> ToPyObject for Cell<T>where T: Copy + ToPyObject,
§impl<T> UlpsEq<Cell<T>> for Cell<T>where
T: UlpsEq<T> + Copy,
impl<T> UlpsEq<Cell<T>> for Cell<T>where T: UlpsEq<T> + Copy,
impl<T, U> CoerceUnsized<Cell<U>> for Cell<T>where T: CoerceUnsized<U>,
impl<T, U> DispatchFromDyn<Cell<U>> for Cell<T>where T: DispatchFromDyn<U>,
impl<T> Eq for Cell<T>where T: Eq + Copy,
impl<T> Send for Cell<T>where T: Send + ?Sized,
impl<T> !Sync for Cell<T>where T: ?Sized,
Auto Trait Implementations§
impl<T> !RefUnwindSafe for Cell<T>
impl<T: ?Sized> Unpin for Cell<T>where T: Unpin,
impl<T: ?Sized> UnwindSafe for Cell<T>where T: UnwindSafe,
Blanket Implementations§
§impl<T> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.