Expand description
&T
—▸ Box<T>
Examples found in repository?
src/lib.rs (line 163)
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
pub fn arc_make_mut<T>(arc: &mut Arc<T>) -> &mut T
where
T: ?Sized + DynClone,
{
// Atomic. Find out whether the Arc in the argument is the single holder of
// a reference count (strong or weak) on the target object. If yes, it is
// guaranteed to remain that way throughout the rest of this function
// because no other threads could bump the reference count through any other
// Arc (because no others exist) or through this Arc (because the current
// thread holds an exclusive borrow of it).
let is_unique = Arc::get_mut(arc).is_some();
if !is_unique {
// Non-atomic.
let clone = Arc::from(clone_box(&**arc));
// Atomic. Check the reference counts again to find out whether the old
// object needs to be dropped. Probably not, but it can happen if all
// the other holders of a reference count went away during the time that
// the clone operation took.
*arc = clone;
}
// Non-atomic. TODO: replace with Arc::get_mut_unchecked when stable.
let ptr = Arc::as_ptr(arc) as *mut T;
unsafe { &mut *ptr }
}
/// `&mut Rc<T>` —▸ `&mut T`
pub fn rc_make_mut<T>(rc: &mut Rc<T>) -> &mut T
where
T: ?Sized + DynClone,
{
let is_unique = Rc::get_mut(rc).is_some();
if !is_unique {
let clone = Rc::from(clone_box(&**rc));
*rc = clone;
}
let ptr = Rc::as_ptr(rc) as *mut T;
unsafe { &mut *ptr }
}