rust/src/fuzzer/cycles.rs

60 lines
1.3 KiB
Rust
Raw Normal View History

2011-09-26 22:34:07 -05:00
use std;
import std::vec;
import std::rand;
import std::option;
// random uint less than n
fn under(r : rand::rng, n : uint) -> uint { assert n != 0u; r.next() as uint % n }
// random choice from a vec
fn choice<T>(r : rand::rng, v : [T]) -> T { assert vec::len(v) != 0u; v[under(r, vec::len(v))] }
// 1 in n chance of being true
fn unlikely(r : rand::rng, n : uint) -> bool { under(r, n) == 0u }
tag maybe_pointy {
no_pointy;
yes_pointy(@pointy);
}
type pointy = {
mutable x : maybe_pointy,
mutable y : maybe_pointy,
mutable z : fn()->()
};
iter allunder(n: uint) -> uint {
let i: uint = 0u;
while i < n { put i; i += 1u; }
}
fn nopT(_x : @pointy) { }
fn nop() { }
fn test_cycles(r : rand::rng)
{
const max : uint = 10u;
let v : [mutable @pointy] = [mutable];
for each i in allunder(max) {
v += [mutable @{ mutable x : no_pointy, mutable y : no_pointy, mutable z: nop }];
}
for each i in allunder(max) {
v[i].x = yes_pointy(v[under(r, max)]);
v[i].y = yes_pointy(v[under(r, max)]);
v[i].z = bind nopT(v[under(r, max)]);
}
// Drop refs one at a time
for each i in allunder(max) {
v[i] = @{ mutable x : no_pointy, mutable y : no_pointy, mutable z: nop };
}
}
fn main()
{
let r = rand::mk_rng();
test_cycles(r);
}