use_prelude!();
use ::core::mem::ManuallyDrop;
#[cfg(doc)]
use crate::extension_traits::ManuallyDropMut;
pub
trait AsOut<Pointee : ?Sized> {
#[allow(missing_docs)]
fn as_out<'out> (self: &'out mut Self)
-> Out<'out, Pointee>
;
}
impl<T> AsOut<T> for MaybeUninit<T> {
#[inline]
fn as_out<'out> (self: &'out mut MaybeUninit<T>)
-> Out<'out, T>
{
self.into()
}
}
impl<T> AsOut<T> for T
where
T : Copy,
{
#[inline]
fn as_out<'out> (self: &'out mut T)
-> Out<'out, T>
{
self.into()
}
}
impl<T> AsOut<[T]> for [MaybeUninit<T>] {
#[inline]
fn as_out<'out> (self: &'out mut [MaybeUninit<T>])
-> Out<'out, [T]>
{
self.into()
}
}
impl<T> AsOut<[T]> for [T]
where
T : Copy,
{
#[inline]
fn as_out<'out> (self: &'out mut [T])
-> Out<'out, [T]>
{
self.into()
}
}
impl<T> AsOut<T> for ManuallyDrop<T> {
#[inline]
fn as_out<'out> (self: &'out mut ManuallyDrop<T>)
-> Out<'out, T>
{
self.into()
}
}
impl<T> AsOut<[T]> for [ManuallyDrop<T>] {
#[inline]
fn as_out<'out> (self: &'out mut [ManuallyDrop<T>])
-> Out<'out, [T]>
{
self.into()
}
}
#[cfg(not(feature = "const_generics"))]
const _: () = {
macro_rules! impl_arrays {( $($N:tt)* ) => ($(
impl<T> AsOut<[T]> for [MaybeUninit<T>; $N] {
#[inline]
fn as_out<'out> (self: &'out mut Self)
-> Out<'out, [T]>
{
From::from(&mut self[..])
}
}
impl<T> AsOut<[T]> for [T; $N]
where
T : Copy,
{
#[inline]
fn as_out<'out> (self: &'out mut Self)
-> Out<'out, [T]>
{
From::from(&mut self[..])
}
}
)*)}
impl_arrays! {
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
64
128
256
512
1024
}
};
#[cfg(feature = "const_generics")]
const _: () = {
#[doc(cfg(feature = "const_generics"))]
impl<T, const N: usize> AsOut<[T]> for [MaybeUninit<T>; N] {
#[inline]
fn as_out<'out> (self: &'out mut Self)
-> Out<'out, [T]>
{
From::from(&mut self[..])
}
}
#[doc(cfg(feature = "const_generics"))]
impl<T, const N: usize> AsOut<[T]> for [T; N]
where
T : Copy,
{
#[inline]
fn as_out<'out> (self: &'out mut Self)
-> Out<'out, [T]>
{
From::from(&mut self[..])
}
}
};