diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/_vec.rs | 21 | ||||
| -rw-r--r-- | src/lib/bitv.rs | 22 | ||||
| -rw-r--r-- | src/lib/option.rs | 7 | ||||
| -rw-r--r-- | src/lib/util.rs | 12 |
4 files changed, 62 insertions, 0 deletions
diff --git a/src/lib/_vec.rs b/src/lib/_vec.rs index f2b169efb2c..916a8205f23 100644 --- a/src/lib/_vec.rs +++ b/src/lib/_vec.rs @@ -1,5 +1,6 @@ import option.none; import option.some; +import util.orb; type vbuf = rustrt.vbuf; @@ -230,6 +231,26 @@ fn foldl[T, U](fn (&U, &T) -> U p, &U z, &vec[T] v) -> U { } } +fn unzip[T, U](&vec[tup(T, U)] v) -> tup(vec[T], vec[U]) { + auto sz = len[tup(T, U)](v); + + if (sz == 0u) { + ret tup(alloc[T](0u), alloc[U](0u)); + } + else { + auto rest = slice[tup(T, U)](v, 1u, sz); + auto tl = unzip[T, U](rest); + auto a = vec(v.(0)._0); + auto b = vec(v.(0)._1); + ret tup(a + tl._0, b + tl._1); + } +} + +fn or(&vec[bool] v) -> bool { + auto f = orb; + be _vec.foldl[bool, bool](f, false, v); +} + // Local Variables: // mode: rust; // fill-column: 78; diff --git a/src/lib/bitv.rs b/src/lib/bitv.rs index 2029ef52952..98e6c0401d6 100644 --- a/src/lib/bitv.rs +++ b/src/lib/bitv.rs @@ -135,6 +135,28 @@ impure fn set(&t v, uint i, bool x) { } } +/* true if all bits are 1 */ +fn is_true(&t v) -> bool { + for(uint i in v.storage) { + if (i != 1u) { + ret false; + } + } + + ret true; +} + +/* true if all bits are non-1 */ +fn is_false(&t v) -> bool { + for(uint i in v.storage) { + if (i == 1u) { + ret false; + } + } + + ret true; +} + fn init_to_vec(t v, uint i) -> uint { if (get(v, i)) { ret 1u; diff --git a/src/lib/option.rs b/src/lib/option.rs index 29a6f6eb96b..66a41bcac68 100644 --- a/src/lib/option.rs +++ b/src/lib/option.rs @@ -38,6 +38,13 @@ fn is_none[T](&t[T] opt) -> bool { } } +fn from_maybe[T](&T def, &t[T] opt) -> T { + alt(opt) { + case (none[T]) { ret def; } + case (some[T](?t)) { ret t; } + } +} + // Local Variables: // mode: rust; // fill-column: 78; diff --git a/src/lib/util.rs b/src/lib/util.rs index 72844d5f830..2f797f69216 100644 --- a/src/lib/util.rs +++ b/src/lib/util.rs @@ -11,6 +11,18 @@ fn rational_leq(&rational x, &rational y) -> bool { ret x.num * y.den <= y.num * x.den; } +fn fst[T, U](&tup(T, U) x) -> T { + ret x._0; +} + +fn snd[T, U](&tup(T, U) x) -> U { + ret x._1; +} + +fn orb(&bool a, &bool b) -> bool { + ret a || b; +} + // Local Variables: // mode: rust; // fill-column: 78; |
