1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//! Runtime managed mutable borrowing from a vec.
//!
//! This library provides a vec that allows mutable borrows to different
//! elements at the same time. For a map implementation of this, see [`rt_map`].
//!
//!
//! ## Usage
//!
//! Add the following to `Cargo.toml`
//!
//! ```toml
//! rt_vec = "0.1.1" # or
//! rt_vec = { version = "0.1.1", features = ["unsafe_debug"] }
//! ```
//!
//! In code:
//!
//! ```rust
//! use rt_vec::RtVec;
//!
//! struct A(u32);
//!
//! let mut rt_vec = RtVec::new();
//!
//! rt_vec.push(A(1));
//! rt_vec.push(A(2));
//!
//! // We can validly have two mutable borrows from the `RtVec` map!
//! let mut a = rt_vec.borrow_mut(0);
//! let mut b = rt_vec.borrow_mut(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 a_0 = rt_vec.borrow(0);
//! let _a_1 = rt_vec.borrow(0);
//! let b = rt_vec.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 a_try_borrow_mut = rt_vec.try_borrow_mut(0);
//! 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`].
//!
//!
//! [`rt_map`]: https://crates.io/crates/rt_map
//! [`"unsafe_debug"`]: https://github.com/azriel91/rt_ref#unsafe_debug
// Re-exports
pub use ;
pub use crateRtVec;