Wrapper for Rc<RefCell<Option<T>>> and its weak variant.
Includes various utilities for common operations usually performed on such a datastructure.
pub fn main() {
let cell : RcOCell<u8> = RcOCell::from_value(1u8);
//The usual RefCell stuff...
let borrowed : Ref<u8> = cell.borrow();
//...
drop(borrowed);
let borrowed_mut : RefMut<u8> = cell.borrow_mut();
//...
drop(borrowed_mut);
}Following functions are provided as part of RcoCell and WeakRcoCell:
In general all functions prefixed "try" will not panic. All functions without this prefix may panic depending on what they do.
borrowandborrow_mut- just like
RefCell
- just like
try_borrowandtry_borrow_mut- just like
RefCellbut error type is an enum.
- just like
Those calls will either panic or fail if the cell is empty. The normal rust borrowing rules apply: only 1 mutable borrow or n normal borrows. If the borrowing rules are violated at runtime then either panic or failure occurs.
setandtry_set- Sets the value and return the previous value as an Option
- Will not work if the value is borrowed.
replaceandtry_replace- Sets the value, return the previous value directly.
- Will not work on empty cells.
- Will not work if the value is borrowed.
clearandtry_clear- Clear the value and return the previous value as an Option
- Will not work if the value is borrowed.
get_and_clearandtry_get_and_clear- Clears the value and return the previous value directly.
- Will not work if the value is borrowed.
- Will not work on empty cells.
computeandtry_compute- Calls a Fn with the value to conditionally calculate a new value as a replacement.
- Will not work if the value is borrowed.
compute_if_presentandtry_compute_if_present- Calls a Fn with the value to conditionally calculate a new value as a replacement.
- Will not work if the value is borrowed.
- Noop on empty cells.
compute_if_absent- Calls a Fn to calculate a new value.
- Noop on empty cells or cells that have a borrowed value.
swapandtry_swap- Just like
RefCell::swap - Will swap values between 2 cells.
- Just like
get_and_cloneandtry_get_and_clone- Returns a clone of the current value in the cell directly.
- Will not work if the value is borrowed mutably.
- Will not work on empty cells.
- Will only be available on Types that implement the Clone trait.
if_present_mut,if_present,try_if_presentandtry_if_present_mut- Call Fn with a reference to the value if the cell is not empty.
- Noop on empty Cells.
- mut variant will not work if the value is borrowed
- normal variant will not work if the value is borrowed mutably.
map,map_mut,try_map,try_map_mut- Call Fn with a reference to the value to perform a type conversion.
- Signature of Fn is
Fn(&T) -> XorFn(&mut T) -> X- X is the result type of the conversion
- T the type in the cell.
- Entire method
Option<X>orResult<Option<X>, RcOCellError> - Will not work on empty cells.
- mut variant will not work if the value is borrowed.
- normal variant will not work if the value is borrowed mutably.
Tcan convert toRcOCell<T>viaintoRcOCell<Vec<T>>can convert toVec<T>viatry_intoRcOCell<T>can convert toRc<RefCell<Option<T>>>viaintoRc<RefCell<Option<T>>>can convert toRcOCell<T>viaintoRcOCell<T>can convert toWeakRcOCell<T>viainto- a dedicated
downgrademethod also exists just likeRc::downgrade
- a dedicated
WeakRcOCell<T>can convert toRcOCell<T>viatry_into- a dedicated
upgrademethod also exists just likeRc::upgrade
- a dedicated
RcOCell<T>can convert toOption<T>viatry_intoRcOCell<T>can convert toResult<Option<T>, RcOCellError>viainto- The 'error' types from the normal
RefCellborrow methods can convert toRcOCellErrorviaintoor the?operator.
from_valueandfrom- Create a new cell with value, one comes from the
From<T>trait
- Create a new cell with value, one comes from the
from_option- Takes an Option as parameter and create a cell with or without value.
new- Makes an empty cell
downgradeandupgrade- Conversion between Weak and Normal referenced cell
clone- Increases the reference count just like
Rc::clone.
- Increases the reference count just like
pub fn main() {
let cell : RcOCell<u8> = RcOCell::from_value(1u8); //RcOCell::new() creates a empty cell.
//Remove the value from the cell
let old_value : Option<u8> = cell.clear(); //old value would be 1u8.
let borrow_result : Result<u8, RcOCellError> = cell.try_borrow();
if borrow_result.is_err() {
//Would be error because cell is empty.
//If you want to handle the RcOCellError error, it's an enum.
//Can be handled like this:
match borrow_result.unwrap_err() {
RcOCellError::NoValue => {println!("No value present")},
RcOCellError::BorrowError(_) => {}, //Won't happen in this case
RcOCellError::Dropped => {}, //Won't happen in this case
}
}
//Now cell has value 2. old_value is None.
let old_value : u8 = cell.set(2u8);
let borrowed : Ref<u8> = cell.borrow();
//set would panic, because the value is still borrowed, try_set will fail with RcOCellError::BorrowError
let try_set_result : Result<u8, RcOCellError> = cell.try_set(4u8);
drop(borrowed);
//Now it will work!
let try_set_result : Result<u8, RcOCellError> = cell.try_set(4u8);
//2u8 is the old value, 4u8 is now in the cell
let old_value : u8 = try_set_result.unwrap();
let current_value : u8 = cell.get_and_clone(); //Only works for all T that implement Clone trait, in this case 4u8
let current_value : u8 = cell.get_and_clear(); //Cell is empty again after this call. current_value 4u8
//Another call to get_and_clear would panic as cell is empty.
let get_result : Result<u8, RcOCellError> = cell.try_get_and_clear();
//Result is once again RcOCellError::NoValue Error
}