summaryrefslogtreecommitdiffstats
path: root/src/test/rustdoc/const-generics/const-generics-docs.rs
blob: 87d2f29e26055461a284f5b581469cc2e421e399 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// edition:2018
// aux-build: extern_crate.rs
#![crate_name = "foo"]

extern crate extern_crate;
// @has foo/fn.extern_fn.html '//pre[@class="rust fn"]' \
//      'pub fn extern_fn<const N: usize>() -> impl Iterator<Item = [u8; N]>'
pub use extern_crate::extern_fn;
// @has foo/struct.ExternTy.html '//pre[@class="rust struct"]' \
//      'pub struct ExternTy<const N: usize> {'
pub use extern_crate::ExternTy;
// @has foo/type.TyAlias.html '//pre[@class="rust typedef"]' \
//      'type TyAlias<const N: usize> = ExternTy<N>;'
pub use extern_crate::TyAlias;
// @has foo/trait.WTrait.html '//pre[@class="rust trait"]' \
//      'pub trait WTrait<const N: usize, const M: usize>'
// @has - '//*[@class="rust trait"]' 'fn hey<const P: usize>() -> usize'
pub use extern_crate::WTrait;

// @has foo/trait.Trait.html '//pre[@class="rust trait"]' \
//      'pub trait Trait<const N: usize>'
// @has - '//*[@id="impl-Trait%3C1%3E-for-u8"]//h3[@class="code-header in-band"]' 'impl Trait<1> for u8'
// @has - '//*[@id="impl-Trait%3C2%3E-for-u8"]//h3[@class="code-header in-band"]' 'impl Trait<2> for u8'
// @has - '//*[@id="impl-Trait%3C{1%20+%202}%3E-for-u8"]//h3[@class="code-header in-band"]' 'impl Trait<{1 + 2}> for u8'
// @has - '//*[@id="impl-Trait%3CN%3E-for-%5Bu8%3B%20N%5D"]//h3[@class="code-header in-band"]' \
//      'impl<const N: usize> Trait<N> for [u8; N]'
pub trait Trait<const N: usize> {}
impl Trait<1> for u8 {}
impl Trait<2> for u8 {}
impl Trait<{1 + 2}> for u8 {}
impl<const N: usize> Trait<N> for [u8; N] {}

// @has foo/struct.Foo.html '//pre[@class="rust struct"]' \
//      'pub struct Foo<const N: usize>where u8: Trait<N>'
pub struct Foo<const N: usize> where u8: Trait<N>;
// @has foo/struct.Bar.html '//pre[@class="rust struct"]' 'pub struct Bar<T, const N: usize>(_)'
pub struct Bar<T, const N: usize>([T; N]);

// @has foo/struct.Foo.html '//*[@id="impl-Foo%3CM%3E"]/h3[@class="code-header in-band"]' 'impl<const M: usize> Foo<M>where u8: Trait<M>'
impl<const M: usize> Foo<M> where u8: Trait<M> {
    // @has - '//*[@id="associatedconstant.FOO_ASSOC"]' 'pub const FOO_ASSOC: usize'
    pub const FOO_ASSOC: usize = M + 13;

    // @has - '//*[@id="method.hey"]' 'pub fn hey<const N: usize>(&self) -> Bar<u8, N>'
    pub fn hey<const N: usize>(&self) -> Bar<u8, N> {
        Bar([0; N])
    }
}

// @has foo/struct.Bar.html '//*[@id="impl-Bar%3Cu8%2C%20M%3E"]/h3[@class="code-header in-band"]' 'impl<const M: usize> Bar<u8, M>'
impl<const M: usize> Bar<u8, M> {
    // @has - '//*[@id="method.hey"]' \
    //      'pub fn hey<const N: usize>(&self) -> Foo<N>where u8: Trait<N>'
    pub fn hey<const N: usize>(&self) -> Foo<N> where u8: Trait<N> {
        Foo
    }
}

// @has foo/fn.test.html '//pre[@class="rust fn"]' \
//      'pub fn test<const N: usize>() -> impl Trait<N>where u8: Trait<N>'
pub fn test<const N: usize>() -> impl Trait<N> where u8: Trait<N> {
    2u8
}

// @has foo/fn.a_sink.html '//pre[@class="rust fn"]' \
//      'pub async fn a_sink<const N: usize>(v: [u8; N]) -> impl Trait<N>'
pub async fn a_sink<const N: usize>(v: [u8; N]) -> impl Trait<N> {
    v
}

// @has foo/fn.b_sink.html '//pre[@class="rust fn"]' \
//      'pub async fn b_sink<const N: usize>(_: impl Trait<N>)'
pub async fn b_sink<const N: usize>(_: impl Trait<N>) {}

// @has foo/fn.concrete.html '//pre[@class="rust fn"]' \
//      'pub fn concrete() -> [u8; 22]'
pub fn concrete() -> [u8; 3 + std::mem::size_of::<u64>() << 1] {
    Default::default()
}

// @has foo/type.Faz.html '//pre[@class="rust typedef"]' \
//      'type Faz<const N: usize> = [u8; N];'
pub type Faz<const N: usize> = [u8; N];
// @has foo/type.Fiz.html '//pre[@class="rust typedef"]' \
//      'type Fiz<const N: usize> = [[u8; N]; 48];'
pub type Fiz<const N: usize> = [[u8; N]; 3 << 4];

macro_rules! define_me {
    ($t:tt<$q:tt>) => {
        pub struct $t<const $q: usize>([u8; $q]);
    }
}

// @has foo/struct.Foz.html '//pre[@class="rust struct"]' \
//      'pub struct Foz<const N: usize>(_);'
define_me!(Foz<N>);

trait Q {
    const ASSOC: usize;
}

impl<const N: usize> Q for [u8; N] {
    const ASSOC: usize = N;
}

// @has foo/fn.q_user.html '//pre[@class="rust fn"]' \
//      'pub fn q_user() -> [u8; 13]'
pub fn q_user() -> [u8; <[u8; 13] as Q>::ASSOC] {
    [0; <[u8; 13] as Q>::ASSOC]
}

// @has foo/union.Union.html '//pre[@class="rust union"]' \
//      'pub union Union<const N: usize>'
pub union Union<const N: usize> {
    // @has - //pre "pub arr: [u8; N]"
    pub arr: [u8; N],
    // @has - //pre "pub another_arr: [(); N]"
    pub another_arr: [(); N],
}

// @has foo/enum.Enum.html '//pre[@class="rust enum"]' \
//      'pub enum Enum<const N: usize>'
pub enum Enum<const N: usize> {
    // @has - //pre "Variant([u8; N])"
    Variant([u8; N]),
    // @has - //pre "EmptyVariant"
    EmptyVariant,
}