about summary refs log tree commit diff
path: root/src/lib
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-05-19 16:05:35 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-05-19 16:07:12 -0700
commit6b95584df5c878f716743eb9c60ad5df77af8b18 (patch)
tree030d64626083c277abe5b7bf02800ab4ddd8df06 /src/lib
parenta4dd57705c7b203ad0efed4ddcc0e3959e65d627 (diff)
downloadrust-6b95584df5c878f716743eb9c60ad5df77af8b18.tar.gz
rust-6b95584df5c878f716743eb9c60ad5df77af8b18.zip
stdlib: Add vec growth functions that use a thunk to initialize elements
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/vec.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/lib/vec.rs b/src/lib/vec.rs
index f251225a3e9..ba604073856 100644
--- a/src/lib/vec.rs
+++ b/src/lib/vec.rs
@@ -206,6 +206,20 @@ fn grow_set[T](&vec[mutable T] v, uint index, &T initval, &T val) {
     v.(index) = val;
 }
 
+fn grow_init_fn[T](&array[T] v, uint n, fn()->T init_fn) {
+    let uint i = n;
+    while (i > 0u) {
+        i -= 1u;
+        v += [init_fn()];
+    }
+}
+
+fn grow_init_fn_set[T](&array[T] v, uint index, fn()->T init_fn, &T val) {
+    auto length = vec::len(v);
+    if (index >= length) { grow_init_fn(v, index - length + 1u, init_fn); }
+    v.(index) = val;
+}
+
 fn map[T, U](&option::operator[T,U] f, &array[T] v) -> vec[U] {
     let vec[U] u = alloc[U](len[T](v));
     for (T ve in v) {