Expand description
StaticRc
, resp. StaticRcRef
, use Rust’s affine type system and const generics to track the shared ownership
of a heap-allocated, resp. reference, value safely at compile-time, with no run-time overhead.
The amount of unsafe
used within is minimal, StaticRc
mostly leverages Box
for most of the heavy-duty
operations.
§Example of usage.
use static_rc::StaticRc;
type Full<T> = StaticRc<T, 3, 3>;
type TwoThird<T> = StaticRc<T, 2, 3>;
type OneThird<T> = StaticRc<T, 1, 3>;
let mut full = Full::new("Hello, world!".to_string());
assert_eq!("Hello, world!", &*full);
// Mutation is allowed when having full ownership, just like for `Box`.
*full = "Hello, you!".to_string();
assert_eq!("Hello, you!", &*full);
// Mutation is no longer allowed from now on, due to aliasing, just like for `Rc`.
let (two_third, one_third) = Full::split::<2, 1>(full);
assert_eq!("Hello, you!", &*two_third);
assert_eq!("Hello, you!", &*one_third);
let mut full = Full::join(one_third, two_third);
assert_eq!("Hello, you!", &*full);
// Mutation is allowed again, since `full` has full ownership.
*full = "Hello, world!".to_string();
assert_eq!("Hello, world!", &*full);
// Finally, the value is dropped when `full` is.
§Options
The crate is defined for no_std
environment and only relies on core
and alloc
by default.
The alloc
crate can be opted out of, though this disables StaticRc
.
The crate only uses stable features by default, with a MSRV of 1.57 due to the use of assert!
in const
blocks.
Additional, the crate offers several optional features which unlock additional capabilities by using nightly.
Please see Cargo.toml
for an up-to-date list of features, and their effects.
Re-exports§
pub use self::rcref::StaticRcRef;
pub use self::rc::StaticRc;