6 releases
0.2.1 | Jan 28, 2024 |
---|---|
0.2.0 | Jul 15, 2022 |
0.1.3 | Jul 14, 2022 |
0.1.2 | Jun 30, 2022 |
#228 in Data structures
250 downloads per month
Used in 31 crates
(2 directly)
39KB
876 lines
♐ rt_ref
Ref
types with internal mutability that implement Send
and Sync
.
These types are shared by rt_map
and rt_vec
.
Usage
Add the following to Cargo.toml
:
rt_ref = "0.2.1" # or
rt_ref = { version = "0.2.1", features = ["unsafe_debug"] }
In code:
use rt_ref::{Cell, Ref, RefMut};
let a = 1;
// Insert a value into a collection, wrapped with `Cell`.
let mut v = Vec::new();
v.push(Cell::new(a));
let v = v; // v is now compile-time immutable.
let a = v.get(0).map(|cell| RefMut::new(cell.borrow_mut()));
a.map(|mut a| {
*a += 2;
});
let a = v.get(0).map(|cell| Ref::new(cell.borrow()));
assert_eq!(Some(3), a.map(|a| *a));
Features
"unsafe_debug"
:
The borrowed reference will use the inner type's Debug
implementation when formatted.
use rt_ref::{Cell, Ref, RefMut};
let mut v = Vec::new();
v.push(Cell::new("a"));
#[cfg(not(feature = "unsafe_debug"))]
assert_eq!(
r#"[Cell { flag: 0, inner: UnsafeCell { .. } }]"#,
format!("{v:?}")
);
#[cfg(feature = "unsafe_debug")]
assert_eq!(r#"[Cell { flag: 0, inner: "a" }]"#, format!("{v:?}"));
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
at your option.
Contribution
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.