Expand description
Runtime managed mutable borrowing from a map.
This library provides a map that allows mutable borrows to different entries
at the same time. For a map implementation of this, see rt_vec
.
The implementation is extracted and slightly modified from shred
.
§Usage
Add the following to Cargo.toml
rt_map = "0.6.0" # or
rt_map = { version = "0.6.0", features = ["unsafe_debug"] }
In code:
use rt_map::RtMap;
struct A(u32);
let mut rt_map = RtMap::new();
rt_map.insert('a', A(1));
rt_map.insert('b', A(2));
// We can validly have two mutable borrows from the `RtMap` map!
let mut a = rt_map.borrow_mut(&'a');
let mut b = rt_map.borrow_mut(&'b');
a.0 = 2;
b.0 = 3;
// We need to explicitly drop the A and B borrows, because they are runtime
// managed borrows, and rustc doesn't know to drop them before the immutable
// borrows after this.
drop(a);
drop(b);
// Multiple immutable borrows to the same value are valid.
let a_0 = rt_map.borrow(&'a');
let _a_1 = rt_map.borrow(&'a');
let b = rt_map.borrow(&'b');
println!("A: {}", a_0.0);
println!("B: {}", b.0);
// Trying to mutably borrow a value that is already borrowed (immutably
// or mutably) returns `Err`.
let a_try_borrow_mut = rt_map.try_borrow_mut(&'a');
let exists = if a_try_borrow_mut.is_ok() {
"Ok(..)"
} else {
"Err"
};
println!("a_try_borrow_mut: {}", exists); // prints "Err"
§Features
§"unsafe_debug"
Enables the "unsafe_debug"
feature of rt_ref
.
§See Also
Structs§
- Cell
- A custom cell container that is a
RefCell
with thread-safety. - CellRef
- An immutable reference to data in a
Cell
. - Cell
RefMut - A mutable reference to data in a
Cell
. - Entry
- Ref
- Reference to a value.
- RefMut
- Mutable reference to a value.
- RtMap
- Map from
TypeId
to type.
Enums§
- Borrow
Fail - Failures to borrow a value.