Skip to content

Commit 27e681f

Browse files
committed
Add from_(mut_)slice_unchecked() functions in array
1 parent 34356db commit 27e681f

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

library/core/src/array/mod.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,57 @@ impl<T, const N: usize> [T; N] {
774774
}
775775
}
776776

777+
/// Unsafely converts a slice of `N` elements to an array reference of `N` elements.
778+
///
779+
/// # Safety
780+
///
781+
/// The caller must ensure that the slice has at least `N` elements. Violating this constraint
782+
/// causes Undefined Behaviour.
783+
///
784+
/// # Examples
785+
///
786+
/// ```
787+
/// #![feature(array_from_slice)]
788+
///
789+
/// let v = [1, 0, 3, 0, 5, 6];
790+
/// // SAFETY: `&v[2..5]` is a slice of 3 elements.
791+
/// let r = unsafe { <&[i32; 3]>::from_slice_unchecked(&v[2..5]) };
792+
/// assert_eq!(r, &[3, 0, 5]);
793+
/// ```
794+
#[inline]
795+
#[must_use]
796+
const unsafe fn from_slice_unchecked<T, const N: usize>(s: &[T]) -> &[T; N] {
797+
// SAFETY: caller guarantees that `s` is a slice of at least `N` elements.
798+
unsafe { &*(s.as_ptr() as *const [T; N]) }
799+
}
800+
801+
/// Unsafely converts a mutable slice of `N` elements to a mutable array reference of `N` elements.
802+
///
803+
/// # Safety
804+
///
805+
/// The caller must ensure that the slice has at least `N` elements. Violating this constraint
806+
/// causes Undefined Behaviour.
807+
///
808+
/// # Examples
809+
///
810+
/// ```
811+
/// #![feature(array_from_slice)]
812+
///
813+
/// let mut v = [1, 0, 3, 0, 5, 6];
814+
/// // SAFETY: `&mut v[2..5]` is a slice of 3 elements.
815+
/// let r = unsafe { <&mut [i32; 3]>::from_mut_slice_unchecked(&mut v[2..5]) };
816+
/// assert_eq!(r, &[3, 0, 5]);
817+
/// r[1] = 9;
818+
/// assert_eq!(r, &[3, 9, 5]);
819+
/// assert_eq!(v, [1, 0, 3, 9, 5, 6]);
820+
/// ```
821+
#[inline]
822+
#[must_use]
823+
const unsafe fn from_mut_slice_unchecked<T, const N: usize>(s: &mut [T]) -> &mut [T; N] {
824+
// SAFETY: caller guarantees that `s` is a slice of at least `N` elements.
825+
unsafe { &mut *(s.as_ptr() as *mut [T; N]) }
826+
}
827+
777828
/// Populate an array from the first `N` elements of `iter`
778829
///
779830
/// # Panics

0 commit comments

Comments
 (0)