From d4b934bdce53107a0270f97985bc3152c638183e Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Fri, 26 Apr 2013 23:53:29 +1000 Subject: [PATCH] core: add some inlining hints to methods/fns in rand. --- src/libcore/rand.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/libcore/rand.rs b/src/libcore/rand.rs index 80a45fd657080..07e7defb1b520 100644 --- a/src/libcore/rand.rs +++ b/src/libcore/rand.rs @@ -53,6 +53,7 @@ pub trait Rand { } impl Rand for int { + #[inline] fn rand(rng: &R) -> int { if int::bits == 32 { rng.next() as int @@ -63,30 +64,35 @@ impl Rand for int { } impl Rand for i8 { + #[inline] fn rand(rng: &R) -> i8 { rng.next() as i8 } } impl Rand for i16 { + #[inline] fn rand(rng: &R) -> i16 { rng.next() as i16 } } impl Rand for i32 { + #[inline] fn rand(rng: &R) -> i32 { rng.next() as i32 } } impl Rand for i64 { + #[inline] fn rand(rng: &R) -> i64 { (rng.next() as i64 << 32) | rng.next() as i64 } } impl Rand for uint { + #[inline] fn rand(rng: &R) -> uint { if uint::bits == 32 { rng.next() as uint @@ -97,36 +103,42 @@ impl Rand for uint { } impl Rand for u8 { + #[inline] fn rand(rng: &R) -> u8 { rng.next() as u8 } } impl Rand for u16 { + #[inline] fn rand(rng: &R) -> u16 { rng.next() as u16 } } impl Rand for u32 { + #[inline] fn rand(rng: &R) -> u32 { rng.next() } } impl Rand for u64 { + #[inline] fn rand(rng: &R) -> u64 { (rng.next() as u64 << 32) | rng.next() as u64 } } impl Rand for float { + #[inline] fn rand(rng: &R) -> float { rng.gen::() as float } } impl Rand for f32 { + #[inline] fn rand(rng: &R) -> f32 { rng.gen::() as f32 } @@ -134,6 +146,7 @@ impl Rand for f32 { static scale : f64 = (u32::max_value as f64) + 1.0f64; impl Rand for f64 { + #[inline] fn rand(rng: &R) -> f64 { let u1 = rng.next() as f64; let u2 = rng.next() as f64; @@ -144,12 +157,14 @@ impl Rand for f64 { } impl Rand for char { + #[inline] fn rand(rng: &R) -> char { rng.next() as char } } impl Rand for bool { + #[inline] fn rand(rng: &R) -> bool { rng.next() & 1u32 == 1u32 } @@ -163,6 +178,7 @@ macro_rules! tuple_impl { $( $tyvar : Rand ),* > Rand for ( $( $tyvar ),* , ) { + #[inline] fn rand(_rng: &R) -> ( $( $tyvar ),* , ) { ( // use the $tyvar's to get the appropriate number of @@ -177,7 +193,10 @@ macro_rules! tuple_impl { } } -impl Rand for () { fn rand(_: &R) -> () { () } } +impl Rand for () { + #[inline] + fn rand(_: &R) -> () { () } +} tuple_impl!{A} tuple_impl!{A, B} tuple_impl!{A, B, C} @@ -190,6 +209,7 @@ tuple_impl!{A, B, C, D, E, F, G, H, I} tuple_impl!{A, B, C, D, E, F, G, H, I, J} impl Rand for Option { + #[inline] fn rand(rng: &R) -> Option { if rng.gen() { Some(rng.gen()) @@ -200,10 +220,12 @@ impl Rand for Option { } impl Rand for ~T { + #[inline] fn rand(rng: &R) -> ~T { ~rng.gen() } } impl Rand for @T { + #[inline] fn rand(rng: &R) -> @T { @rng.gen() } } @@ -413,6 +435,7 @@ pub trait RngUtil { /// Extension methods for random number generators impl RngUtil for R { /// Return a random value for a Rand type + #[inline(always)] fn gen(&self) -> T { Rand::rand(self) } @@ -675,6 +698,7 @@ pub impl IsaacRng { } /// Refills the output buffer (`self.rsl`) + #[inline] priv fn isaac(&self) { self.c += 1; // abbreviations @@ -731,6 +755,9 @@ impl Rng for IsaacRng { } } +/// An [Xorshift random number +/// generator](http://en.wikipedia.org/wiki/Xorshift). Not suitable for +/// cryptographic purposes. pub struct XorShiftRng { priv mut x: u32, priv mut y: u32, @@ -739,6 +766,7 @@ pub struct XorShiftRng { } impl Rng for XorShiftRng { + #[inline] pub fn next(&self) -> u32 { let x = self.x; let t = x ^ (x << 11); @@ -788,6 +816,7 @@ fn tls_rng_state(_v: @IsaacRng) {} * seeded by the system. Intended to be used in method chaining style, ie * `task_rng().gen::()`. */ +#[inline] pub fn task_rng() -> @IsaacRng { let r : Option<@IsaacRng>; unsafe { @@ -807,6 +836,7 @@ pub fn task_rng() -> @IsaacRng { // Allow direct chaining with `task_rng` impl Rng for @R { + #[inline(always)] fn next(&self) -> u32 { (**self).next() } } @@ -814,6 +844,7 @@ impl Rng for @R { * Returns a random value of a Rand type, using the task's random number * generator. */ +#[inline] pub fn random() -> T { task_rng().gen() }