Skip to content

Commit 0498c15

Browse files
Auto merge of #145504 - Jules-Bertholet:more_conversion_trait_impls, r=<try>
Add some conversion trait impls
2 parents af00ff2 + 8804742 commit 0498c15

File tree

4 files changed

+96
-2
lines changed

4 files changed

+96
-2
lines changed

library/core/src/ascii/ascii_char.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,6 +1169,26 @@ macro_rules! into_int_impl {
11691169

11701170
into_int_impl!(u8 u16 u32 u64 u128 char);
11711171

1172+
#[unstable(feature = "ascii_char", issue = "110998")]
1173+
impl AsRef<str> for AsciiChar {
1174+
#[inline(always)]
1175+
fn as_ref(&self) -> &str {
1176+
self.as_str()
1177+
}
1178+
}
1179+
1180+
#[unstable(feature = "ascii_char", issue = "110998")]
1181+
impl AsMut<str> for AsciiChar {
1182+
#[inline(always)]
1183+
fn as_mut(&mut self) -> &mut str {
1184+
let ascii_ptr: *mut [Self] = crate::slice::from_mut(self);
1185+
let str_ptr = ascii_ptr as *mut str;
1186+
// SAFETY: Each ASCII codepoint in UTF-8 is encoded as one single-byte
1187+
// code unit having the same value as the ASCII byte.
1188+
unsafe { &mut *str_ptr }
1189+
}
1190+
}
1191+
11721192
impl [AsciiChar] {
11731193
/// Views this slice of ASCII characters as a UTF-8 `str`.
11741194
#[unstable(feature = "ascii_char", issue = "110998")]

library/core/src/cell.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,30 @@ impl<T: CoerceUnsized<U>, U> CoerceUnsized<Cell<U>> for Cell<T> {}
671671
#[unstable(feature = "dispatch_from_dyn", issue = "none")]
672672
impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<Cell<U>> for Cell<T> {}
673673

674+
#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")]
675+
impl<T, const N: usize> AsRef<[Cell<T>; N]> for Cell<[T; N]> {
676+
#[inline(always)]
677+
fn as_ref(&self) -> &[Cell<T>; N] {
678+
self.as_array_of_cells()
679+
}
680+
}
681+
682+
#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")]
683+
impl<T, const N: usize> AsRef<[Cell<T>]> for Cell<[T; N]> {
684+
#[inline(always)]
685+
fn as_ref(&self) -> &[Cell<T>] {
686+
&*self.as_array_of_cells()
687+
}
688+
}
689+
690+
#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")]
691+
impl<T> AsRef<[Cell<T>]> for Cell<[T]> {
692+
#[inline(always)]
693+
fn as_ref(&self) -> &[Cell<T>] {
694+
self.as_slice_of_cells()
695+
}
696+
}
697+
674698
impl<T> Cell<[T]> {
675699
/// Returns a `&[Cell<T>]` from a `&Cell<[T]>`
676700
///

library/core/src/mem/maybe_uninit.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,6 +1452,56 @@ impl<T, const N: usize> MaybeUninit<[T; N]> {
14521452
}
14531453
}
14541454

1455+
#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")]
1456+
impl<T, const N: usize> From<[MaybeUninit<T>; N]> for MaybeUninit<[T; N]> {
1457+
#[inline(always)]
1458+
fn from(arr: [MaybeUninit<T>; N]) -> Self {
1459+
arr.transpose()
1460+
}
1461+
}
1462+
1463+
#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")]
1464+
impl<T, const N: usize> AsRef<[MaybeUninit<T>; N]> for MaybeUninit<[T; N]> {
1465+
#[inline(always)]
1466+
fn as_ref(&self) -> &[MaybeUninit<T>; N] {
1467+
// SAFETY: T and MaybeUninit<T> have the same layout
1468+
unsafe { &*(self as *const MaybeUninit<[T; N]> as *const [MaybeUninit<T>; N]) }
1469+
}
1470+
}
1471+
1472+
#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")]
1473+
impl<T, const N: usize> AsRef<[MaybeUninit<T>]> for MaybeUninit<[T; N]> {
1474+
#[inline(always)]
1475+
fn as_ref(&self) -> &[MaybeUninit<T>] {
1476+
&*AsRef::<[MaybeUninit<T>; N]>::as_ref(self)
1477+
}
1478+
}
1479+
1480+
#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")]
1481+
impl<T, const N: usize> AsMut<[MaybeUninit<T>; N]> for MaybeUninit<[T; N]> {
1482+
#[inline(always)]
1483+
fn as_mut(&mut self) -> &mut [MaybeUninit<T>; N] {
1484+
// SAFETY: T and MaybeUninit<T> have the same layout
1485+
unsafe { &mut *(self as *mut MaybeUninit<[T; N]> as *mut [MaybeUninit<T>; N]) }
1486+
}
1487+
}
1488+
1489+
#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")]
1490+
impl<T, const N: usize> AsMut<[MaybeUninit<T>]> for MaybeUninit<[T; N]> {
1491+
#[inline(always)]
1492+
fn as_mut(&mut self) -> &mut [MaybeUninit<T>] {
1493+
&mut *AsMut::<[MaybeUninit<T>; N]>::as_mut(self)
1494+
}
1495+
}
1496+
1497+
#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")]
1498+
impl<T, const N: usize> From<MaybeUninit<[T; N]>> for [MaybeUninit<T>; N] {
1499+
#[inline(always)]
1500+
fn from(arr: MaybeUninit<[T; N]>) -> Self {
1501+
arr.transpose()
1502+
}
1503+
}
1504+
14551505
impl<T, const N: usize> [MaybeUninit<T>; N] {
14561506
/// Transposes a `[MaybeUninit<T>; N]` into a `MaybeUninit<[T; N]>`.
14571507
///

tests/ui/suggestions/issue-71394-no-from-impl.stderr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ LL | let _: &[i8] = data.into();
55
| ^^^^ the trait `From<&[u8]>` is not implemented for `&[i8]`
66
|
77
= help: the following other types implement trait `From<T>`:
8+
`[MaybeUninit<T>; N]` implements `From<MaybeUninit<[T; N]>>`
89
`[T; 10]` implements `From<(T, T, T, T, T, T, T, T, T, T)>`
910
`[T; 11]` implements `From<(T, T, T, T, T, T, T, T, T, T, T)>`
1011
`[T; 12]` implements `From<(T, T, T, T, T, T, T, T, T, T, T, T)>`
1112
`[T; 1]` implements `From<(T,)>`
1213
`[T; 2]` implements `From<(T, T)>`
1314
`[T; 3]` implements `From<(T, T, T)>`
1415
`[T; 4]` implements `From<(T, T, T, T)>`
15-
`[T; 5]` implements `From<(T, T, T, T, T)>`
16-
and 6 others
16+
and 7 others
1717
= note: required for `&[u8]` to implement `Into<&[i8]>`
1818

1919
error: aborting due to 1 previous error

0 commit comments

Comments
 (0)