diff options
| author | Mark Mansi <markm@cs.wisc.edu> | 2018-04-25 16:33:02 -0500 |
|---|---|---|
| committer | Mark Mansi <markm@cs.wisc.edu> | 2018-04-25 16:33:02 -0500 |
| commit | 256096da9ee680366b839f912e8d3ecccc0da033 (patch) | |
| tree | af468b7e26785c13cd95894035a3144500243bf4 /src | |
| parent | 25749ad66de71ffb46e6b04fb0cccf1ae4fc5ed5 (diff) | |
| download | rust-256096da9ee680366b839f912e8d3ecccc0da033.tar.gz rust-256096da9ee680366b839f912e8d3ecccc0da033.zip | |
Make Vec::new const
Diffstat (limited to 'src')
| -rw-r--r-- | src/liballoc/raw_vec.rs | 16 | ||||
| -rw-r--r-- | src/liballoc/vec.rs | 2 | ||||
| -rw-r--r-- | src/libcore/ptr.rs | 5 | ||||
| -rw-r--r-- | src/test/run-pass/vec-const-new.rs | 15 |
4 files changed, 34 insertions, 4 deletions
diff --git a/src/liballoc/raw_vec.rs b/src/liballoc/raw_vec.rs index 7ef0a27fc72..dc8ad9ee061 100644 --- a/src/liballoc/raw_vec.rs +++ b/src/liballoc/raw_vec.rs @@ -68,6 +68,16 @@ impl<T, A: Alloc> RawVec<T, A> { } } + /// Like `empty` but parametrized over the choice of allocator for the returned `RawVec`. + pub const fn empty_in(a: A) -> Self { + // Unique::empty() doubles as "unallocated" and "zero-sized allocation" + RawVec { + ptr: Unique::empty(), + cap: 0, + a, + } + } + /// Like `with_capacity` but parameterized over the choice of /// allocator for the returned RawVec. #[inline] @@ -124,6 +134,12 @@ impl<T> RawVec<T, Global> { Self::new_in(Global) } + /// Create a `RawVec` with capcity 0 (on the system heap), regardless of `T`, without + /// allocating. + pub fn empty() -> Self { + Self::empty_in(Global) + } + /// Creates a RawVec (on the system heap) with exactly the /// capacity and alignment requirements for a `[T; cap]`. This is /// equivalent to calling RawVec::new when `cap` is 0 or T is diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index b184404c15b..757606607bb 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -324,7 +324,7 @@ impl<T> Vec<T> { #[stable(feature = "rust1", since = "1.0.0")] pub fn new() -> Vec<T> { Vec { - buf: RawVec::new(), + buf: RawVec::empty(), len: 0, } } diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index 74bb264cc67..b612a278a34 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -2551,10 +2551,9 @@ impl<T: Sized> Unique<T> { /// This is useful for initializing types which lazily allocate, like /// `Vec::new` does. // FIXME: rename to dangling() to match NonNull? - pub fn empty() -> Self { + pub const fn empty() -> Self { unsafe { - let ptr = mem::align_of::<T>() as *mut T; - Unique::new_unchecked(ptr) + Unique::new_unchecked(mem::align_of::<T>() as *mut T) } } } diff --git a/src/test/run-pass/vec-const-new.rs b/src/test/run-pass/vec-const-new.rs new file mode 100644 index 00000000000..02d8cfdcf98 --- /dev/null +++ b/src/test/run-pass/vec-const-new.rs @@ -0,0 +1,15 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that Vec::new() can be used for constants + +const MY_VEC: Vec<usize> = Vec::new(); + +pub fn main() {} |
