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(&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(&&v: [const T]) -> uint unsafe { + let repr: **unsafe::vec_repr = ::unsafe::reinterpret_cast(addr_of(v)); + (**repr).alloc / sys::size_of::() +} + #[doc = "Returns the length of a vector"] #[inline(always)] pure fn len(&&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: