1 //! Implementation for `arr!` macro.
3 use super::ArrayLength
;
7 /// Helper trait for `arr!` macro
8 pub trait AddLength
<T
, N
: ArrayLength
<T
>>: ArrayLength
<T
> {
10 type Output
: ArrayLength
<T
>;
13 impl<T
, N1
, N2
> AddLength
<T
, N2
> for N1
15 N1
: ArrayLength
<T
> + Add
<N2
>,
17 <N1
as Add
<N2
>>::Output
: ArrayLength
<T
>,
19 type Output
= <N1
as Add
<N2
>>::Output
;
22 /// Helper type for `arr!` macro
23 pub type Inc
<T
, U
> = <U
as AddLength
<T
, U1
>>::Output
;
27 macro_rules
! arr_impl
{
28 (@replace_expr $e
:expr
) => { 1 }
;
29 ($T
:ty
; $N
:ty
, [$
($x
:expr
),*], []) => ({
30 const __ARR_LENGTH
: usize = 0 $
(+ $
crate::arr_impl
!(@replace_expr $x
) )*;
33 fn __do_transmute
<T
, N
: $
crate::ArrayLength
<T
>>(arr
: [T
; __ARR_LENGTH
]) -> $
crate::GenericArray
<T
, N
> {
34 unsafe { $crate::transmute(arr) }
37 let _
: [(); <$N
as $
crate::typenum
::Unsigned
>::USIZE
] = [(); __ARR_LENGTH
];
39 __do_transmute
::<$T
, $N
>([$
($x
as $T
),*])
41 ($T
:ty
; $N
:ty
, [], [$x1
:expr
]) => (
42 $
crate::arr_impl
!($T
; $
crate::arr
::Inc
<$T
, $N
>, [$x1
], [])
44 ($T
:ty
; $N
:ty
, [], [$x1
:expr
, $
($x
:expr
),+]) => (
45 $
crate::arr_impl
!($T
; $
crate::arr
::Inc
<$T
, $N
>, [$x1
], [$
($x
),+])
47 ($T
:ty
; $N
:ty
, [$
($y
:expr
),+], [$x1
:expr
]) => (
48 $
crate::arr_impl
!($T
; $
crate::arr
::Inc
<$T
, $N
>, [$
($y
),+, $x1
], [])
50 ($T
:ty
; $N
:ty
, [$
($y
:expr
),+], [$x1
:expr
, $
($x
:expr
),+]) => (
51 $
crate::arr_impl
!($T
; $
crate::arr
::Inc
<$T
, $N
>, [$
($y
),+, $x1
], [$
($x
),+])
55 /// Macro allowing for easy generation of Generic Arrays.
56 /// Example: `let test = arr![u32; 1, 2, 3];`
60 unsafe { $crate::transmute::<[$T; 0], $crate::GenericArray<$T, $crate::typenum::U0>>([]) }
62 ($T
:ty
; $
($x
:expr
),* $
(,)*) => (
63 $
crate::arr_impl
!($T
; $
crate::typenum
::U0
, [], [$
($x
),*])
65 ($
($x
:expr
,)+) => (arr
![$
($x
),+]);
66 () => ("""Macro requires a type, e.g. `let array = arr![u32; 1, 2, 3];`")
73 /// Testing that lifetimes aren't transmuted when they're ellided.
76 /// #[macro_use] extern crate generic_array;
78 /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'static A {
85 /// #[macro_use] extern crate generic_array;
87 /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'a A {
93 /// # Without ellision
95 /// Testing that lifetimes aren't transmuted when they're specified explicitly.
98 /// #[macro_use] extern crate generic_array;
100 /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'static A {
101 /// arr![&'a A; a][0]
107 /// #[macro_use] extern crate generic_array;
109 /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'static A {
110 /// arr![&'static A; a][0]
116 /// #[macro_use] extern crate generic_array;
118 /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'a A {
119 /// arr![&'a A; a][0]