diff options
| author | John Clements <clements@racket-lang.org> | 2014-06-24 18:57:00 -0700 |
|---|---|---|
| committer | John Clements <clements@racket-lang.org> | 2014-06-25 14:36:16 -0700 |
| commit | eead9e61905a7770fba06bf6ade142b8b8bc23f6 (patch) | |
| tree | 17986cfcf851f2847f276e04daaac6bca64abcfd /src | |
| parent | 43c7bbe735444fd49130647ba15dd1dc3cf593fb (diff) | |
| download | rust-eead9e61905a7770fba06bf6ade142b8b8bc23f6.tar.gz rust-eead9e61905a7770fba06bf6ade142b8b8bc23f6.zip | |
make macros hygienic
Diffstat (limited to 'src')
| -rw-r--r-- | src/librand/isaac.rs | 127 |
1 files changed, 65 insertions, 62 deletions
diff --git a/src/librand/isaac.rs b/src/librand/isaac.rs index 3fff27d4792..6caa936636a 100644 --- a/src/librand/isaac.rs +++ b/src/librand/isaac.rs @@ -130,37 +130,39 @@ impl IsaacRng { macro_rules! ind (($x:expr) => { self.mem[(($x >> 2) as uint & ((RAND_SIZE - 1) as uint))] }); - macro_rules! rngstepp( - ($j:expr, $shift:expr) => {{ - let base = $j; - let mix = a << $shift as uint; - - let x = self.mem[base + mr_offset]; - a = (a ^ mix) + self.mem[base + m2_offset]; - let y = ind!(x) + a + b; - self.mem[base + mr_offset] = y; - - b = ind!(y >> RAND_SIZE_LEN as uint) + x; - self.rsl[base + mr_offset] = b; - }} - ); - macro_rules! rngstepn( - ($j:expr, $shift:expr) => {{ - let base = $j; - let mix = a >> $shift as uint; - - let x = self.mem[base + mr_offset]; - a = (a ^ mix) + self.mem[base + m2_offset]; - let y = ind!(x) + a + b; - self.mem[base + mr_offset] = y; - - b = ind!(y >> RAND_SIZE_LEN as uint) + x; - self.rsl[base + mr_offset] = b; - }} - ); let r = [(0, MIDPOINT), (MIDPOINT, 0)]; for &(mr_offset, m2_offset) in r.iter() { + + macro_rules! rngstepp( + ($j:expr, $shift:expr) => {{ + let base = $j; + let mix = a << $shift as uint; + + let x = self.mem[base + mr_offset]; + a = (a ^ mix) + self.mem[base + m2_offset]; + let y = ind!(x) + a + b; + self.mem[base + mr_offset] = y; + + b = ind!(y >> RAND_SIZE_LEN as uint) + x; + self.rsl[base + mr_offset] = b; + }} + ); + macro_rules! rngstepn( + ($j:expr, $shift:expr) => {{ + let base = $j; + let mix = a >> $shift as uint; + + let x = self.mem[base + mr_offset]; + a = (a ^ mix) + self.mem[base + m2_offset]; + let y = ind!(x) + a + b; + self.mem[base + mr_offset] = y; + + b = ind!(y >> RAND_SIZE_LEN as uint) + x; + self.rsl[base + mr_offset] = b; + }} + ); + for i in range_step(0u, MIDPOINT, 4) { rngstepp!(i + 0, 13); rngstepn!(i + 1, 6); @@ -349,43 +351,44 @@ impl Isaac64Rng { *self.mem.unsafe_ref(($x as uint >> 3) & (RAND_SIZE_64 - 1)) } ); - macro_rules! rngstepp( - ($j:expr, $shift:expr) => {{ - let base = base + $j; - let mix = a ^ (a << $shift as uint); - let mix = if $j == 0 {!mix} else {mix}; - - unsafe { - let x = *self.mem.unsafe_ref(base + mr_offset); - a = mix + *self.mem.unsafe_ref(base + m2_offset); - let y = ind!(x) + a + b; - self.mem.unsafe_set(base + mr_offset, y); - - b = ind!(y >> RAND_SIZE_64_LEN) + x; - self.rsl.unsafe_set(base + mr_offset, b); - } - }} - ); - macro_rules! rngstepn( - ($j:expr, $shift:expr) => {{ - let base = base + $j; - let mix = a ^ (a >> $shift as uint); - let mix = if $j == 0 {!mix} else {mix}; - - unsafe { - let x = *self.mem.unsafe_ref(base + mr_offset); - a = mix + *self.mem.unsafe_ref(base + m2_offset); - let y = ind!(x) + a + b; - self.mem.unsafe_set(base + mr_offset, y); - - b = ind!(y >> RAND_SIZE_64_LEN) + x; - self.rsl.unsafe_set(base + mr_offset, b); - } - }} - ); for &(mr_offset, m2_offset) in MP_VEC.iter() { for base in range(0, MIDPOINT / 4).map(|i| i * 4) { + + macro_rules! rngstepp( + ($j:expr, $shift:expr) => {{ + let base = base + $j; + let mix = a ^ (a << $shift as uint); + let mix = if $j == 0 {!mix} else {mix}; + + unsafe { + let x = *self.mem.unsafe_ref(base + mr_offset); + a = mix + *self.mem.unsafe_ref(base + m2_offset); + let y = ind!(x) + a + b; + self.mem.unsafe_set(base + mr_offset, y); + + b = ind!(y >> RAND_SIZE_64_LEN) + x; + self.rsl.unsafe_set(base + mr_offset, b); + } + }} + ); + macro_rules! rngstepn( + ($j:expr, $shift:expr) => {{ + let base = base + $j; + let mix = a ^ (a >> $shift as uint); + let mix = if $j == 0 {!mix} else {mix}; + + unsafe { + let x = *self.mem.unsafe_ref(base + mr_offset); + a = mix + *self.mem.unsafe_ref(base + m2_offset); + let y = ind!(x) + a + b; + self.mem.unsafe_set(base + mr_offset, y); + + b = ind!(y >> RAND_SIZE_64_LEN) + x; + self.rsl.unsafe_set(base + mr_offset, b); + } + }} + ); rngstepp!(0, 21); rngstepn!(1, 5); rngstepp!(2, 12); |
