Document std::bitv
This commit is contained in:
parent
33f2f22bef
commit
cf2624106c
128
src/lib/bitv.rs
128
src/lib/bitv.rs
@ -68,12 +68,28 @@ fn process(op: block(uint, uint) -> uint, v0: t, v1: t) -> bool {
|
|||||||
ret changed;
|
ret changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn lor(w0: uint, w1: uint) -> uint { ret w0 | w1; }
|
fn lor(w0: uint, w1: uint) -> uint { ret w0 | w1; }
|
||||||
|
|
||||||
fn union(v0: t, v1: t) -> bool { let sub = lor; ret process(sub, v0, v1); }
|
fn union(v0: t, v1: t) -> bool { let sub = lor; ret process(sub, v0, v1); }
|
||||||
|
|
||||||
fn land(w0: uint, w1: uint) -> uint { ret w0 & w1; }
|
fn land(w0: uint, w1: uint) -> uint { ret w0 & w1; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: intersect
|
||||||
|
|
||||||
|
Calculates the intersection of two bitvectors
|
||||||
|
|
||||||
|
Sets `v0` to the intersection of `v0` and `v1`
|
||||||
|
|
||||||
|
Preconditions:
|
||||||
|
|
||||||
|
Both bitvectors must be the same length
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
True if `v0` was changed
|
||||||
|
*/
|
||||||
fn intersect(v0: t, v1: t) -> bool {
|
fn intersect(v0: t, v1: t) -> bool {
|
||||||
let sub = land;
|
let sub = land;
|
||||||
ret process(sub, v0, v1);
|
ret process(sub, v0, v1);
|
||||||
@ -81,8 +97,26 @@ fn intersect(v0: t, v1: t) -> bool {
|
|||||||
|
|
||||||
fn right(_w0: uint, w1: uint) -> uint { ret w1; }
|
fn right(_w0: uint, w1: uint) -> uint { ret w1; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: assign
|
||||||
|
|
||||||
|
Assigns the value of `v1` to `v0`
|
||||||
|
|
||||||
|
Preconditions:
|
||||||
|
|
||||||
|
Both bitvectors must be the same length
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
True if `v0` was changed
|
||||||
|
*/
|
||||||
fn assign(v0: t, v1: t) -> bool { let sub = right; ret process(sub, v0, v1); }
|
fn assign(v0: t, v1: t) -> bool { let sub = right; ret process(sub, v0, v1); }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: clone
|
||||||
|
|
||||||
|
Makes a copy of a bitvector
|
||||||
|
*/
|
||||||
fn clone(v: t) -> t {
|
fn clone(v: t) -> t {
|
||||||
let storage = vec::init_elt_mut::<uint>(0u, v.nbits / uint_bits() + 1u);
|
let storage = vec::init_elt_mut::<uint>(0u, v.nbits / uint_bits() + 1u);
|
||||||
let len = vec::len(v.storage);
|
let len = vec::len(v.storage);
|
||||||
@ -90,6 +124,11 @@ fn clone(v: t) -> t {
|
|||||||
ret @{storage: storage, nbits: v.nbits};
|
ret @{storage: storage, nbits: v.nbits};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: get
|
||||||
|
|
||||||
|
Retreive the value at index `i`
|
||||||
|
*/
|
||||||
fn get(v: t, i: uint) -> bool {
|
fn get(v: t, i: uint) -> bool {
|
||||||
assert (i < v.nbits);
|
assert (i < v.nbits);
|
||||||
let bits = uint_bits();
|
let bits = uint_bits();
|
||||||
@ -99,6 +138,21 @@ fn get(v: t, i: uint) -> bool {
|
|||||||
ret x == 1u;
|
ret x == 1u;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: This doesn't account for the actual size of the vectors,
|
||||||
|
// so it could end up comparing garbage bits
|
||||||
|
/*
|
||||||
|
Function: equal
|
||||||
|
|
||||||
|
Compares two bitvectors
|
||||||
|
|
||||||
|
Preconditions:
|
||||||
|
|
||||||
|
Both bitvectors must be the same length
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
True if both bitvectors contain identical elements
|
||||||
|
*/
|
||||||
fn equal(v0: t, v1: t) -> bool {
|
fn equal(v0: t, v1: t) -> bool {
|
||||||
// FIXME: when we can break or return from inside an iterator loop,
|
// FIXME: when we can break or return from inside an iterator loop,
|
||||||
// we can eliminate this painful while-loop
|
// we can eliminate this painful while-loop
|
||||||
@ -112,22 +166,51 @@ fn equal(v0: t, v1: t) -> bool {
|
|||||||
ret true;
|
ret true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: clear
|
||||||
|
|
||||||
|
Set all bits to 0
|
||||||
|
*/
|
||||||
fn clear(v: t) {
|
fn clear(v: t) {
|
||||||
uint::range(0u, vec::len(v.storage)) {|i| v.storage[i] = 0u; };
|
uint::range(0u, vec::len(v.storage)) {|i| v.storage[i] = 0u; };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: set_all
|
||||||
|
|
||||||
|
Set all bits to 1
|
||||||
|
*/
|
||||||
fn set_all(v: t) {
|
fn set_all(v: t) {
|
||||||
uint::range(0u, v.nbits) {|i| set(v, i, true); };
|
uint::range(0u, v.nbits) {|i| set(v, i, true); };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: invert
|
||||||
|
|
||||||
|
Invert all bits
|
||||||
|
*/
|
||||||
fn invert(v: t) {
|
fn invert(v: t) {
|
||||||
uint::range(0u, vec::len(v.storage)) {|i|
|
uint::range(0u, vec::len(v.storage)) {|i|
|
||||||
v.storage[i] = !v.storage[i];
|
v.storage[i] = !v.storage[i];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: difference
|
||||||
|
|
||||||
/* v0 = v0 - v1 */
|
Calculate the difference between two bitvectors
|
||||||
|
|
||||||
|
Sets each element of `v0` to the value of that element minus the element
|
||||||
|
of `v1` at the same index.
|
||||||
|
|
||||||
|
Preconditions:
|
||||||
|
|
||||||
|
Both bitvectors must be the same length
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
True if `v0` was changed
|
||||||
|
*/
|
||||||
fn difference(v0: t, v1: t) -> bool {
|
fn difference(v0: t, v1: t) -> bool {
|
||||||
invert(v1);
|
invert(v1);
|
||||||
let b = intersect(v0, v1);
|
let b = intersect(v0, v1);
|
||||||
@ -135,6 +218,15 @@ fn difference(v0: t, v1: t) -> bool {
|
|||||||
ret b;
|
ret b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: set
|
||||||
|
|
||||||
|
Set the value of a bit at a given index
|
||||||
|
|
||||||
|
Preconditions:
|
||||||
|
|
||||||
|
`i` must be less than the length of the bitvector
|
||||||
|
*/
|
||||||
fn set(v: t, i: uint, x: bool) {
|
fn set(v: t, i: uint, x: bool) {
|
||||||
assert (i < v.nbits);
|
assert (i < v.nbits);
|
||||||
let bits = uint_bits();
|
let bits = uint_bits();
|
||||||
@ -145,14 +237,22 @@ fn set(v: t, i: uint, x: bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* true if all bits are 1 */
|
/*
|
||||||
|
Function: is_true
|
||||||
|
|
||||||
|
Returns true if all bits are 1
|
||||||
|
*/
|
||||||
fn is_true(v: t) -> bool {
|
fn is_true(v: t) -> bool {
|
||||||
for i: uint in to_vec(v) { if i != 1u { ret false; } }
|
for i: uint in to_vec(v) { if i != 1u { ret false; } }
|
||||||
ret true;
|
ret true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* true if all bits are non-1 */
|
/*
|
||||||
|
Function: is_false
|
||||||
|
|
||||||
|
Returns true if all bits are 0
|
||||||
|
*/
|
||||||
fn is_false(v: t) -> bool {
|
fn is_false(v: t) -> bool {
|
||||||
for i: uint in to_vec(v) { if i == 1u { ret false; } }
|
for i: uint in to_vec(v) { if i == 1u { ret false; } }
|
||||||
ret true;
|
ret true;
|
||||||
@ -160,17 +260,39 @@ fn is_false(v: t) -> bool {
|
|||||||
|
|
||||||
fn init_to_vec(v: t, i: uint) -> uint { ret if get(v, i) { 1u } else { 0u }; }
|
fn init_to_vec(v: t, i: uint) -> uint { ret if get(v, i) { 1u } else { 0u }; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: to_vec
|
||||||
|
|
||||||
|
Converts the bitvector to a vector of uint with the same length. Each uint
|
||||||
|
in the resulting vector has either value 0u or 1u.
|
||||||
|
*/
|
||||||
fn to_vec(v: t) -> [uint] {
|
fn to_vec(v: t) -> [uint] {
|
||||||
let sub = bind init_to_vec(v, _);
|
let sub = bind init_to_vec(v, _);
|
||||||
ret vec::init_fn::<uint>(sub, v.nbits);
|
ret vec::init_fn::<uint>(sub, v.nbits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: to_str
|
||||||
|
|
||||||
|
Converts the bitvector to a string. The resulting string has the same
|
||||||
|
length as the bitvector, and each character is either '0' or '1'.
|
||||||
|
*/
|
||||||
fn to_str(v: t) -> str {
|
fn to_str(v: t) -> str {
|
||||||
let rs = "";
|
let rs = "";
|
||||||
for i: uint in to_vec(v) { if i == 1u { rs += "1"; } else { rs += "0"; } }
|
for i: uint in to_vec(v) { if i == 1u { rs += "1"; } else { rs += "0"; } }
|
||||||
ret rs;
|
ret rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function: eq_vec
|
||||||
|
|
||||||
|
Compare a bitvector to a vector of uint. The uint vector is expected to
|
||||||
|
only contain the values 0u and 1u.
|
||||||
|
|
||||||
|
Preconditions:
|
||||||
|
|
||||||
|
Both the bitvector and vector must have the same length
|
||||||
|
*/
|
||||||
fn eq_vec(v0: t, v1: [uint]) -> bool {
|
fn eq_vec(v0: t, v1: [uint]) -> bool {
|
||||||
assert (v0.nbits == vec::len::<uint>(v1));
|
assert (v0.nbits == vec::len::<uint>(v1));
|
||||||
let len = v0.nbits;
|
let len = v0.nbits;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user