]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generic-associated-types/iterable.rs
Rollup merge of #102954 - GuillaumeGomez:cfg-hide-attr-checks, r=Manishearth
[rust.git] / src / test / ui / generic-associated-types / iterable.rs
1 // run-pass
2
3 trait Iterable {
4     type Item<'a> where Self: 'a;
5     type Iter<'a>: Iterator<Item = Self::Item<'a>> where Self: 'a;
6
7     fn iter<'a>(&'a self) -> Self::Iter<'a>;
8 }
9
10 // Impl for struct type
11 impl<T> Iterable for Vec<T> {
12     type Item<'a> = <std::slice::Iter<'a, T> as Iterator>::Item where T: 'a;
13     type Iter<'a> = std::slice::Iter<'a, T> where T: 'a;
14
15     fn iter<'a>(&'a self) -> Self::Iter<'a> {
16         self[..].iter()
17     }
18 }
19
20 // Impl for a primitive type
21 impl<T> Iterable for [T] {
22     type Item<'a> = <std::slice::Iter<'a, T> as Iterator>::Item where T: 'a;
23     type Iter<'a> = std::slice::Iter<'a, T> where T: 'a;
24
25     fn iter<'a>(&'a self) -> Self::Iter<'a> {
26         self.iter()
27     }
28 }
29
30 fn make_iter<'a, I: Iterable + ?Sized>(it: &'a I) -> I::Iter<'a> {
31     it.iter()
32 }
33
34 fn get_first<'a, I: Iterable + ?Sized>(it: &'a I) -> Option<I::Item<'a>> {
35     it.iter().next()
36 }
37
38 fn main() {
39     let v = vec![1, 2, 3];
40     assert_eq!(v, make_iter(&v).copied().collect::<Vec<_>>());
41     assert_eq!(v, make_iter(&*v).copied().collect::<Vec<_>>());
42     assert_eq!(Some(&1), get_first(&v));
43     assert_eq!(Some(&1), get_first(&*v));
44 }