about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2013-01-22 15:24:12 -0800
committerTim Chevalier <chevalier@alum.wellesley.edu>2013-01-22 15:24:12 -0800
commit519b60f313766d840123b48fbc9fc4b42948e6c0 (patch)
tree298784a65a7727d6feccb56565ba647dc4396edc
parent10260bee38fc41b5e089d0be0a217e5eb6ad9d12 (diff)
parent9b27ec868450d240dfb308cef204bfa12f23abbd (diff)
Merge pull request #4580 from Dretch/atvec-constructors
Add more constructors for managed vectors (as proposed in issue #4553)
-rw-r--r--src/libcore/at_vec.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/libcore/at_vec.rs b/src/libcore/at_vec.rs
index 1d964edd537..c6285f62377 100644
--- a/src/libcore/at_vec.rs
+++ b/src/libcore/at_vec.rs
@@ -150,6 +150,29 @@ pub pure fn from_elem<T: Copy>(n_elts: uint, t: T) -> @[T] {
     }
 }
 
+/**
+ * Creates and initializes an immutable managed vector by moving all the
+ * elements from an owned vector.
+ */
+fn from_owned<T>(v: ~[T]) -> @[T] {
+    let mut av = @[];
+    unsafe {
+        raw::reserve(&mut av, v.len());
+        do vec::consume(v) |_i, x| {
+            raw::push(&mut av, x);
+        }
+        transmute(av)
+    }
+}
+
+/**
+ * Creates and initializes an immutable managed vector by copying all the
+ * elements of a slice.
+ */
+fn from_slice<T:Copy>(v: &[T]) -> @[T] {
+    from_fn(v.len(), |i| v[i])
+}
+
 #[cfg(notest)]
 pub mod traits {
     use at_vec::append;
@@ -281,3 +304,22 @@ pub fn test() {
 pub fn append_test() {
     assert @[1,2,3] + @[4,5,6] == @[1,2,3,4,5,6];
 }
+
+#[test]
+pub fn test_from_owned() {
+    assert from_owned::<int>(~[]) == @[];
+    assert from_owned(~[true]) == @[true];
+    assert from_owned(~[1, 2, 3, 4, 5]) == @[1, 2, 3, 4, 5];
+    assert from_owned(~[~"abc", ~"123"]) == @[~"abc", ~"123"];
+    assert from_owned(~[~[42]]) == @[~[42]];
+}
+
+#[test]
+pub fn test_from_slice() {
+    assert from_slice::<int>([]) == @[];
+    assert from_slice([true]) == @[true];
+    assert from_slice([1, 2, 3, 4, 5]) == @[1, 2, 3, 4, 5];
+    assert from_slice([@"abc", @"123"]) == @[@"abc", @"123"];
+    assert from_slice([@[42]]) == @[@[42]];
+}
+