diff --git a/src/lib/int.rs b/src/lib/int.rs index fe7689e3e2872..4b420d96c27a2 100644 --- a/src/lib/int.rs +++ b/src/lib/int.rs @@ -1,3 +1,10 @@ +fn max_value() -> int { + ret min_value() - 1; +} + +fn min_value() -> int { + ret (-1 << (sys::size_of::() * 8u as int - 1)) as int; +} pure fn add(x: int, y: int) -> int { ret x + y; } diff --git a/src/lib/rand.rs b/src/lib/rand.rs index fee8bbe06baec..b4e5ebc3058ff 100644 --- a/src/lib/rand.rs +++ b/src/lib/rand.rs @@ -14,6 +14,7 @@ native "rust" mod rustrt { type rng = obj { fn next() -> u32; + fn next_float() -> float; }; resource rand_res(c: rustrt::rctx) { rustrt::rand_free(c); } @@ -21,6 +22,13 @@ resource rand_res(c: rustrt::rctx) { rustrt::rand_free(c); } fn mk_rng() -> rng { obj rt_rng(c: @rand_res) { fn next() -> u32 { ret rustrt::rand_next(**c); } + fn next_float() -> float { + let u1 = rustrt::rand_next(**c) as float; + let u2 = rustrt::rand_next(**c) as float; + let u3 = rustrt::rand_next(**c) as float; + let scale = u32::max_value() as float; + ret ((u1 / scale + u2) / scale + u3) / scale; + } } ret rt_rng(@rand_res(rustrt::rand_new())); } diff --git a/src/lib/std.rc b/src/lib/std.rc index 94f5906460991..2e65c7503a958 100644 --- a/src/lib/std.rc +++ b/src/lib/std.rc @@ -13,6 +13,7 @@ mod char; mod int; mod uint; mod u8; +mod u32; mod u64; mod vec; mod str; diff --git a/src/lib/u32.rs b/src/lib/u32.rs new file mode 100644 index 0000000000000..de368fff9d81a --- /dev/null +++ b/src/lib/u32.rs @@ -0,0 +1,13 @@ +pure fn max_value() -> u32 { ret 4294967296u32; } +pure fn min_value() -> u32 { ret 0u32; } + +// +// Local Variables: +// mode: rust +// fill-column: 78; +// indent-tabs-mode: nil +// c-basic-offset: 4 +// buffer-file-coding-system: utf-8-unix +// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'"; +// End: +// diff --git a/src/lib/u64.rs b/src/lib/u64.rs index 8082f7aef0d52..497b60acdbf09 100644 --- a/src/lib/u64.rs +++ b/src/lib/u64.rs @@ -1,3 +1,6 @@ +pure fn max_value() -> u64 { ret 18446744073709551615u64; } +pure fn min_value() -> u64 { ret 0u64; } + fn to_str(n: u64, radix: uint) -> str { assert (0u < radix && radix <= 16u); diff --git a/src/lib/u8.rs b/src/lib/u8.rs index 5dea03b0bdd19..d70cb8a4f8319 100644 --- a/src/lib/u8.rs +++ b/src/lib/u8.rs @@ -1,4 +1,5 @@ - +pure fn max_value() -> u8 { ret 255u8; } +pure fn min_value() -> u8 { ret 0u8; } pure fn add(x: u8, y: u8) -> u8 { ret x + y; } diff --git a/src/lib/uint.rs b/src/lib/uint.rs index 12a512e1de829..84b6bc5b1e07e 100644 --- a/src/lib/uint.rs +++ b/src/lib/uint.rs @@ -1,4 +1,18 @@ - +/** + * Return the minimal value for an uint. + * + * This is always 0 + */ +pure fn min_value() -> uint { ret 0u; } + +/** + * Return the maximal value for an uint. + * + * This is 2^wordsize - 1 + */ +pure fn max_value() -> uint { + ret 0u - 1u; +} fn add(x: uint, y: uint) -> uint { ret x + y; } diff --git a/src/test/stdtest/int.rs b/src/test/stdtest/int.rs index 61d3448a175e9..4a87908e5a64f 100644 --- a/src/test/stdtest/int.rs +++ b/src/test/stdtest/int.rs @@ -23,3 +23,10 @@ fn test_pow() { assert (int::pow(-3, 3u) == -27); assert (int::pow(4, 9u) == 262144); } + +#[test] +fn test_overflows() { + assert (int::max_value() > 0); + assert (int::min_value() <= 0); + assert (int::min_value() + int::max_value() + 1 == 0); +} \ No newline at end of file diff --git a/src/test/stdtest/uint.rs b/src/test/stdtest/uint.rs index 7361c76b70bbb..141b59ace82a8 100644 --- a/src/test/stdtest/uint.rs +++ b/src/test/stdtest/uint.rs @@ -47,3 +47,10 @@ fn test_next_power_of_two() { assert (uint::next_power_of_two(38u) == 64u); assert (uint::next_power_of_two(39u) == 64u); } + +#[test] +fn test_overflows() { + assert (uint::max_value() > 0u); + assert (uint::min_value() <= 0u); + assert (uint::min_value() + uint::max_value() + 1u == 0u); +} \ No newline at end of file