mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-02 07:22:42 +00:00
add Cell::as_array_of_cells, similar to Cell::as_slice_of_cells
Previously, converting `&mut [T; N]` to `&[Cell<T>; N]` looks like this: let array = &mut [1, 2, 3]; let cells: &[Cell<i32>; 3] = Cell::from_mut(&mut array[..]) .as_slice_of_cells() .try_into() .unwrap(); With this new helper method, it looks like this: let array = &mut [1, 2, 3]; let cells: &[Cell<i32>; 3] = Cell::from_mut(array).as_array_of_cells();
This commit is contained in:
parent
558553272d
commit
9c44d80c83
@ -576,6 +576,26 @@ impl<T> Cell<[T]> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T, const N: usize> Cell<[T; N]> {
|
||||||
|
/// Returns a `&[Cell<T>; N]` from a `&Cell<[T; N]>`
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(as_array_of_cells)]
|
||||||
|
/// use std::cell::Cell;
|
||||||
|
///
|
||||||
|
/// let mut array: [i32; 3] = [1, 2, 3];
|
||||||
|
/// let cell_array: &Cell<[i32; 3]> = Cell::from_mut(&mut array);
|
||||||
|
/// let array_cell: &[Cell<i32>; 3] = cell_array.as_array_of_cells();
|
||||||
|
/// ```
|
||||||
|
#[unstable(feature = "as_array_of_cells", issue = "88248")]
|
||||||
|
pub fn as_array_of_cells(&self) -> &[Cell<T>; N] {
|
||||||
|
// SAFETY: `Cell<T>` has the same memory layout as `T`.
|
||||||
|
unsafe { &*(self as *const Cell<[T; N]> as *const [Cell<T>; N]) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A mutable memory location with dynamically checked borrow rules
|
/// A mutable memory location with dynamically checked borrow rules
|
||||||
///
|
///
|
||||||
/// See the [module-level documentation](self) for more.
|
/// See the [module-level documentation](self) for more.
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
|
#![feature(as_array_of_cells)]
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
@ -8,4 +10,11 @@ fn main() {
|
|||||||
let slice_cell: &[Cell<i32>] = cell_slice.as_slice_of_cells();
|
let slice_cell: &[Cell<i32>] = cell_slice.as_slice_of_cells();
|
||||||
|
|
||||||
assert_eq!(slice_cell.len(), 3);
|
assert_eq!(slice_cell.len(), 3);
|
||||||
|
|
||||||
|
let mut array: [i32; 3] = [1, 2, 3];
|
||||||
|
let cell_array: &Cell<[i32; 3]> = Cell::from_mut(&mut array);
|
||||||
|
let array_cell: &[Cell<i32>; 3] = cell_array.as_array_of_cells();
|
||||||
|
|
||||||
|
array_cell[0].set(99);
|
||||||
|
assert_eq!(array, [99, 2, 3]);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user