mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-10 08:57:36 +00:00
implement Box<[T]> <-> Vec<T> conversions
This commit is contained in:
parent
0075c27626
commit
310f2deb99
@ -87,6 +87,7 @@
|
|||||||
|
|
||||||
#![doc(primitive = "slice")]
|
#![doc(primitive = "slice")]
|
||||||
|
|
||||||
|
use alloc::boxed::Box;
|
||||||
use core::cmp;
|
use core::cmp;
|
||||||
use core::mem::size_of;
|
use core::mem::size_of;
|
||||||
use core::mem;
|
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() }
|
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.
|
/// Extension methods for vectors containing `Clone` elements.
|
||||||
pub trait ImmutableCloneableVector<T> {
|
pub trait ImmutableCloneableVector<T> {
|
||||||
/// Partitions the vector into two vectors `(a, b)`, where all
|
/// Partitions the vector into two vectors `(a, b)`, where all
|
||||||
@ -2308,6 +2326,13 @@ mod tests {
|
|||||||
let y: &mut [int] = [];
|
let y: &mut [int] = [];
|
||||||
assert!(y.last_mut().is_none());
|
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)]
|
#[cfg(test)]
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
use core::prelude::*;
|
use core::prelude::*;
|
||||||
|
|
||||||
|
use alloc::boxed::Box;
|
||||||
use alloc::heap::{EMPTY, allocate, reallocate, deallocate};
|
use alloc::heap::{EMPTY, allocate, reallocate, deallocate};
|
||||||
use core::cmp::max;
|
use core::cmp::max;
|
||||||
use core::default::Default;
|
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
|
/// Deprecated, call `push` instead
|
||||||
#[inline]
|
#[inline]
|
||||||
#[deprecated = "call .push() instead"]
|
#[deprecated = "call .push() instead"]
|
||||||
@ -2631,6 +2646,13 @@ mod tests {
|
|||||||
assert!(vec2 == vec!((), (), ()));
|
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]
|
#[bench]
|
||||||
fn bench_new(b: &mut Bencher) {
|
fn bench_new(b: &mut Bencher) {
|
||||||
b.iter(|| {
|
b.iter(|| {
|
||||||
|
@ -88,7 +88,7 @@
|
|||||||
#[doc(no_inline)] pub use slice::{MutableCloneableSlice, MutableOrdSlice};
|
#[doc(no_inline)] pub use slice::{MutableCloneableSlice, MutableOrdSlice};
|
||||||
#[doc(no_inline)] pub use slice::{ImmutableSlice, MutableSlice};
|
#[doc(no_inline)] pub use slice::{ImmutableSlice, MutableSlice};
|
||||||
#[doc(no_inline)] pub use slice::{ImmutablePartialEqSlice, ImmutableOrdSlice};
|
#[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 slice::MutableSliceAllocating;
|
||||||
#[doc(no_inline)] pub use string::String;
|
#[doc(no_inline)] pub use string::String;
|
||||||
#[doc(no_inline)] pub use vec::Vec;
|
#[doc(no_inline)] pub use vec::Vec;
|
||||||
|
Loading…
Reference in New Issue
Block a user