Runtime managed mutable borrowing from a map or vec.
This library provides a map and vec that allows mutable borrows to different entries at the same time.
The map implementation is extracted and slightly modified from [shred
].
Add the following to Cargo.toml
toml
rt_map = "0.5.1"
rt_map = { version = "0.5.1", features = ["rt_vec"] } # to enable `RtVec`
RtMap
]```rust use rt_map::RtMap;
struct A(u32);
fn main() { 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_some() {
"Ok(..)"
} else {
"Err"
};
println!("a_try_borrow_mut: {}", exists); // prints "Err"
} ```
RtVec
]```rust use rt_map::RtVec;
struct A(u32);
let mut rt_vec = RtVec::new();
rtvec.push(A(1)); rtvec.push(A(2));
// We can validly have two mutable borrows from the RtVec
map!
let mut a = rtvec.borrowmut(0);
let mut b = rtvec.borrowmut(1);
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 a0 = rtvec.borrow(0); let a1 = rtvec.borrow(0); let b = rtvec.borrow(1);
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 atryborrowmut = rtvec.tryborrowmut(0);
let exists = if atryborrowmut.isok() {
"Ok(..)"
} else {
"Err"
};
println!("atryborrow_mut: {}", exists); // prints "Err"
```
anymap
]\: Map of any type, without multiple mutable borrows.resman
]\: Map of any type, with runtime managed borrowing.shred
]\: Like [resman
], plus a task dispatcher.Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.