#slice #unsafe #unsafecell

unsafe_cell_slice

A microlibrary for creating multiple mutable references to a slice

3 unstable releases

0.2.1 Nov 1, 2024
0.2.0 Oct 3, 2024
0.1.0 Sep 1, 2024

#658 in Rust patterns

Download history 374/week @ 2024-08-30 69/week @ 2024-09-06 144/week @ 2024-09-13 128/week @ 2024-09-20 262/week @ 2024-09-27 133/week @ 2024-10-04 114/week @ 2024-10-11 93/week @ 2024-10-18 108/week @ 2024-10-25 478/week @ 2024-11-01 213/week @ 2024-11-08 608/week @ 2024-11-15 282/week @ 2024-11-22 268/week @ 2024-11-29 669/week @ 2024-12-06

1,837 downloads per month
Used in 12 crates (3 directly)

MIT/Apache

24KB
374 lines

unsafe_cell_slice

Latest Version unsafe_cell_slice documentation msrv build

A Rust microlibrary for creating multiple mutable references to a slice.

Motivation

The rust borrow checker forbids creating multiple mutable references of a slice. For example, this fails to compile with cannot borrow `data` as mutable more than once at a time:

let mut data = vec![0u8; 2];
let data_a: &mut u8 = &mut data[0];
let data_b: &mut u8 = &mut data[1];
*data_a = 0;
*data_b = 1;

There are use cases for acquiring multiple mutable references of a slice, such as for writing independent elements in parallel. A safe approach is to borrow non-overlapping slices via slice::split_at_mut, slice::chunks_mut, etc. However, such approaches may not be applicable in complicated use cases, such as writing to interleaved elements.

UnsafeCellSlice

An UnsafeCellSlice can be created from a mutable slice or the spare capacity in a Vec. It has unsafe get_mut and index_mut methods that permit creating multiple mutable references of subslices or elements.

let mut data = vec![0u8; 2];
{
    let data = UnsafeCellSlice::new(&mut data);
    let data_a: &mut u8 = unsafe { data.index_mut(0) };
    let data_b: &mut u8 = unsafe { data.index_mut(1) };
    *data_a = 0;
    *data_b = 1;
}
assert_eq!(data[0], 0);
assert_eq!(data[1], 1);

Note that this is very unsafe and bypasses Rust's safety guarantees! It is the responsibility of the caller of UnsafeCellSlice methods to avoid data races and undefined behavior by not requesting overlapping subslices/elements.

Under the hood, UnsafeCellSlice is a reference to a std::cell::UnsafeCell slice, hence the name of the crate.

Licence

unsafe_cell_slice is licensed under either of

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.

No runtime deps