-
Notifications
You must be signed in to change notification settings - Fork 18
Open
Description
Having map methods for reference types which can only work with sub-borrows of the original object is a bit too restrictive in my opinion, and it doesn't allow certain patterns as the one presented bellow. My solution is to add an additional method to all reference types, map_into, which can create entirely new objects with the same lifetime as the original. This change requires adding additional reference types that hold T's, instead of &(mut) T's, which I've called OwnedAtomicRef and OwnedAtomicRefMut.
Here is the problem that adding map_into would solve
let values: (Box<dyn Any>, Box<dyn Any>) = (Box::new(1_u32), Box::new(2_u32));
let cell = AtomicRefCell::new(values);
// Create an OwnedAtomicRefMut to hold our new object which borrows the original
let mut borrowed_values = AtomicRefMut::map_into(cell.borrow_mut(), |values| {
(
Box::as_mut(&mut values.0).downcast_mut::<u32>().unwrap(),
Box::as_mut(&mut values.1).downcast_mut::<u32>().unwrap(),
)
});
// Set the values while still holding a lock
*borrowed_values.0 = 100;
*borrowed_values.1 = 200;
Metadata
Metadata
Assignees
Labels
No labels