aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorTim Chevalier <[email protected]>2011-04-06 17:56:44 -0700
committerTim Chevalier <[email protected]>2011-04-06 17:58:18 -0700
commit2e90bd94de32c739733966bfac96cf35e9a08655 (patch)
tree01cecc3fbc92d27e01177b5d3cb0785239877ea9 /src/lib
parentMinimal testcase for next bootstrap blocker. (diff)
downloadrust-2e90bd94de32c739733966bfac96cf35e9a08655.tar.xz
rust-2e90bd94de32c739733966bfac96cf35e9a08655.zip
Continued sketching out code for checking states against preconditions.
It's still sketchy. I added a typestate annotation field to statements tagged stmt_decl or stmt_expr, because a stmt_decl statement has a typestate that's different from that of its child node. This necessitated trivial changes to a bunch of other files all over to the compiler. I also added a few small standard library functions, some of which I didn't actually end up using but which I thought might be useful anyway.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/_vec.rs21
-rw-r--r--src/lib/bitv.rs22
-rw-r--r--src/lib/option.rs7
-rw-r--r--src/lib/util.rs12
4 files changed, 62 insertions, 0 deletions
diff --git a/src/lib/_vec.rs b/src/lib/_vec.rs
index f2b169ef..916a8205 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 2029ef52..98e6c040 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 29a6f6eb..66a41bca 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 72844d5f..2f797f69 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;