Skip to content

Commit 2df473d

Browse files
committed
auto merge of #4801 : z0w0/rust/randomtrait, r=graydon
Also adds Rng::gen() for generically generating any type that implements the Rand trait. There's no way to generate things with a length (for e.g. strings or vectors), because I can't think of an elegant way to do that. Maybe have a RandLen trait that inherits Rand? This can be used for a quickcheck mechanism I'm working on.
2 parents f13ea41 + abd29e5 commit 2df473d

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

src/libcore/rand.rs

+100
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,102 @@ use uint;
2323
use util;
2424
use vec;
2525

26+
/// A type that can be randomly generated using an RNG
27+
pub trait Rand {
28+
static fn rand(rng: rand::Rng) -> Self;
29+
}
30+
31+
impl int: Rand {
32+
static fn rand(rng: rand::Rng) -> int {
33+
rng.gen_int()
34+
}
35+
}
36+
37+
impl i8: Rand {
38+
static fn rand(rng: rand::Rng) -> i8 {
39+
rng.gen_i8()
40+
}
41+
}
42+
43+
impl i16: Rand {
44+
static fn rand(rng: rand::Rng) -> i16 {
45+
rng.gen_i16()
46+
}
47+
}
48+
49+
impl i32: Rand {
50+
static fn rand(rng: rand::Rng) -> i32 {
51+
rng.gen_i32()
52+
}
53+
}
54+
55+
impl i64: Rand {
56+
static fn rand(rng: rand::Rng) -> i64 {
57+
rng.gen_i64()
58+
}
59+
}
60+
61+
impl u8: Rand {
62+
static fn rand(rng: rand::Rng) -> u8 {
63+
rng.gen_u8()
64+
}
65+
}
66+
67+
impl u16: Rand {
68+
static fn rand(rng: rand::Rng) -> u16 {
69+
rng.gen_u16()
70+
}
71+
}
72+
73+
impl u32: Rand {
74+
static fn rand(rng: rand::Rng) -> u32 {
75+
rng.gen_u32()
76+
}
77+
}
78+
79+
impl u64: Rand {
80+
static fn rand(rng: rand::Rng) -> u64 {
81+
rng.gen_u64()
82+
}
83+
}
84+
85+
impl float: Rand {
86+
static fn rand(rng: rand::Rng) -> float {
87+
rng.gen_float()
88+
}
89+
}
90+
91+
impl f32: Rand {
92+
static fn rand(rng: rand::Rng) -> f32 {
93+
rng.gen_f32()
94+
}
95+
}
96+
97+
impl f64: Rand {
98+
static fn rand(rng: rand::Rng) -> f64 {
99+
rng.gen_f64()
100+
}
101+
}
102+
103+
impl char: Rand {
104+
static fn rand(rng: rand::Rng) -> char {
105+
rng.gen_char()
106+
}
107+
}
108+
109+
impl bool: Rand {
110+
static fn rand(rng: rand::Rng) -> bool {
111+
rng.gen_bool()
112+
}
113+
}
114+
115+
impl<T: Rand> Option<T>: Rand {
116+
static fn rand(rng: rand::Rng) -> Option<T> {
117+
if rng.gen_bool() { Some(Rand::rand(rng)) }
118+
else { None }
119+
}
120+
}
121+
26122
#[allow(non_camel_case_types)] // runtime type
27123
enum rctx {}
28124

@@ -49,6 +145,10 @@ pub struct Weighted<T> {
49145

50146
/// Extension methods for random number generators
51147
impl Rng {
148+
/// Return a random value for a Rand type
149+
fn gen<T: Rand>() -> T {
150+
Rand::rand(self)
151+
}
52152

53153
/// Return a random int
54154
fn gen_int() -> int {

0 commit comments

Comments
 (0)