Rollup merge of #56216 - SimonSapin:array-tryfrom-slice, r=withoutboats
Add TryFrom<&[T]> for [T; $N] where T: Copy `TryFrom<&[T]> for &[T; $N]` (note *reference* to an array) already exists, but not needing to dereference makes type inference easier for example when using `u32::from_be_bytes`. Also add doc examples doing just that.
This commit is contained in:
commit
f7c407eb8b
@ -148,6 +148,15 @@ macro_rules! array_impls {
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "try_from", issue = "33417")]
|
||||
impl<'a, T> TryFrom<&'a [T]> for [T; $N] where T: Copy {
|
||||
type Error = TryFromSliceError;
|
||||
|
||||
fn try_from(slice: &[T]) -> Result<[T; $N], TryFromSliceError> {
|
||||
<&Self>::try_from(slice).map(|r| *r)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "try_from", issue = "33417")]
|
||||
impl<'a, T> TryFrom<&'a [T]> for &'a [T; $N] {
|
||||
type Error = TryFromSliceError;
|
||||
|
@ -1989,6 +1989,19 @@ big endian.
|
||||
```
|
||||
let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
|
||||
assert_eq!(value, ", $swap_op, ");
|
||||
```
|
||||
|
||||
When starting from a slice rather than an array, fallible conversion APIs can be used:
|
||||
|
||||
```
|
||||
#![feature(try_from)]
|
||||
use std::convert::TryInto;
|
||||
|
||||
fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
|
||||
let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
|
||||
*input = rest;
|
||||
", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
|
||||
}
|
||||
```"),
|
||||
#[stable(feature = "int_to_from_bytes", since = "1.32.0")]
|
||||
#[rustc_const_unstable(feature = "const_int_conversion")]
|
||||
@ -2008,6 +2021,19 @@ little endian.
|
||||
```
|
||||
let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
|
||||
assert_eq!(value, ", $swap_op, ");
|
||||
```
|
||||
|
||||
When starting from a slice rather than an array, fallible conversion APIs can be used:
|
||||
|
||||
```
|
||||
#![feature(try_from)]
|
||||
use std::convert::TryInto;
|
||||
|
||||
fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
|
||||
let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
|
||||
*input = rest;
|
||||
", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
|
||||
}
|
||||
```"),
|
||||
#[stable(feature = "int_to_from_bytes", since = "1.32.0")]
|
||||
#[rustc_const_unstable(feature = "const_int_conversion")]
|
||||
@ -2037,6 +2063,19 @@ let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"bi
|
||||
", $le_bytes, "
|
||||
});
|
||||
assert_eq!(value, ", $swap_op, ");
|
||||
```
|
||||
|
||||
When starting from a slice rather than an array, fallible conversion APIs can be used:
|
||||
|
||||
```
|
||||
#![feature(try_from)]
|
||||
use std::convert::TryInto;
|
||||
|
||||
fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
|
||||
let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
|
||||
*input = rest;
|
||||
", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
|
||||
}
|
||||
```"),
|
||||
#[stable(feature = "int_to_from_bytes", since = "1.32.0")]
|
||||
#[rustc_const_unstable(feature = "const_int_conversion")]
|
||||
@ -3719,6 +3758,19 @@ big endian.
|
||||
```
|
||||
let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
|
||||
assert_eq!(value, ", $swap_op, ");
|
||||
```
|
||||
|
||||
When starting from a slice rather than an array, fallible conversion APIs can be used:
|
||||
|
||||
```
|
||||
#![feature(try_from)]
|
||||
use std::convert::TryInto;
|
||||
|
||||
fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
|
||||
let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
|
||||
*input = rest;
|
||||
", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
|
||||
}
|
||||
```"),
|
||||
#[stable(feature = "int_to_from_bytes", since = "1.32.0")]
|
||||
#[rustc_const_unstable(feature = "const_int_conversion")]
|
||||
@ -3738,6 +3790,19 @@ little endian.
|
||||
```
|
||||
let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
|
||||
assert_eq!(value, ", $swap_op, ");
|
||||
```
|
||||
|
||||
When starting from a slice rather than an array, fallible conversion APIs can be used:
|
||||
|
||||
```
|
||||
#![feature(try_from)]
|
||||
use std::convert::TryInto;
|
||||
|
||||
fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
|
||||
let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
|
||||
*input = rest;
|
||||
", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
|
||||
}
|
||||
```"),
|
||||
#[stable(feature = "int_to_from_bytes", since = "1.32.0")]
|
||||
#[rustc_const_unstable(feature = "const_int_conversion")]
|
||||
@ -3767,6 +3832,19 @@ let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"bi
|
||||
", $le_bytes, "
|
||||
});
|
||||
assert_eq!(value, ", $swap_op, ");
|
||||
```
|
||||
|
||||
When starting from a slice rather than an array, fallible conversion APIs can be used:
|
||||
|
||||
```
|
||||
#![feature(try_from)]
|
||||
use std::convert::TryInto;
|
||||
|
||||
fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
|
||||
let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
|
||||
*input = rest;
|
||||
", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
|
||||
}
|
||||
```"),
|
||||
#[stable(feature = "int_to_from_bytes", since = "1.32.0")]
|
||||
#[rustc_const_unstable(feature = "const_int_conversion")]
|
||||
|
Loading…
x
Reference in New Issue
Block a user