]> git.lizzy.rs Git - rust.git/blob - tests/ui/statics/static-impl.rs
Rollup merge of #106397 - compiler-errors:new-solver-impl-wc, r=lcnr
[rust.git] / tests / ui / statics / static-impl.rs
1 // run-pass
2 #![allow(non_camel_case_types)]
3
4
5
6
7 pub trait plus {
8     fn plus(&self) -> isize;
9 }
10
11 mod a {
12     use plus;
13     impl plus for usize { fn plus(&self) -> isize { *self as isize + 20 } }
14 }
15
16 mod b {
17     use plus;
18     impl plus for String { fn plus(&self) -> isize { 200 } }
19 }
20
21 trait uint_utils {
22     fn str(&self) -> String;
23     fn multi<F>(&self, f: F) where F: FnMut(usize);
24 }
25
26 impl uint_utils for usize {
27     fn str(&self) -> String {
28         self.to_string()
29     }
30     fn multi<F>(&self, mut f: F) where F: FnMut(usize) {
31         let mut c = 0_usize;
32         while c < *self { f(c); c += 1_usize; }
33     }
34 }
35
36 trait vec_utils<T> {
37     fn length_(&self, ) -> usize;
38     fn iter_<F>(&self, f: F) where F: FnMut(&T);
39     fn map_<U, F>(&self, f: F) -> Vec<U> where F: FnMut(&T) -> U;
40 }
41
42 impl<T> vec_utils<T> for Vec<T> {
43     fn length_(&self) -> usize { self.len() }
44     fn iter_<F>(&self, mut f: F) where F: FnMut(&T) { for x in self { f(x); } }
45     fn map_<U, F>(&self, mut f: F) -> Vec<U> where F: FnMut(&T) -> U {
46         let mut r = Vec::new();
47         for elt in self {
48             r.push(f(elt));
49         }
50         r
51     }
52 }
53
54 pub fn main() {
55     assert_eq!(10_usize.plus(), 30);
56     assert_eq!(("hi".to_string()).plus(), 200);
57
58     assert_eq!((vec![1]).length_().str(), "1".to_string());
59     let vect = vec![3, 4].map_(|a| *a + 4);
60     assert_eq!(vect[0], 7);
61     let vect = (vec![3, 4]).map_::<usize, _>(|a| *a as usize + 4_usize);
62     assert_eq!(vect[0], 7_usize);
63     let mut x = 0_usize;
64     10_usize.multi(|_n| x += 2_usize );
65     assert_eq!(x, 20_usize);
66 }