generic_array/
impls.rs

1use core::borrow::{Borrow, BorrowMut};
2use core::cmp::Ordering;
3use core::fmt::{self, Debug};
4use core::hash::{Hash, Hasher};
5
6use super::{ArrayLength, GenericArray};
7
8use crate::functional::*;
9use crate::sequence::*;
10
11impl<T: Default, N> Default for GenericArray<T, N>
12where
13    N: ArrayLength<T>,
14{
15    #[inline(always)]
16    fn default() -> Self {
17        Self::generate(|_| T::default())
18    }
19}
20
21impl<T: Clone, N> Clone for GenericArray<T, N>
22where
23    N: ArrayLength<T>,
24{
25    fn clone(&self) -> GenericArray<T, N> {
26        self.map(Clone::clone)
27    }
28}
29
30impl<T: Copy, N> Copy for GenericArray<T, N>
31where
32    N: ArrayLength<T>,
33    N::ArrayType: Copy,
34{
35}
36
37impl<T: PartialEq, N> PartialEq for GenericArray<T, N>
38where
39    N: ArrayLength<T>,
40{
41    fn eq(&self, other: &Self) -> bool {
42        **self == **other
43    }
44}
45impl<T: Eq, N> Eq for GenericArray<T, N> where N: ArrayLength<T> {}
46
47impl<T: PartialOrd, N> PartialOrd for GenericArray<T, N>
48where
49    N: ArrayLength<T>,
50{
51    fn partial_cmp(&self, other: &GenericArray<T, N>) -> Option<Ordering> {
52        PartialOrd::partial_cmp(self.as_slice(), other.as_slice())
53    }
54}
55
56impl<T: Ord, N> Ord for GenericArray<T, N>
57where
58    N: ArrayLength<T>,
59{
60    fn cmp(&self, other: &GenericArray<T, N>) -> Ordering {
61        Ord::cmp(self.as_slice(), other.as_slice())
62    }
63}
64
65impl<T: Debug, N> Debug for GenericArray<T, N>
66where
67    N: ArrayLength<T>,
68{
69    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
70        self[..].fmt(fmt)
71    }
72}
73
74impl<T, N> Borrow<[T]> for GenericArray<T, N>
75where
76    N: ArrayLength<T>,
77{
78    #[inline(always)]
79    fn borrow(&self) -> &[T] {
80        &self[..]
81    }
82}
83
84impl<T, N> BorrowMut<[T]> for GenericArray<T, N>
85where
86    N: ArrayLength<T>,
87{
88    #[inline(always)]
89    fn borrow_mut(&mut self) -> &mut [T] {
90        &mut self[..]
91    }
92}
93
94impl<T, N> AsRef<[T]> for GenericArray<T, N>
95where
96    N: ArrayLength<T>,
97{
98    #[inline(always)]
99    fn as_ref(&self) -> &[T] {
100        &self[..]
101    }
102}
103
104impl<T, N> AsMut<[T]> for GenericArray<T, N>
105where
106    N: ArrayLength<T>,
107{
108    #[inline(always)]
109    fn as_mut(&mut self) -> &mut [T] {
110        &mut self[..]
111    }
112}
113
114impl<T: Hash, N> Hash for GenericArray<T, N>
115where
116    N: ArrayLength<T>,
117{
118    fn hash<H>(&self, state: &mut H)
119    where
120        H: Hasher,
121    {
122        Hash::hash(&self[..], state)
123    }
124}
125
126macro_rules! impl_from {
127    ($($n: expr => $ty: ty),*) => {
128        $(
129            impl<T> From<[T; $n]> for GenericArray<T, $ty> {
130                #[inline(always)]
131                fn from(arr: [T; $n]) -> Self {
132                    unsafe { $crate::transmute(arr) }
133                }
134            }
135
136            #[cfg(relaxed_coherence)]
137            impl<T> From<GenericArray<T, $ty>> for [T; $n] {
138                #[inline(always)]
139                fn from(sel: GenericArray<T, $ty>) -> [T; $n] {
140                    unsafe { $crate::transmute(sel) }
141                }
142            }
143
144            impl<'a, T> From<&'a [T; $n]> for &'a GenericArray<T, $ty> {
145                #[inline]
146                fn from(slice: &[T; $n]) -> &GenericArray<T, $ty> {
147                    unsafe { &*(slice.as_ptr() as *const GenericArray<T, $ty>) }
148                }
149            }
150
151            impl<'a, T> From<&'a mut [T; $n]> for &'a mut GenericArray<T, $ty> {
152                #[inline]
153                fn from(slice: &mut [T; $n]) -> &mut GenericArray<T, $ty> {
154                    unsafe { &mut *(slice.as_mut_ptr() as *mut GenericArray<T, $ty>) }
155                }
156            }
157
158            #[cfg(not(relaxed_coherence))]
159            impl<T> Into<[T; $n]> for GenericArray<T, $ty> {
160                #[inline(always)]
161                fn into(self) -> [T; $n] {
162                    unsafe { $crate::transmute(self) }
163                }
164            }
165
166            impl<T> AsRef<[T; $n]> for GenericArray<T, $ty> {
167                #[inline]
168                fn as_ref(&self) -> &[T; $n] {
169                    unsafe { $crate::transmute(self) }
170                }
171            }
172
173            impl<T> AsMut<[T; $n]> for GenericArray<T, $ty> {
174                #[inline]
175                fn as_mut(&mut self) -> &mut [T; $n] {
176                    unsafe { $crate::transmute(self) }
177                }
178            }
179        )*
180    }
181}
182
183impl_from! {
184    1  => ::typenum::U1,
185    2  => ::typenum::U2,
186    3  => ::typenum::U3,
187    4  => ::typenum::U4,
188    5  => ::typenum::U5,
189    6  => ::typenum::U6,
190    7  => ::typenum::U7,
191    8  => ::typenum::U8,
192    9  => ::typenum::U9,
193    10 => ::typenum::U10,
194    11 => ::typenum::U11,
195    12 => ::typenum::U12,
196    13 => ::typenum::U13,
197    14 => ::typenum::U14,
198    15 => ::typenum::U15,
199    16 => ::typenum::U16,
200    17 => ::typenum::U17,
201    18 => ::typenum::U18,
202    19 => ::typenum::U19,
203    20 => ::typenum::U20,
204    21 => ::typenum::U21,
205    22 => ::typenum::U22,
206    23 => ::typenum::U23,
207    24 => ::typenum::U24,
208    25 => ::typenum::U25,
209    26 => ::typenum::U26,
210    27 => ::typenum::U27,
211    28 => ::typenum::U28,
212    29 => ::typenum::U29,
213    30 => ::typenum::U30,
214    31 => ::typenum::U31,
215    32 => ::typenum::U32
216}
217
218#[cfg(feature = "more_lengths")]
219impl_from! {
220    33 => ::typenum::U33,
221    34 => ::typenum::U34,
222    35 => ::typenum::U35,
223    36 => ::typenum::U36,
224    37 => ::typenum::U37,
225    38 => ::typenum::U38,
226    39 => ::typenum::U39,
227    40 => ::typenum::U40,
228    41 => ::typenum::U41,
229    42 => ::typenum::U42,
230    43 => ::typenum::U43,
231    44 => ::typenum::U44,
232    45 => ::typenum::U45,
233    46 => ::typenum::U46,
234    47 => ::typenum::U47,
235    48 => ::typenum::U48,
236    49 => ::typenum::U49,
237    50 => ::typenum::U50,
238    51 => ::typenum::U51,
239    52 => ::typenum::U52,
240    53 => ::typenum::U53,
241    54 => ::typenum::U54,
242    55 => ::typenum::U55,
243    56 => ::typenum::U56,
244    57 => ::typenum::U57,
245    58 => ::typenum::U58,
246    59 => ::typenum::U59,
247    60 => ::typenum::U60,
248    61 => ::typenum::U61,
249    62 => ::typenum::U62,
250    63 => ::typenum::U63,
251    64 => ::typenum::U64,
252
253    70 => ::typenum::U70,
254    80 => ::typenum::U80,
255    90 => ::typenum::U90,
256
257    100 => ::typenum::U100,
258    200 => ::typenum::U200,
259    300 => ::typenum::U300,
260    400 => ::typenum::U400,
261    500 => ::typenum::U500,
262
263    128 => ::typenum::U128,
264    256 => ::typenum::U256,
265    512 => ::typenum::U512,
266
267    1000 => ::typenum::U1000,
268    1024 => ::typenum::U1024
269}