unsafe_cell_slice
A Rust microlibrary for creating multiple mutable subslices of 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!;
let data_a: &mut = &mut data;
let data_b: &mut = &mut data;
data_a = 0;
data_b = 1;
There are use cases for acquiring multiple mutable subslices 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 an unsafe index_mut method that permits creating multiple mutable subslices.
let mut data = vec!;
assert_eq!;
assert_eq!;
Note that this is very unsafe and bypasses Rust's safety guarantees!
It is the responsibility of the caller of UnsafeCellSlice::index_mut() to avoid data races and undefined behavior by not requesting overlapping subslices.
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
- the Apache License, Version 2.0 LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0 or
- the MIT license LICENSE-MIT or http://opensource.org/licenses/MIT, at your option.
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.