pub struct InterruptRefCell<T: ?Sized> { /* private fields */ }
Expand description
A mutable memory location with dynamically checked borrow rules
See the module-level documentation for more.
Implementations§
Source§impl<T> InterruptRefCell<T>
impl<T> InterruptRefCell<T>
Sourcepub const fn new(value: T) -> Self
pub const fn new(value: T) -> Self
Creates a new InterruptRefCell
containing value
.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
Sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Consumes the InterruptRefCell
, returning the wrapped value.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
let five = c.into_inner();
Sourcepub fn replace(&self, t: T) -> T
pub fn replace(&self, t: T) -> T
Replaces the wrapped value with a new one, returning the old value, without deinitializing either one.
This function corresponds to std::mem::replace
.
§Panics
Panics if the value is currently borrowed.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let cell = InterruptRefCell::new(5);
let old_value = cell.replace(6);
assert_eq!(old_value, 5);
assert_eq!(cell, InterruptRefCell::new(6));
Sourcepub fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T
pub fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T
Replaces the wrapped value with a new one computed from f
, returning
the old value, without deinitializing either one.
§Panics
Panics if the value is currently borrowed.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let cell = InterruptRefCell::new(5);
let old_value = cell.replace_with(|&mut old| old + 1);
assert_eq!(old_value, 5);
assert_eq!(cell, InterruptRefCell::new(6));
Sourcepub fn swap(&self, other: &Self)
pub fn swap(&self, other: &Self)
Swaps the wrapped value of self
with the wrapped value of other
,
without deinitializing either one.
This function corresponds to std::mem::swap
.
§Panics
Panics if the value in either InterruptRefCell
is currently borrowed, or
if self
and other
point to the same InterruptRefCell
.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
let d = InterruptRefCell::new(6);
c.swap(&d);
assert_eq!(c, InterruptRefCell::new(6));
assert_eq!(d, InterruptRefCell::new(5));
Source§impl<T: ?Sized> InterruptRefCell<T>
impl<T: ?Sized> InterruptRefCell<T>
Sourcepub fn borrow(&self) -> InterruptRef<'_, T>
pub fn borrow(&self) -> InterruptRef<'_, T>
Immutably borrows the wrapped value.
The borrow lasts until the returned InterruptRef
exits scope. Multiple
immutable borrows can be taken out at the same time.
§Panics
Panics if the value is currently mutably borrowed. For a non-panicking variant, use
try_borrow
.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
let borrowed_five = c.borrow();
let borrowed_five2 = c.borrow();
An example of panic:
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
let m = c.borrow_mut();
let b = c.borrow(); // this causes a panic
Sourcepub fn try_borrow(&self) -> Result<InterruptRef<'_, T>, BorrowError>
pub fn try_borrow(&self) -> Result<InterruptRef<'_, T>, BorrowError>
Immutably borrows the wrapped value, returning an error if the value is currently mutably borrowed.
The borrow lasts until the returned InterruptRef
exits scope. Multiple immutable borrows can be
taken out at the same time.
This is the non-panicking variant of borrow
.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
{
let m = c.borrow_mut();
assert!(c.try_borrow().is_err());
}
{
let m = c.borrow();
assert!(c.try_borrow().is_ok());
}
Sourcepub fn borrow_mut(&self) -> InterruptRefMut<'_, T>
pub fn borrow_mut(&self) -> InterruptRefMut<'_, T>
Mutably borrows the wrapped value.
The borrow lasts until the returned InterruptRefMut
or all InterruptRefMut
s derived
from it exit scope. The value cannot be borrowed while this borrow is
active.
§Panics
Panics if the value is currently borrowed. For a non-panicking variant, use
try_borrow_mut
.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new("hello".to_owned());
*c.borrow_mut() = "bonjour".to_owned();
assert_eq!(&*c.borrow(), "bonjour");
An example of panic:
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
let m = c.borrow();
let b = c.borrow_mut(); // this causes a panic
Sourcepub fn try_borrow_mut(&self) -> Result<InterruptRefMut<'_, T>, BorrowMutError>
pub fn try_borrow_mut(&self) -> Result<InterruptRefMut<'_, T>, BorrowMutError>
Mutably borrows the wrapped value, returning an error if the value is currently borrowed.
The borrow lasts until the returned InterruptRefMut
or all InterruptRefMut
s derived
from it exit scope. The value cannot be borrowed while this borrow is
active.
This is the non-panicking variant of borrow_mut
.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
{
let m = c.borrow();
assert!(c.try_borrow_mut().is_err());
}
assert!(c.try_borrow_mut().is_ok());
Sourcepub fn as_ptr(&self) -> *mut T
pub fn as_ptr(&self) -> *mut T
Returns a raw pointer to the underlying data in this cell.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
let ptr = c.as_ptr();
Sourcepub fn get_mut(&mut self) -> &mut T
pub fn get_mut(&mut self) -> &mut T
Returns a mutable reference to the underlying data.
Since this method borrows InterruptRefCell
mutably, it is statically guaranteed
that no borrows to the underlying data exist. The dynamic checks inherent
in borrow_mut
and most other methods of InterruptRefCell
are therefore
unnecessary.
This method can only be called if InterruptRefCell
can be mutably borrowed,
which in general is only the case directly after the InterruptRefCell
has
been created. In these situations, skipping the aforementioned dynamic
borrowing checks may yield better ergonomics and runtime-performance.
In most situations where InterruptRefCell
is used, it can’t be borrowed mutably.
Use borrow_mut
to get mutable access to the underlying data then.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let mut c = InterruptRefCell::new(5);
*c.get_mut() += 1;
assert_eq!(c, InterruptRefCell::new(6));
Sourcepub unsafe fn try_borrow_unguarded(&self) -> Result<&T, BorrowError>
pub unsafe fn try_borrow_unguarded(&self) -> Result<&T, BorrowError>
Immutably borrows the wrapped value, returning an error if the value is currently mutably borrowed.
§Safety
Unlike InterruptRefCell::borrow
, this method is unsafe because it does not
return a InterruptRef
, thus leaving the borrow flag untouched. Mutably
borrowing the InterruptRefCell
while the reference returned by this method
is alive is undefined behaviour.
§Examples
use interrupt_ref_cell::InterruptRefCell;
let c = InterruptRefCell::new(5);
{
let m = c.borrow_mut();
assert!(unsafe { c.try_borrow_unguarded() }.is_err());
}
{
let m = c.borrow();
assert!(unsafe { c.try_borrow_unguarded() }.is_ok());
}
Trait Implementations§
Source§impl<T: Clone> Clone for InterruptRefCell<T>
impl<T: Clone> Clone for InterruptRefCell<T>
Source§fn clone(&self) -> InterruptRefCell<T>
fn clone(&self) -> InterruptRefCell<T>
§Panics
Panics if the value is currently mutably borrowed.
Source§fn clone_from(&mut self, other: &Self)
fn clone_from(&mut self, other: &Self)
§Panics
Panics if other
is currently mutably borrowed.
Source§impl<T: Default> Default for InterruptRefCell<T>
impl<T: Default> Default for InterruptRefCell<T>
Source§fn default() -> InterruptRefCell<T>
fn default() -> InterruptRefCell<T>
Creates a InterruptRefCell<T>
, with the Default
value for T.
Source§impl<T> From<T> for InterruptRefCell<T>
impl<T> From<T> for InterruptRefCell<T>
Source§fn from(t: T) -> InterruptRefCell<T>
fn from(t: T) -> InterruptRefCell<T>
Creates a new InterruptRefCell<T>
containing the given value.
Source§impl<T: ?Sized + Ord> Ord for InterruptRefCell<T>
impl<T: ?Sized + Ord> Ord for InterruptRefCell<T>
Source§fn cmp(&self, other: &InterruptRefCell<T>) -> Ordering
fn cmp(&self, other: &InterruptRefCell<T>) -> Ordering
§Panics
Panics if the value in either InterruptRefCell
is currently mutably borrowed.
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl<T: ?Sized + PartialEq> PartialEq for InterruptRefCell<T>
impl<T: ?Sized + PartialEq> PartialEq for InterruptRefCell<T>
Source§impl<T: ?Sized + PartialOrd> PartialOrd for InterruptRefCell<T>
impl<T: ?Sized + PartialOrd> PartialOrd for InterruptRefCell<T>
Source§fn partial_cmp(&self, other: &InterruptRefCell<T>) -> Option<Ordering>
fn partial_cmp(&self, other: &InterruptRefCell<T>) -> Option<Ordering>
§Panics
Panics if the value in either InterruptRefCell
is currently mutably borrowed.
Source§fn lt(&self, other: &InterruptRefCell<T>) -> bool
fn lt(&self, other: &InterruptRefCell<T>) -> bool
§Panics
Panics if the value in either InterruptRefCell
is currently mutably borrowed.
Source§fn le(&self, other: &InterruptRefCell<T>) -> bool
fn le(&self, other: &InterruptRefCell<T>) -> bool
§Panics
Panics if the value in either InterruptRefCell
is currently mutably borrowed.