Skip to content

Commit aaafe26

Browse files
committed
---
yaml --- r: 41449 b: refs/heads/snap-stage3 c: a06ef74 h: refs/heads/master i: 41447: a2716f6 v: v3
1 parent 1835257 commit aaafe26

File tree

2 files changed

+85
-98
lines changed

2 files changed

+85
-98
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 09bb07bed9166105ea961a42b5fff7739ae0d2e9
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 0a75aefad0e43e129fcba5e6c38fc9bbc620b952
4+
refs/heads/snap-stage3: a06ef7424c1ce55b59351df88888f3b019c99796
55
refs/heads/try: 3d5418789064fdb463e872a4e651af1c628a3650
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b

branches/snap-stage3/src/test/run-pass/class-impl-very-parameterized-trait.rs

Lines changed: 84 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@
99
// except according to those terms.
1010

1111
// xfail-fast
12-
#[legacy_modes];
1312

14-
extern mod std;
15-
use std::map::*;
13+
use core::container::{Container, Mutable, Map};
1614

1715
enum cat_type { tuxedo, tabby, tortoiseshell }
1816

@@ -28,121 +26,110 @@ impl cat_type : cmp::Eq {
2826

2927
// ok: T should be in scope when resolving the trait ref for map
3028
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,
3331

34-
mut how_hungry : int,
35-
name : T,
32+
mut how_hungry : int,
33+
name : T,
3634
}
3735

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+
}
5048
}
51-
}
5249
}
5350

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+
}
8055

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+
}
8759

60+
impl<T> cat<T>: Map<int, T> {
61+
pure fn contains_key(&self, k: &int) -> bool { *k <= self.meows }
8862

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+
}
9569
}
96-
}
9770

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;};
10373
}
104-
}
10574

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+
}
11283

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+
}
11691

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+
}
118100
}
119101

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 }
127112
}
128113
}
129114
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+
}
135122
}
136123
}
137124
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(0u, 6u) |_i| { spotty.speak(); }
145-
assert(spotty.size() == 8u);
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);
148135
}

0 commit comments

Comments
 (0)