unsafe_cell_slice

Crates.iounsafe_cell_slice
lib.rsunsafe_cell_slice
version0.2.1
sourcesrc
created_at2024-09-01 01:35:23.286223
updated_at2024-11-01 08:25:26.265451
descriptionA microlibrary for creating multiple mutable references to a slice
homepage
repositoryhttps://github.com/LDeakin/unsafe_cell_slice
max_upload_size
id1359294
size38,211
Lachlan Deakin (LDeakin)

documentation

https://docs.rs/unsafe_cell_slice

README

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.

Commit count: 10

cargo fmt