summary refs log tree commit diff
path: root/src/libcore/vec.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcore/vec.rs')
-rw-r--r--src/libcore/vec.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs
index 60ed23a6582..e4626c97c3e 100644
--- a/src/libcore/vec.rs
+++ b/src/libcore/vec.rs
@@ -9,6 +9,7 @@ export is_not_empty;
 export same_length;
 export reserve;
 export reserve_at_least;
+export capacity;
 export len;
 export from_fn;
 export from_elem;
@@ -134,6 +135,14 @@ fn reserve_at_least<T>(&v: [const T], n: uint) {
     reserve(v, uint::next_power_of_two(n));
 }
 
+#[doc = "
+Returns the number of elements the vector can hold without reallocating
+"]
+fn capacity<T>(&&v: [const T]) -> uint unsafe {
+    let repr: **unsafe::vec_repr = ::unsafe::reinterpret_cast(addr_of(v));
+    (**repr).alloc / sys::size_of::<T>()
+}
+
 #[doc = "Returns the length of a vector"]
 #[inline(always)]
 pure fn len<T>(&&v: [const T]) -> uint unsafe {
@@ -1801,6 +1810,16 @@ mod tests {
         unshift(x, 0);
         assert x == [0, 1, 2, 3];
     }
+
+    #[test]
+    fn test_capacity() {
+        let mut v = [0u64];
+        reserve(v, 10u);
+        assert capacity(v) == 10u;
+        let mut v = [0u32];
+        reserve(v, 10u);
+        assert capacity(v) == 10u;
+    }
 }
 
 // Local Variables: