]> git.lizzy.rs Git - rust.git/commitdiff
Implement `TryFrom<&'_ mut [T]>` for `[T; N]`
authorrhysd <lin90162@yahoo.co.jp>
Sat, 20 Nov 2021 12:40:41 +0000 (21:40 +0900)
committerrhysd <lin90162@yahoo.co.jp>
Sat, 20 Nov 2021 14:05:08 +0000 (23:05 +0900)
library/core/src/array/mod.rs
library/core/tests/array.rs

index 09bb4519170dae3a4891a55182104cd72610952e..eadf6fd9a4f896c08b6f86bb826ae2b8ee2c7c43 100644 (file)
@@ -176,6 +176,18 @@ fn borrow_mut(&mut self) -> &mut [T] {
     }
 }
 
+#[stable(feature = "try_from_mut_slice_to_array", since = "1.57.0")]
+impl<T, const N: usize> TryFrom<&mut [T]> for [T; N]
+where
+    T: Copy,
+{
+    type Error = TryFromSliceError;
+
+    fn try_from(slice: &mut [T]) -> Result<[T; N], TryFromSliceError> {
+        <Self>::try_from(slice.as_ref())
+    }
+}
+
 #[stable(feature = "try_from", since = "1.34.0")]
 impl<'a, T, const N: usize> TryFrom<&'a [T]> for &'a [T; N] {
     type Error = TryFromSliceError;
index 7dc071b74235d3f872c742f8f540cfb628f369d6..1f53cdf200a59675d00d310ac3c55dce4aad26f1 100644 (file)
@@ -28,11 +28,22 @@ macro_rules! test {
         ($($N:expr)+) => {
             $({
                 type Array = [u8; $N];
-                let array: Array = [0; $N];
+                let mut array: Array = [0; $N];
                 let slice: &[u8] = &array[..];
 
                 let result = <&Array>::try_from(slice);
                 assert_eq!(&array, result.unwrap());
+
+                let result = <Array>::try_from(slice);
+                assert_eq!(&array, &result.unwrap());
+
+                let mut_slice: &mut [u8] = &mut array[..];
+                let result = <&mut Array>::try_from(mut_slice);
+                assert_eq!(&[0; $N], result.unwrap());
+
+                let mut_slice: &mut [u8] = &mut array[..];
+                let result = <Array>::try_from(mut_slice);
+                assert_eq!(&array, &result.unwrap());
             })+
         }
     }