Skip to content

Commit 11e8195

Browse files
Dretchbrson
authored andcommitted
separate the rand::rng gen_* methods out into an iface-less-impl so that the gen_* methods can be reused with different rng implementations (for rust-lang#2379)
1 parent b4da036 commit 11e8195

File tree

2 files changed

+62
-43
lines changed

2 files changed

+62
-43
lines changed

src/libcore/core.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import vec_iter::extensions;
1111
import option::extensions;
1212
import option_iter::extensions;
1313
import ptr::extensions;
14+
import rand::extensions;
1415

1516
export path, option, some, none, unreachable;
1617
export extensions;

src/libcore/rand.rs

Lines changed: 61 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#[doc = "Random number generation"];
22

3-
export rng;
3+
export rng, extensions;
44

55
enum rctx {}
66

@@ -15,55 +15,56 @@ native mod rustrt {
1515
iface rng {
1616
#[doc = "Return the next random integer"]
1717
fn next() -> u32;
18+
}
19+
20+
#[doc = "Extension methods for random number generators"]
21+
impl extensions for rng {
1822

19-
#[doc = "Return the next random float"]
20-
fn next_float() -> float;
23+
#[doc = "Return a random float"]
24+
fn gen_float() -> float {
25+
let u1 = self.next() as float;
26+
let u2 = self.next() as float;
27+
let u3 = self.next() as float;
28+
let scale = u32::max_value as float;
29+
ret ((u1 / scale + u2) / scale + u3) / scale;
30+
}
2131

2232
#[doc = "Return a random string composed of A-Z, a-z, 0-9."]
23-
fn gen_str(len: uint) -> str;
33+
fn gen_str(len: uint) -> str {
34+
let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
35+
"abcdefghijklmnopqrstuvwxyz" +
36+
"0123456789";
37+
let mut s = "";
38+
let mut i = 0u;
39+
while (i < len) {
40+
let n = self.next() as uint % charset.len();
41+
s = s + str::from_char(str::char_at(charset, n));
42+
i += 1u;
43+
}
44+
s
45+
}
2446

2547
#[doc = "Return a random byte string."]
26-
fn gen_bytes(len: uint) -> [u8];
48+
fn gen_bytes(len: uint) -> [u8] {
49+
let mut v = [];
50+
let mut i = 0u;
51+
while i < len {
52+
let n = self.next() as uint;
53+
v += [(n % (u8::max_value as uint)) as u8];
54+
i += 1u;
55+
}
56+
v
57+
}
2758
}
2859

29-
resource rand_res(c: *rctx) { rustrt::rand_free(c); }
30-
3160
#[doc = "Create a random number generator"]
3261
fn rng() -> rng {
62+
resource rand_res(c: *rctx) { rustrt::rand_free(c); }
63+
3364
impl of rng for @rand_res {
3465
fn next() -> u32 { ret rustrt::rand_next(**self); }
35-
fn next_float() -> float {
36-
let u1 = rustrt::rand_next(**self) as float;
37-
let u2 = rustrt::rand_next(**self) as float;
38-
let u3 = rustrt::rand_next(**self) as float;
39-
let scale = u32::max_value as float;
40-
ret ((u1 / scale + u2) / scale + u3) / scale;
41-
}
42-
fn gen_str(len: uint) -> str {
43-
let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
44-
"abcdefghijklmnopqrstuvwxyz" +
45-
"0123456789";
46-
let mut s = "";
47-
let mut i = 0u;
48-
while (i < len) {
49-
let n = rustrt::rand_next(**self) as uint %
50-
str::len(charset);
51-
s = s + str::from_char(str::char_at(charset, n));
52-
i += 1u;
53-
}
54-
s
55-
}
56-
fn gen_bytes(len: uint) -> [u8] {
57-
let mut v = [];
58-
let mut i = 0u;
59-
while i < len {
60-
let n = rustrt::rand_next(**self) as uint;
61-
v += [(n % (u8::max_value as uint)) as u8];
62-
i += 1u;
63-
}
64-
v
65-
}
6666
}
67+
6768
@rand_res(rustrt::rand_new()) as rng
6869
}
6970

@@ -72,7 +73,7 @@ mod tests {
7273

7374
#[test]
7475
fn test() {
75-
let r1: rand::rng = rand::rng();
76+
let r1 = rand::rng();
7677
log(debug, r1.next());
7778
log(debug, r1.next());
7879
{
@@ -95,13 +96,30 @@ mod tests {
9596
}
9697

9798
#[test]
98-
fn genstr() {
99-
let r: rand::rng = rand::rng();
99+
fn gen_float() {
100+
let r = rand::rng();
101+
let a = r.gen_float();
102+
let b = r.gen_float();
103+
log(debug, (a, b));
104+
}
105+
106+
#[test]
107+
fn gen_str() {
108+
let r = rand::rng();
100109
log(debug, r.gen_str(10u));
101110
log(debug, r.gen_str(10u));
102111
log(debug, r.gen_str(10u));
103-
assert(str::len(r.gen_str(10u)) == 10u);
104-
assert(str::len(r.gen_str(16u)) == 16u);
112+
assert r.gen_str(0u).len() == 0u;
113+
assert r.gen_str(10u).len() == 10u;
114+
assert r.gen_str(16u).len() == 16u;
115+
}
116+
117+
#[test]
118+
fn gen_bytes() {
119+
let r = rand::rng();
120+
assert r.gen_bytes(0u).len() == 0u;
121+
assert r.gen_bytes(10u).len() == 10u;
122+
assert r.gen_bytes(16u).len() == 16u;
105123
}
106124
}
107125

0 commit comments

Comments
 (0)