|
21 | 21 |
|
22 | 22 | use borrow::{Borrow, BorrowMut};
|
23 | 23 | use cmp::Ordering;
|
| 24 | +use convert::TryFrom; |
24 | 25 | use fmt;
|
25 | 26 | use hash::{Hash, self};
|
26 | 27 | use marker::Unsize;
|
@@ -57,6 +58,11 @@ unsafe impl<T, A: Unsize<[T]>> FixedSizeArray<T> for A {
|
57 | 58 | }
|
58 | 59 | }
|
59 | 60 |
|
| 61 | +/// The error type returned when a conversion from a slice to an array fails. |
| 62 | +#[unstable(feature = "try_from", issue = "33417")] |
| 63 | +#[derive(Debug, Copy, Clone)] |
| 64 | +pub struct TryFromSliceError(()); |
| 65 | + |
60 | 66 | macro_rules! __impl_slice_eq1 {
|
61 | 67 | ($Lhs: ty, $Rhs: ty) => {
|
62 | 68 | __impl_slice_eq1! { $Lhs, $Rhs, Sized }
|
@@ -123,6 +129,34 @@ macro_rules! array_impls {
|
123 | 129 | }
|
124 | 130 | }
|
125 | 131 |
|
| 132 | + #[unstable(feature = "try_from", issue = "33417")] |
| 133 | + impl<'a, T> TryFrom<&'a [T]> for &'a [T; $N] { |
| 134 | + type Error = TryFromSliceError; |
| 135 | + |
| 136 | + fn try_from(slice: &[T]) -> Result<&[T; $N], TryFromSliceError> { |
| 137 | + if slice.len() == $N { |
| 138 | + let ptr = slice.as_ptr() as *const [T; $N]; |
| 139 | + unsafe { Ok(&*ptr) } |
| 140 | + } else { |
| 141 | + Err(TryFromSliceError(())) |
| 142 | + } |
| 143 | + } |
| 144 | + } |
| 145 | + |
| 146 | + #[unstable(feature = "try_from", issue = "33417")] |
| 147 | + impl<'a, T> TryFrom<&'a mut [T]> for &'a mut [T; $N] { |
| 148 | + type Error = TryFromSliceError; |
| 149 | + |
| 150 | + fn try_from(slice: &mut [T]) -> Result<&mut [T; $N], TryFromSliceError> { |
| 151 | + if slice.len() == $N { |
| 152 | + let ptr = slice.as_mut_ptr() as *mut [T; $N]; |
| 153 | + unsafe { Ok(&mut *ptr) } |
| 154 | + } else { |
| 155 | + Err(TryFromSliceError(())) |
| 156 | + } |
| 157 | + } |
| 158 | + } |
| 159 | + |
126 | 160 | #[stable(feature = "rust1", since = "1.0.0")]
|
127 | 161 | impl<T: Hash> Hash for [T; $N] {
|
128 | 162 | fn hash<H: hash::Hasher>(&self, state: &mut H) {
|
|
0 commit comments