#![doc(primitive = "slice")]
+use alloc::boxed::Box;
use core::cmp;
use core::mem::size_of;
use core::mem;
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
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)]
use core::prelude::*;
+use alloc::boxed::Box;
use alloc::heap::{EMPTY, allocate, reallocate, deallocate};
use core::cmp::max;
use core::default::Default;
}
}
+ /// 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"]
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(|| {
#[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;