//! Implement a Fallible Rc use super::FallibleBox; use crate::TryReserveError; use alloc::boxed::Box; use alloc::rc::Rc; /// trait to implement Fallible Rc pub trait FallibleRc { /// try creating a new Rc, returning a Result, /// TryReserveError> if allocation failed fn try_new(t: T) -> Result where Self: Sized; } impl FallibleRc for Rc { fn try_new(t: T) -> Result { let b = as FallibleBox>::try_new(t)?; Ok(Rc::from(b)) } } #[cfg(test)] mod test { #[test] fn fallible_rc() { use std::rc::Rc; let mut x = Rc::new(3); *Rc::get_mut(&mut x).unwrap() = 4; assert_eq!(*x, 4); let _y = Rc::clone(&x); assert!(Rc::get_mut(&mut x).is_none()); } }