implement Box<[T]> <-> Vec<T> conversions

This commit is contained in:
Daniel Micay 2014-10-10 05:18:42 -04:00
parent 0075c27626
commit 310f2deb99
3 changed files with 48 additions and 1 deletions

View file

@ -87,6 +87,7 @@
#![doc(primitive = "slice")]
use alloc::boxed::Box;
use core::cmp;
use core::mem::size_of;
use core::mem;
@ -298,6 +299,23 @@ impl<'a, T: Clone> CloneableVector<T> for &'a [T] {
fn into_vec(self) -> Vec<T> { self.to_vec() }
}
#[experimental]
pub trait BoxedSlice<T> {
/// Convert `self` into a vector without clones or allocation.
fn into_vec(self) -> Vec<T>;
}
impl<T> BoxedSlice<T> for Box<[T]> {
#[experimental]
fn into_vec(mut self) -> Vec<T> {
unsafe {
let xs = Vec::from_raw_parts(self.len(), self.len(), self.as_mut_ptr());
mem::forget(self);
xs
}
}
}
/// Extension methods for vectors containing `Clone` elements.
pub trait ImmutableCloneableVector<T> {
/// Partitions the vector into two vectors `(a, b)`, where all
@ -2308,6 +2326,13 @@ mod tests {
let y: &mut [int] = [];
assert!(y.last_mut().is_none());
}
#[test]
fn test_into_vec() {
let xs = box [1u, 2, 3];
let ys = xs.into_vec();
assert_eq!(ys.as_slice(), [1u, 2, 3]);
}
}
#[cfg(test)]

View file

@ -14,6 +14,7 @@
use core::prelude::*;
use alloc::boxed::Box;
use alloc::heap::{EMPTY, allocate, reallocate, deallocate};
use core::cmp::max;
use core::default::Default;
@ -757,6 +758,20 @@ impl<T> Vec<T> {
}
}
/// Convert the vector into Box<[T]>.
///
/// Note that this will drop any excess capacity. Calling this and converting back to a vector
/// with `into_vec()` is equivalent to calling `shrink_to_fit()`.
#[experimental]
pub fn into_boxed_slice(mut self) -> Box<[T]> {
self.shrink_to_fit();
unsafe {
let xs: Box<[T]> = mem::transmute(self.as_mut_slice());
mem::forget(self);
xs
}
}
/// Deprecated, call `push` instead
#[inline]
#[deprecated = "call .push() instead"]
@ -2631,6 +2646,13 @@ mod tests {
assert!(vec2 == vec!((), (), ()));
}
#[test]
fn test_into_boxed_slice() {
let xs = vec![1u, 2, 3];
let ys = xs.into_boxed_slice();
assert_eq!(ys.as_slice(), [1u, 2, 3]);
}
#[bench]
fn bench_new(b: &mut Bencher) {
b.iter(|| {

View file

@ -88,7 +88,7 @@
#[doc(no_inline)] pub use slice::{MutableCloneableSlice, MutableOrdSlice};
#[doc(no_inline)] pub use slice::{ImmutableSlice, MutableSlice};
#[doc(no_inline)] pub use slice::{ImmutablePartialEqSlice, ImmutableOrdSlice};
#[doc(no_inline)] pub use slice::{AsSlice, VectorVector};
#[doc(no_inline)] pub use slice::{AsSlice, VectorVector, BoxedSlice};
#[doc(no_inline)] pub use slice::MutableSliceAllocating;
#[doc(no_inline)] pub use string::String;
#[doc(no_inline)] pub use vec::Vec;