use core::borrow::{Borrow, BorrowMut}; use core::cmp::Ordering; use core::fmt::{self, Debug}; use core::hash::{Hash, Hasher}; use super::{ArrayLength, GenericArray}; use crate::functional::*; use crate::sequence::*; impl Default for GenericArray where N: ArrayLength, { #[inline(always)] fn default() -> Self { Self::generate(|_| T::default()) } } impl Clone for GenericArray where N: ArrayLength, { fn clone(&self) -> GenericArray { self.map(Clone::clone) } } impl Copy for GenericArray where N: ArrayLength, N::ArrayType: Copy, { } impl PartialEq for GenericArray where N: ArrayLength, { fn eq(&self, other: &Self) -> bool { **self == **other } } impl Eq for GenericArray where N: ArrayLength {} impl PartialOrd for GenericArray where N: ArrayLength, { fn partial_cmp(&self, other: &GenericArray) -> Option { PartialOrd::partial_cmp(self.as_slice(), other.as_slice()) } } impl Ord for GenericArray where N: ArrayLength, { fn cmp(&self, other: &GenericArray) -> Ordering { Ord::cmp(self.as_slice(), other.as_slice()) } } impl Debug for GenericArray where N: ArrayLength, { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { self[..].fmt(fmt) } } impl Borrow<[T]> for GenericArray where N: ArrayLength, { #[inline(always)] fn borrow(&self) -> &[T] { &self[..] } } impl BorrowMut<[T]> for GenericArray where N: ArrayLength, { #[inline(always)] fn borrow_mut(&mut self) -> &mut [T] { &mut self[..] } } impl AsRef<[T]> for GenericArray where N: ArrayLength, { #[inline(always)] fn as_ref(&self) -> &[T] { &self[..] } } impl AsMut<[T]> for GenericArray where N: ArrayLength, { #[inline(always)] fn as_mut(&mut self) -> &mut [T] { &mut self[..] } } impl Hash for GenericArray where N: ArrayLength, { fn hash(&self, state: &mut H) where H: Hasher, { Hash::hash(&self[..], state) } } macro_rules! impl_from { ($($n: expr => $ty: ty),*) => { $( impl From<[T; $n]> for GenericArray { #[inline(always)] fn from(arr: [T; $n]) -> Self { unsafe { $crate::transmute(arr) } } } #[cfg(relaxed_coherence)] impl From> for [T; $n] { #[inline(always)] fn from(sel: GenericArray) -> [T; $n] { unsafe { $crate::transmute(sel) } } } impl<'a, T> From<&'a [T; $n]> for &'a GenericArray { #[inline] fn from(slice: &[T; $n]) -> &GenericArray { unsafe { &*(slice.as_ptr() as *const GenericArray) } } } impl<'a, T> From<&'a mut [T; $n]> for &'a mut GenericArray { #[inline] fn from(slice: &mut [T; $n]) -> &mut GenericArray { unsafe { &mut *(slice.as_mut_ptr() as *mut GenericArray) } } } #[cfg(not(relaxed_coherence))] impl Into<[T; $n]> for GenericArray { #[inline(always)] fn into(self) -> [T; $n] { unsafe { $crate::transmute(self) } } } impl AsRef<[T; $n]> for GenericArray { #[inline] fn as_ref(&self) -> &[T; $n] { unsafe { $crate::transmute(self) } } } impl AsMut<[T; $n]> for GenericArray { #[inline] fn as_mut(&mut self) -> &mut [T; $n] { unsafe { $crate::transmute(self) } } } )* } } impl_from! { 1 => ::typenum::U1, 2 => ::typenum::U2, 3 => ::typenum::U3, 4 => ::typenum::U4, 5 => ::typenum::U5, 6 => ::typenum::U6, 7 => ::typenum::U7, 8 => ::typenum::U8, 9 => ::typenum::U9, 10 => ::typenum::U10, 11 => ::typenum::U11, 12 => ::typenum::U12, 13 => ::typenum::U13, 14 => ::typenum::U14, 15 => ::typenum::U15, 16 => ::typenum::U16, 17 => ::typenum::U17, 18 => ::typenum::U18, 19 => ::typenum::U19, 20 => ::typenum::U20, 21 => ::typenum::U21, 22 => ::typenum::U22, 23 => ::typenum::U23, 24 => ::typenum::U24, 25 => ::typenum::U25, 26 => ::typenum::U26, 27 => ::typenum::U27, 28 => ::typenum::U28, 29 => ::typenum::U29, 30 => ::typenum::U30, 31 => ::typenum::U31, 32 => ::typenum::U32 } #[cfg(feature = "more_lengths")] impl_from! { 33 => ::typenum::U33, 34 => ::typenum::U34, 35 => ::typenum::U35, 36 => ::typenum::U36, 37 => ::typenum::U37, 38 => ::typenum::U38, 39 => ::typenum::U39, 40 => ::typenum::U40, 41 => ::typenum::U41, 42 => ::typenum::U42, 43 => ::typenum::U43, 44 => ::typenum::U44, 45 => ::typenum::U45, 46 => ::typenum::U46, 47 => ::typenum::U47, 48 => ::typenum::U48, 49 => ::typenum::U49, 50 => ::typenum::U50, 51 => ::typenum::U51, 52 => ::typenum::U52, 53 => ::typenum::U53, 54 => ::typenum::U54, 55 => ::typenum::U55, 56 => ::typenum::U56, 57 => ::typenum::U57, 58 => ::typenum::U58, 59 => ::typenum::U59, 60 => ::typenum::U60, 61 => ::typenum::U61, 62 => ::typenum::U62, 63 => ::typenum::U63, 64 => ::typenum::U64, 70 => ::typenum::U70, 80 => ::typenum::U80, 90 => ::typenum::U90, 100 => ::typenum::U100, 200 => ::typenum::U200, 300 => ::typenum::U300, 400 => ::typenum::U400, 500 => ::typenum::U500, 128 => ::typenum::U128, 256 => ::typenum::U256, 512 => ::typenum::U512, 1000 => ::typenum::U1000, 1024 => ::typenum::U1024 }