diff options
| author | Scott McMurray <scottmcm@users.noreply.github.com> | 2024-05-06 01:04:27 -0700 |
|---|---|---|
| committer | Scott McMurray <scottmcm@users.noreply.github.com> | 2024-05-06 01:04:27 -0700 |
| commit | 49af347653beb2ee3b9c83b1beb741b63b86f211 (patch) | |
| tree | 5ae9c7f75a134bbb46fa37e15f8b5a8a518765c1 | |
| parent | d287f3e4eeaf680e8fe875f1ec75cca68f357d30 (diff) | |
| download | rust-49af347653beb2ee3b9c83b1beb741b63b86f211.tar.gz rust-49af347653beb2ee3b9c83b1beb741b63b86f211.zip | |
Implement `as_chunks` with `split_at_unchecked`
| -rw-r--r-- | library/core/src/slice/mod.rs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/library/core/src/slice/mod.rs b/library/core/src/slice/mod.rs index ed7bcec89b9..57526dcd00c 100644 --- a/library/core/src/slice/mod.rs +++ b/library/core/src/slice/mod.rs @@ -1337,8 +1337,10 @@ impl<T> [T] { #[must_use] pub const fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T]) { assert!(N != 0, "chunk size must be non-zero"); - let len = self.len() / N; - let (multiple_of_n, remainder) = self.split_at(len * N); + let len_rounded_down = self.len() / N * N; + // SAFETY: The rounded-down value is always the same or smaller than the + // original length, and thus must be in-bounds of the slice. + let (multiple_of_n, remainder) = unsafe { self.split_at_unchecked(len_rounded_down) }; // SAFETY: We already panicked for zero, and ensured by construction // that the length of the subslice is a multiple of N. let array_slice = unsafe { multiple_of_n.as_chunks_unchecked() }; @@ -1487,8 +1489,10 @@ impl<T> [T] { #[must_use] pub const fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[T; N]], &mut [T]) { assert!(N != 0, "chunk size must be non-zero"); - let len = self.len() / N; - let (multiple_of_n, remainder) = self.split_at_mut(len * N); + let len_rounded_down = self.len() / N * N; + // SAFETY: The rounded-down value is always the same or smaller than the + // original length, and thus must be in-bounds of the slice. + let (multiple_of_n, remainder) = unsafe { self.split_at_mut_unchecked(len_rounded_down) }; // SAFETY: We already panicked for zero, and ensured by construction // that the length of the subslice is a multiple of N. let array_slice = unsafe { multiple_of_n.as_chunks_unchecked_mut() }; |
