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.51 due to the use of const generics.
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;