Skip to content

Commit 9c44d80

Browse files
committedAug 23, 2021
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();
1 parent 5585532 commit 9c44d80

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed
 

‎library/core/src/cell.rs

+20
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,26 @@ impl<T> Cell<[T]> {
576576
}
577577
}
578578

579+
impl<T, const N: usize> Cell<[T; N]> {
580+
/// Returns a `&[Cell<T>; N]` from a `&Cell<[T; N]>`
581+
///
582+
/// # Examples
583+
///
584+
/// ```
585+
/// #![feature(as_array_of_cells)]
586+
/// use std::cell::Cell;
587+
///
588+
/// let mut array: [i32; 3] = [1, 2, 3];
589+
/// let cell_array: &Cell<[i32; 3]> = Cell::from_mut(&mut array);
590+
/// let array_cell: &[Cell<i32>; 3] = cell_array.as_array_of_cells();
591+
/// ```
592+
#[unstable(feature = "as_array_of_cells", issue = "88248")]
593+
pub fn as_array_of_cells(&self) -> &[Cell<T>; N] {
594+
// SAFETY: `Cell<T>` has the same memory layout as `T`.
595+
unsafe { &*(self as *const Cell<[T; N]> as *const [Cell<T>; N]) }
596+
}
597+
}
598+
579599
/// A mutable memory location with dynamically checked borrow rules
580600
///
581601
/// See the [module-level documentation](self) for more.

‎src/test/ui/rfcs/rfc-1789-as-cell/from-mut.rs

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// run-pass
22

3+
#![feature(as_array_of_cells)]
4+
35
use std::cell::Cell;
46

57
fn main() {
@@ -8,4 +10,11 @@ fn main() {
810
let slice_cell: &[Cell<i32>] = cell_slice.as_slice_of_cells();
911

1012
assert_eq!(slice_cell.len(), 3);
13+
14+
let mut array: [i32; 3] = [1, 2, 3];
15+
let cell_array: &Cell<[i32; 3]> = Cell::from_mut(&mut array);
16+
let array_cell: &[Cell<i32>; 3] = cell_array.as_array_of_cells();
17+
18+
array_cell[0].set(99);
19+
assert_eq!(array, [99, 2, 3]);
1120
}

0 commit comments

Comments
 (0)
Please sign in to comment.