@@ -1268,6 +1268,18 @@ impl<T> [T] {
12681268 /// Splits the slice into a slice of `N`-element arrays,
12691269 /// assuming that there's no remainder.
12701270 ///
1271+ /// This is the inverse operation to [`as_flattened`].
1272+ ///
1273+ /// [`as_flattened`]: slice::as_flattened
1274+ ///
1275+ /// As this is `unsafe`, consider whether you could use [`as_chunks`] or
1276+ /// [`as_rchunks`] instead, perhaps via something like
1277+ /// `if let (chunks, []) = slice.as_chunks()` or
1278+ /// `let (chunks, []) = slice.as_chunks() else { unreachable!() };`.
1279+ ///
1280+ /// [`as_chunks`]: slice::as_chunks
1281+ /// [`as_rchunks`]: slice::as_rchunks
1282+ ///
12711283 /// # Safety
12721284 ///
12731285 /// This may only be called when
@@ -1277,7 +1289,6 @@ impl<T> [T] {
12771289 /// # Examples
12781290 ///
12791291 /// ```
1280- /// #![feature(slice_as_chunks)]
12811292 /// let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
12821293 /// let chunks: &[[char; 1]] =
12831294 /// // SAFETY: 1-element chunks never have remainder
@@ -1292,7 +1303,8 @@ impl<T> [T] {
12921303 /// // let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
12931304 /// // let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
12941305 /// ```
1295- #[ unstable( feature = "slice_as_chunks" , issue = "74985" ) ]
1306+ #[ stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
1307+ #[ rustc_const_stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
12961308 #[ inline]
12971309 #[ must_use]
12981310 pub const unsafe fn as_chunks_unchecked < const N : usize > ( & self ) -> & [ [ T ; N ] ] {
@@ -1312,15 +1324,27 @@ impl<T> [T] {
13121324 /// starting at the beginning of the slice,
13131325 /// and a remainder slice with length strictly less than `N`.
13141326 ///
1327+ /// The remainder is meaningful in the division sense. Given
1328+ /// `let (chunks, remainder) = slice.as_chunks()`, then:
1329+ /// - `chunks.len()` equals `slice.len() / N`,
1330+ /// - `remainder.len()` equals `slice.len() % N`, and
1331+ /// - `slice.len()` equals `chunks.len() * N + remainder.len()`.
1332+ ///
1333+ /// You can flatten the chunks back into a slice-of-`T` with [`as_flattened`].
1334+ ///
1335+ /// [`as_flattened`]: slice::as_flattened
1336+ ///
13151337 /// # Panics
13161338 ///
1317- /// Panics if `N` is zero. This check will most probably get changed to a compile time
1318- /// error before this method gets stabilized.
1339+ /// Panics if `N` is zero.
1340+ ///
1341+ /// Note that this check is against a const generic parameter, not a runtime
1342+ /// value, and thus a particular monomorphization will either always panic
1343+ /// or it will never panic.
13191344 ///
13201345 /// # Examples
13211346 ///
13221347 /// ```
1323- /// #![feature(slice_as_chunks)]
13241348 /// let slice = ['l', 'o', 'r', 'e', 'm'];
13251349 /// let (chunks, remainder) = slice.as_chunks();
13261350 /// assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
@@ -1330,14 +1354,14 @@ impl<T> [T] {
13301354 /// If you expect the slice to be an exact multiple, you can combine
13311355 /// `let`-`else` with an empty slice pattern:
13321356 /// ```
1333- /// #![feature(slice_as_chunks)]
13341357 /// let slice = ['R', 'u', 's', 't'];
13351358 /// let (chunks, []) = slice.as_chunks::<2>() else {
13361359 /// panic!("slice didn't have even length")
13371360 /// };
13381361 /// assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
13391362 /// ```
1340- #[ unstable( feature = "slice_as_chunks" , issue = "74985" ) ]
1363+ #[ stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
1364+ #[ rustc_const_stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
13411365 #[ inline]
13421366 #[ track_caller]
13431367 #[ must_use]
@@ -1357,21 +1381,34 @@ impl<T> [T] {
13571381 /// starting at the end of the slice,
13581382 /// and a remainder slice with length strictly less than `N`.
13591383 ///
1384+ /// The remainder is meaningful in the division sense. Given
1385+ /// `let (remainder, chunks) = slice.as_rchunks()`, then:
1386+ /// - `remainder.len()` equals `slice.len() % N`,
1387+ /// - `chunks.len()` equals `slice.len() / N`, and
1388+ /// - `slice.len()` equals `chunks.len() * N + remainder.len()`.
1389+ ///
1390+ /// You can flatten the chunks back into a slice-of-`T` with [`as_flattened`].
1391+ ///
1392+ /// [`as_flattened`]: slice::as_flattened
1393+ ///
13601394 /// # Panics
13611395 ///
1362- /// Panics if `N` is zero. This check will most probably get changed to a compile time
1363- /// error before this method gets stabilized.
1396+ /// Panics if `N` is zero.
1397+ ///
1398+ /// Note that this check is against a const generic parameter, not a runtime
1399+ /// value, and thus a particular monomorphization will either always panic
1400+ /// or it will never panic.
13641401 ///
13651402 /// # Examples
13661403 ///
13671404 /// ```
1368- /// #![feature(slice_as_chunks)]
13691405 /// let slice = ['l', 'o', 'r', 'e', 'm'];
13701406 /// let (remainder, chunks) = slice.as_rchunks();
13711407 /// assert_eq!(remainder, &['l']);
13721408 /// assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
13731409 /// ```
1374- #[ unstable( feature = "slice_as_chunks" , issue = "74985" ) ]
1410+ #[ stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
1411+ #[ rustc_const_stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
13751412 #[ inline]
13761413 #[ track_caller]
13771414 #[ must_use]
@@ -1424,6 +1461,18 @@ impl<T> [T] {
14241461 /// Splits the slice into a slice of `N`-element arrays,
14251462 /// assuming that there's no remainder.
14261463 ///
1464+ /// This is the inverse operation to [`as_flattened_mut`].
1465+ ///
1466+ /// [`as_flattened_mut`]: slice::as_flattened_mut
1467+ ///
1468+ /// As this is `unsafe`, consider whether you could use [`as_chunks_mut`] or
1469+ /// [`as_rchunks_mut`] instead, perhaps via something like
1470+ /// `if let (chunks, []) = slice.as_chunks_mut()` or
1471+ /// `let (chunks, []) = slice.as_chunks_mut() else { unreachable!() };`.
1472+ ///
1473+ /// [`as_chunks_mut`]: slice::as_chunks_mut
1474+ /// [`as_rchunks_mut`]: slice::as_rchunks_mut
1475+ ///
14271476 /// # Safety
14281477 ///
14291478 /// This may only be called when
@@ -1433,7 +1482,6 @@ impl<T> [T] {
14331482 /// # Examples
14341483 ///
14351484 /// ```
1436- /// #![feature(slice_as_chunks)]
14371485 /// let slice: &mut [char] = &mut ['l', 'o', 'r', 'e', 'm', '!'];
14381486 /// let chunks: &mut [[char; 1]] =
14391487 /// // SAFETY: 1-element chunks never have remainder
@@ -1450,7 +1498,8 @@ impl<T> [T] {
14501498 /// // let chunks: &[[_; 5]] = slice.as_chunks_unchecked_mut() // The slice length is not a multiple of 5
14511499 /// // let chunks: &[[_; 0]] = slice.as_chunks_unchecked_mut() // Zero-length chunks are never allowed
14521500 /// ```
1453- #[ unstable( feature = "slice_as_chunks" , issue = "74985" ) ]
1501+ #[ stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
1502+ #[ rustc_const_stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
14541503 #[ inline]
14551504 #[ must_use]
14561505 pub const unsafe fn as_chunks_unchecked_mut < const N : usize > ( & mut self ) -> & mut [ [ T ; N ] ] {
@@ -1470,15 +1519,27 @@ impl<T> [T] {
14701519 /// starting at the beginning of the slice,
14711520 /// and a remainder slice with length strictly less than `N`.
14721521 ///
1522+ /// The remainder is meaningful in the division sense. Given
1523+ /// `let (chunks, remainder) = slice.as_chunks_mut()`, then:
1524+ /// - `chunks.len()` equals `slice.len() / N`,
1525+ /// - `remainder.len()` equals `slice.len() % N`, and
1526+ /// - `slice.len()` equals `chunks.len() * N + remainder.len()`.
1527+ ///
1528+ /// You can flatten the chunks back into a slice-of-`T` with [`as_flattened_mut`].
1529+ ///
1530+ /// [`as_flattened_mut`]: slice::as_flattened_mut
1531+ ///
14731532 /// # Panics
14741533 ///
1475- /// Panics if `N` is zero. This check will most probably get changed to a compile time
1476- /// error before this method gets stabilized.
1534+ /// Panics if `N` is zero.
1535+ ///
1536+ /// Note that this check is against a const generic parameter, not a runtime
1537+ /// value, and thus a particular monomorphization will either always panic
1538+ /// or it will never panic.
14771539 ///
14781540 /// # Examples
14791541 ///
14801542 /// ```
1481- /// #![feature(slice_as_chunks)]
14821543 /// let v = &mut [0, 0, 0, 0, 0];
14831544 /// let mut count = 1;
14841545 ///
@@ -1490,7 +1551,8 @@ impl<T> [T] {
14901551 /// }
14911552 /// assert_eq!(v, &[1, 1, 2, 2, 9]);
14921553 /// ```
1493- #[ unstable( feature = "slice_as_chunks" , issue = "74985" ) ]
1554+ #[ stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
1555+ #[ rustc_const_stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
14941556 #[ inline]
14951557 #[ track_caller]
14961558 #[ must_use]
@@ -1510,15 +1572,27 @@ impl<T> [T] {
15101572 /// starting at the end of the slice,
15111573 /// and a remainder slice with length strictly less than `N`.
15121574 ///
1575+ /// The remainder is meaningful in the division sense. Given
1576+ /// `let (remainder, chunks) = slice.as_rchunks_mut()`, then:
1577+ /// - `remainder.len()` equals `slice.len() % N`,
1578+ /// - `chunks.len()` equals `slice.len() / N`, and
1579+ /// - `slice.len()` equals `chunks.len() * N + remainder.len()`.
1580+ ///
1581+ /// You can flatten the chunks back into a slice-of-`T` with [`as_flattened_mut`].
1582+ ///
1583+ /// [`as_flattened_mut`]: slice::as_flattened_mut
1584+ ///
15131585 /// # Panics
15141586 ///
1515- /// Panics if `N` is zero. This check will most probably get changed to a compile time
1516- /// error before this method gets stabilized.
1587+ /// Panics if `N` is zero.
1588+ ///
1589+ /// Note that this check is against a const generic parameter, not a runtime
1590+ /// value, and thus a particular monomorphization will either always panic
1591+ /// or it will never panic.
15171592 ///
15181593 /// # Examples
15191594 ///
15201595 /// ```
1521- /// #![feature(slice_as_chunks)]
15221596 /// let v = &mut [0, 0, 0, 0, 0];
15231597 /// let mut count = 1;
15241598 ///
@@ -1530,7 +1604,8 @@ impl<T> [T] {
15301604 /// }
15311605 /// assert_eq!(v, &[9, 1, 1, 2, 2]);
15321606 /// ```
1533- #[ unstable( feature = "slice_as_chunks" , issue = "74985" ) ]
1607+ #[ stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
1608+ #[ rustc_const_stable( feature = "slice_as_chunks" , since = "CURRENT_RUSTC_VERSION" ) ]
15341609 #[ inline]
15351610 #[ track_caller]
15361611 #[ must_use]
@@ -4816,6 +4891,11 @@ impl<T> [MaybeUninit<T>] {
48164891impl < T , const N : usize > [ [ T ; N ] ] {
48174892 /// Takes a `&[[T; N]]`, and flattens it to a `&[T]`.
48184893 ///
4894+ /// For the opposite operation, see [`as_chunks`] and [`as_rchunks`].
4895+ ///
4896+ /// [`as_chunks`]: slice::as_chunks
4897+ /// [`as_rchunks`]: slice::as_rchunks
4898+ ///
48194899 /// # Panics
48204900 ///
48214901 /// This panics if the length of the resulting slice would overflow a `usize`.
@@ -4856,6 +4936,11 @@ impl<T, const N: usize> [[T; N]] {
48564936
48574937 /// Takes a `&mut [[T; N]]`, and flattens it to a `&mut [T]`.
48584938 ///
4939+ /// For the opposite operation, see [`as_chunks_mut`] and [`as_rchunks_mut`].
4940+ ///
4941+ /// [`as_chunks_mut`]: slice::as_chunks_mut
4942+ /// [`as_rchunks_mut`]: slice::as_rchunks_mut
4943+ ///
48594944 /// # Panics
48604945 ///
48614946 /// This panics if the length of the resulting slice would overflow a `usize`.
0 commit comments