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<T: Default, N> Default for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
#[inline(always)] | |
fn default() -> Self { | |
Self::generate(|_| T::default()) | |
} | |
} | |
impl<T: Clone, N> Clone for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
fn clone(&self) -> GenericArray<T, N> { | |
self.map(Clone::clone) | |
} | |
} | |
impl<T: Copy, N> Copy for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
N::ArrayType: Copy, | |
{ | |
} | |
impl<T: PartialEq, N> PartialEq for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
fn eq(&self, other: &Self) -> bool { | |
**self == **other | |
} | |
} | |
impl<T: Eq, N> Eq for GenericArray<T, N> where N: ArrayLength<T> {} | |
impl<T: PartialOrd, N> PartialOrd for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
fn partial_cmp(&self, other: &GenericArray<T, N>) -> Option<Ordering> { | |
PartialOrd::partial_cmp(self.as_slice(), other.as_slice()) | |
} | |
} | |
impl<T: Ord, N> Ord for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
fn cmp(&self, other: &GenericArray<T, N>) -> Ordering { | |
Ord::cmp(self.as_slice(), other.as_slice()) | |
} | |
} | |
impl<T: Debug, N> Debug for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { | |
self[..].fmt(fmt) | |
} | |
} | |
impl<T, N> Borrow<[T]> for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
#[inline(always)] | |
fn borrow(&self) -> &[T] { | |
&self[..] | |
} | |
} | |
impl<T, N> BorrowMut<[T]> for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
#[inline(always)] | |
fn borrow_mut(&mut self) -> &mut [T] { | |
&mut self[..] | |
} | |
} | |
impl<T, N> AsRef<[T]> for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
#[inline(always)] | |
fn as_ref(&self) -> &[T] { | |
&self[..] | |
} | |
} | |
impl<T, N> AsMut<[T]> for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
#[inline(always)] | |
fn as_mut(&mut self) -> &mut [T] { | |
&mut self[..] | |
} | |
} | |
impl<T: Hash, N> Hash for GenericArray<T, N> | |
where | |
N: ArrayLength<T>, | |
{ | |
fn hash<H>(&self, state: &mut H) | |
where | |
H: Hasher, | |
{ | |
Hash::hash(&self[..], state) | |
} | |
} | |
macro_rules! impl_from { | |
($($n: expr => $ty: ty),*) => { | |
$( | |
impl<T> From<[T; $n]> for GenericArray<T, $ty> { | |
#[inline(always)] | |
fn from(arr: [T; $n]) -> Self { | |
unsafe { $crate::transmute(arr) } | |
} | |
} | |
#[cfg(relaxed_coherence)] | |
impl<T> From<GenericArray<T, $ty>> for [T; $n] { | |
#[inline(always)] | |
fn from(sel: GenericArray<T, $ty>) -> [T; $n] { | |
unsafe { $crate::transmute(sel) } | |
} | |
} | |
impl<'a, T> From<&'a [T; $n]> for &'a GenericArray<T, $ty> { | |
#[inline] | |
fn from(slice: &[T; $n]) -> &GenericArray<T, $ty> { | |
unsafe { &*(slice.as_ptr() as *const GenericArray<T, $ty>) } | |
} | |
} | |
impl<'a, T> From<&'a mut [T; $n]> for &'a mut GenericArray<T, $ty> { | |
#[inline] | |
fn from(slice: &mut [T; $n]) -> &mut GenericArray<T, $ty> { | |
unsafe { &mut *(slice.as_mut_ptr() as *mut GenericArray<T, $ty>) } | |
} | |
} | |
#[cfg(not(relaxed_coherence))] | |
impl<T> Into<[T; $n]> for GenericArray<T, $ty> { | |
#[inline(always)] | |
fn into(self) -> [T; $n] { | |
unsafe { $crate::transmute(self) } | |
} | |
} | |
impl<T> AsRef<[T; $n]> for GenericArray<T, $ty> { | |
#[inline] | |
fn as_ref(&self) -> &[T; $n] { | |
unsafe { $crate::transmute(self) } | |
} | |
} | |
impl<T> AsMut<[T; $n]> for GenericArray<T, $ty> { | |
#[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 | |
} |