4 fn alpha(self) -> usize;
9 fn gamma(self) -> Self::Gamma
;
13 fn delta(self) -> usize;
16 pub trait Epsilon
<'a
> {
18 fn zeta(&'a
self) -> Self::Zeta
;
20 fn epsilon(&'a
self) -> usize;
24 fn eta(self) -> usize;
29 pub fn assert_alpha
<T
: Alpha
>(x
: T
) -> usize { x.alpha() }
30 pub fn assert_static
<T
: '
static>(_
: T
) -> usize { 24 }
31 pub fn assert_delta
<T
: Delta
>(x
: T
) -> usize { x.delta() }
32 pub fn assert_epsilon_specific
<'a
, T
: 'a
+ Epsilon
<'a
>>(x
: &'a T
) -> usize { x.epsilon() }
33 pub fn assert_epsilon_forall
<T
: for<'a
> Epsilon
<'a
>>() {}
34 pub fn assert_forall_epsilon_zeta_satisfies_eta
<T
>(x
: T
) -> usize
36 T
: for<'a
> Epsilon
<'a
>,
37 for<'a
> <T
as Epsilon
<'a
>>::Zeta
: Eta
,
39 x
.epsilon() + x
.zeta().eta()
42 // Implementations and types:
44 #[derive(Copy, Clone)]
47 #[derive(Copy, Clone)]
50 #[derive(Copy, Clone)]
53 impl Beta
for BetaType
{
54 type Gamma
= GammaType
;
55 fn gamma(self) -> Self::Gamma { GammaType }
58 impl<'a
> Beta
for &'a BetaType
{
59 type Gamma
= GammaType
;
60 fn gamma(self) -> Self::Gamma { GammaType }
63 impl Beta
for GammaType
{
65 fn gamma(self) -> Self::Gamma { self }
68 impl Alpha
for GammaType
{
69 fn alpha(self) -> usize { 42 }
72 impl Delta
for GammaType
{
73 fn delta(self) -> usize { 1337 }
76 impl<'a
> Epsilon
<'a
> for GammaType
{
78 fn zeta(&'a
self) -> Self::Zeta { ZetaType }
80 fn epsilon(&'a
self) -> usize { 7331 }
83 impl Eta
for ZetaType
{
84 fn eta(self) -> usize { 7 }
87 // Desugared forms to check against:
89 pub fn desugared_bound
<B
>(beta
: B
) -> usize
94 let gamma
: B
::Gamma
= beta
.gamma();
95 assert_alpha
::<B
::Gamma
>(gamma
)
98 pub fn desugared_bound_region
<B
>(beta
: B
) -> usize
103 assert_static
::<B
::Gamma
>(beta
.gamma())
106 pub fn desugared_bound_multi
<B
>(beta
: B
) -> usize
109 B
::Gamma
: Alpha
+ '
static + Delta
,
111 assert_alpha
::<B
::Gamma
>(beta
.gamma()) +
112 assert_static
::<B
::Gamma
>(beta
.gamma()) +
113 assert_delta
::<B
::Gamma
>(beta
.gamma())
116 pub fn desugared_bound_region_specific
<'a
, B
>(gamma
: &'a B
::Gamma
) -> usize
119 B
::Gamma
: 'a
+ Epsilon
<'a
>,
121 assert_epsilon_specific
::<B
::Gamma
>(gamma
)
124 pub fn desugared_bound_region_forall
<B
>(beta
: B
) -> usize
127 B
::Gamma
: Copy
+ for<'a
> Epsilon
<'a
>,
129 assert_epsilon_forall
::<B
::Gamma
>();
130 let g1
: B
::Gamma
= beta
.gamma();
131 let g2
: B
::Gamma
= g1
;
132 assert_epsilon_specific
::<B
::Gamma
>(&g1
) +
133 assert_epsilon_specific
::<B
::Gamma
>(&g2
)
136 pub fn desugared_bound_region_forall2
<B
>(beta
: B
) -> usize
139 B
::Gamma
: Copy
+ for<'a
> Epsilon
<'a
>,
140 for<'a
> <B
::Gamma
as Epsilon
<'a
>>::Zeta
: Eta
,
142 let gamma
= beta
.gamma();
143 assert_forall_epsilon_zeta_satisfies_eta
::<B
::Gamma
>(gamma
)
146 pub fn desugared_contraint_region_forall
<B
>(beta
: B
) -> usize
149 for<'a
> <&'a B
as Beta
>::Gamma
: Alpha
,
151 let g1
= beta
.gamma();
152 let g2
= beta
.gamma();
153 assert_alpha(g1
) + assert_alpha(g2
)
156 pub fn desugared_bound_nested
<B
>(beta
: B
) -> usize
159 B
::Gamma
: Copy
+ Alpha
+ Beta
,
160 <B
::Gamma
as Beta
>::Gamma
: Delta
,
162 let go
= beta
.gamma();
164 go
.alpha() + gi
.delta()
169 let gamma
= beta
.gamma();
171 assert_eq
!(42, desugared_bound(beta
));
172 assert_eq
!(24, desugared_bound_region(beta
));
173 assert_eq
!(42 + 24 + 1337, desugared_bound_multi(beta
));
174 assert_eq
!(7331, desugared_bound_region_specific
::<BetaType
>(&gamma
));
175 assert_eq
!(7331 * 2, desugared_bound_region_forall(beta
));
176 assert_eq
!(42 + 1337, desugared_bound_nested(beta
));