9
9
// except according to those terms.
10
10
11
11
// xfail-fast
12
- #[ legacy_modes] ;
13
12
14
- extern mod std;
15
- use std:: map:: * ;
13
+ use core:: container:: { Container , Mutable , Map } ;
16
14
17
15
enum cat_type { tuxedo, tabby, tortoiseshell }
18
16
@@ -28,121 +26,110 @@ impl cat_type : cmp::Eq {
28
26
29
27
// ok: T should be in scope when resolving the trait ref for map
30
28
struct cat < T > {
31
- // Yes, you can have negative meows
32
- priv mut meows : int ,
29
+ // Yes, you can have negative meows
30
+ priv mut meows : int ,
33
31
34
- mut how_hungry : int ,
35
- name : T ,
32
+ mut how_hungry : int ,
33
+ name : T ,
36
34
}
37
35
38
- impl < T : Copy > cat < T > {
39
- fn speak ( ) { self . meow ( ) ; }
40
-
41
- fn eat ( ) -> bool {
42
- if self . how_hungry > 0 {
43
- error ! ( "OM NOM NOM" ) ;
44
- self . how_hungry -= 2 ;
45
- return true ;
46
- }
47
- else {
48
- error ! ( "Not hungry!" ) ;
49
- return false ;
36
+ impl < T > cat < T > {
37
+ fn speak ( & mut self ) { self . meow ( ) ; }
38
+
39
+ fn eat ( & mut self ) -> bool {
40
+ if self . how_hungry > 0 {
41
+ error ! ( "OM NOM NOM" ) ;
42
+ self . how_hungry -= 2 ;
43
+ return true ;
44
+ } else {
45
+ error ! ( "Not hungry!" ) ;
46
+ return false ;
47
+ }
50
48
}
51
- }
52
49
}
53
50
54
- impl < T : Copy > cat < T > : StdMap < int , T > {
55
- pure fn size ( ) -> uint { self . meows as uint }
56
- fn insert ( +k : int , +_v : T ) -> bool {
57
- self . meows += k;
58
- true
59
- }
60
- pure fn contains_key ( +k : int ) -> bool { k <= self . meows }
61
- pure fn contains_key_ref ( k : & int ) -> bool { self . contains_key ( * k) }
62
-
63
- pure fn get( +k : int ) -> T { match self . find ( k) {
64
- Some ( v) => { v }
65
- None => { die ! ( ~"epic fail"); }
66
- }
67
- }
68
- pure fn find(+k:int) -> Option<T> { if k <= self.meows {
69
- Some(self.name)
70
- }
71
- else { None }
72
- }
73
-
74
- fn update_with_key(+key: int, +val: T, ff: fn(+k: int, +v0: T, +v1: T) -> T) -> bool {
75
- match self.find(key) {
76
- None => return self.insert(key, val),
77
- Some(copy orig) => return self.insert(key, ff(key, orig, val))
78
- }
79
- }
51
+ impl < T > cat < T > : Container {
52
+ pure fn len ( & self ) -> uint { self . meows as uint }
53
+ pure fn is_empty ( & self ) -> bool { self . meows == 0 }
54
+ }
80
55
81
- fn update(+key: int, +val: T, ff: fn(+v0: T, +v1: T) -> T) -> bool {
82
- match self.find(key) {
83
- None => return self.insert(key, val),
84
- Some(copy orig) => return self.insert(key, ff(orig, val))
85
- }
86
- }
56
+ impl < T > cat < T > : Mutable {
57
+ fn clear ( & mut self ) { }
58
+ }
87
59
60
+ impl < T > cat < T > : Map < int , T > {
61
+ pure fn contains_key ( & self , k : & int ) -> bool { * k <= self . meows }
88
62
89
- fn remove(+k: int) -> bool {
90
- match self.find(k) {
91
- Some(x) => {
92
- self.meows -= k; true
93
- }
94
- None => { false }
63
+ pure fn each ( & self , f : fn ( v : & int , v : & T ) -> bool ) {
64
+ let mut n = int :: abs ( self . meows ) ;
65
+ while n > 0 {
66
+ if ! f ( & n , & self . name ) { break ; }
67
+ n -= 1 ;
68
+ }
95
69
}
96
- }
97
70
98
- pure fn each(f: fn(+v: int, +v: T) -> bool) {
99
- let mut n = int::abs(self.meows);
100
- while n > 0 {
101
- if !f(n, self.name) { break; }
102
- n -= 1;
71
+ pure fn each_key ( & self , f : fn ( v : & int ) -> bool ) {
72
+ for self . each |k, _| { if !f ( k) { break ; } loop ; } ;
103
73
}
104
- }
105
74
106
- pure fn each_key(&&f: fn(+v: int) -> bool) {
107
- for self.each |k, _v| { if !f(k) { break; } loop;};
108
- }
109
- pure fn each_value(&&f: fn(+v: T) -> bool) {
110
- for self.each |_k, v| { if !f(v) { break; } loop;};
111
- }
75
+ pure fn each_value ( & self , f : fn ( v : & T ) -> bool ) {
76
+ for self . each |_, v| { if !f ( v) { break ; } loop ; } ;
77
+ }
78
+
79
+ fn insert ( & mut self , k : int , _: T ) -> bool {
80
+ self . meows += k;
81
+ true
82
+ }
112
83
113
- pure fn each_ref(f: fn(k: &int, v: &T) -> bool) {}
114
- pure fn each_key_ref(f: fn(k: &int) -> bool) {}
115
- pure fn each_value_ref(f: fn(k: &T) -> bool) {}
84
+ pure fn find ( & self , k : & int ) -> Option < & self /T > {
85
+ if * k <= self . meows {
86
+ Some ( & self . name )
87
+ } else {
88
+ None
89
+ }
90
+ }
116
91
117
- fn clear() { }
92
+ fn remove ( & mut self , k : & int ) -> bool {
93
+ match self . find ( k) {
94
+ Some ( _) => {
95
+ self . meows -= * k; true
96
+ }
97
+ None => { false }
98
+ }
99
+ }
118
100
}
119
101
120
- priv impl<T: Copy> cat<T> {
121
- fn meow() {
122
- self.meows += 1;
123
- error!(" Meow %d", self.meows);
124
- if self.meows % 5 == 0 {
125
- self.how_hungry += 1;
126
- }
102
+ impl < T > cat < T > {
103
+ pure fn get( & self , k : & int ) -> & self /T {
104
+ match self . find ( k) {
105
+ Some ( v) => { v }
106
+ None => { die ! ( ~"epic fail"); }
107
+ }
108
+ }
109
+
110
+ static pure fn new(in_x: int, in_y: int, in_name: T) -> cat<T> {
111
+ cat{meows: in_x, how_hungry: in_y, name: in_name }
127
112
}
128
113
}
129
114
130
- fn cat<T: Copy>(in_x : int, in_y : int, in_name: T) -> cat<T> {
131
- cat {
132
- meows: in_x,
133
- how_hungry: in_y,
134
- name: in_name
115
+ priv impl<T> cat<T> {
116
+ fn meow(&mut self) {
117
+ self.meows += 1;
118
+ error!(" Meow %d", self.meows);
119
+ if self.meows % 5 == 0 {
120
+ self.how_hungry += 1;
121
+ }
135
122
}
136
123
}
137
124
138
- pub fn main() {
139
- let nyan : cat<~str> = cat(0, 2, ~" nyan");
140
- for uint::range(1u, 5u ) |_i | { nyan.speak(); }
141
- assert(nyan.find(1) == Some( ~" nyan") ) ;
142
- assert ( nyan. find ( 10 ) == None ) ;
143
- let spotty : cat < cat_type > = cat ( 2 , 57 , tuxedo) ;
144
- for uint:: range( 0 u , 6 u ) |_i | { spotty. speak ( ) ; }
145
- assert ( spotty. size ( ) == 8 u ) ;
146
- assert ( spotty. contains_key ( 2 ) ) ;
147
- assert ( spotty. get ( 3 ) == tuxedo) ;
125
+ fn main() {
126
+ let mut nyan : cat<~str> = cat::new (0, 2, ~" nyan");
127
+ for uint::range(1, 5 ) |_ | { nyan.speak(); }
128
+ assert(* nyan.find(&1).unwrap() == ~" nyan" ) ;
129
+ assert ( nyan. find ( & 10 ) == None ) ;
130
+ let mut spotty : cat < cat_type > = cat:: new ( 2 , 57 , tuxedo) ;
131
+ for uint:: range( 0 , 6 ) |_ | { spotty. speak ( ) ; }
132
+ assert ( spotty. len ( ) == 8 ) ;
133
+ assert ( spotty. contains_key ( & 2 ) ) ;
134
+ assert ( spotty. get ( & 3 ) == & tuxedo) ;
148
135
}
0 commit comments