Merge pull request #161 from fusion-engineering-forks/const-new

Add unstable-const-fn feature to make new() functions const.
This commit is contained in:
bluss
2020-10-21 13:11:45 +02:00
committed by GitHub
6 changed files with 40 additions and 3 deletions
+3
View File
@@ -22,6 +22,9 @@ matrix:
- rust: nightly - rust: nightly
env: env:
- FEATURES='array-sizes-33-128 array-sizes-129-255' - FEATURES='array-sizes-33-128 array-sizes-129-255'
- rust: nightly
env:
- FEATURES='unstable-const-fn'
- name: "miri" - name: "miri"
script: sh ci/miri.sh script: sh ci/miri.sh
branches: branches:
+1
View File
@@ -37,6 +37,7 @@ harness = false
[features] [features]
default = ["std"] default = ["std"]
std = [] std = []
unstable-const-fn = []
array-sizes-33-128 = [] array-sizes-33-128 = []
array-sizes-129-255 = [] array-sizes-129-255 = []
+7
View File
@@ -34,11 +34,13 @@ pub unsafe trait Array {
} }
pub trait Index : PartialEq + Copy { pub trait Index : PartialEq + Copy {
const ZERO: Self;
fn to_usize(self) -> usize; fn to_usize(self) -> usize;
fn from(_: usize) -> Self; fn from(_: usize) -> Self;
} }
impl Index for () { impl Index for () {
const ZERO: Self = ();
#[inline(always)] #[inline(always)]
fn to_usize(self) -> usize { 0 } fn to_usize(self) -> usize { 0 }
#[inline(always)] #[inline(always)]
@@ -46,6 +48,7 @@ impl Index for () {
} }
impl Index for bool { impl Index for bool {
const ZERO: Self = false;
#[inline(always)] #[inline(always)]
fn to_usize(self) -> usize { self as usize } fn to_usize(self) -> usize { self as usize }
#[inline(always)] #[inline(always)]
@@ -53,6 +56,7 @@ impl Index for bool {
} }
impl Index for u8 { impl Index for u8 {
const ZERO: Self = 0;
#[inline(always)] #[inline(always)]
fn to_usize(self) -> usize { self as usize } fn to_usize(self) -> usize { self as usize }
#[inline(always)] #[inline(always)]
@@ -60,6 +64,7 @@ impl Index for u8 {
} }
impl Index for u16 { impl Index for u16 {
const ZERO: Self = 0;
#[inline(always)] #[inline(always)]
fn to_usize(self) -> usize { self as usize } fn to_usize(self) -> usize { self as usize }
#[inline(always)] #[inline(always)]
@@ -67,6 +72,7 @@ impl Index for u16 {
} }
impl Index for u32 { impl Index for u32 {
const ZERO: Self = 0;
#[inline(always)] #[inline(always)]
fn to_usize(self) -> usize { self as usize } fn to_usize(self) -> usize { self as usize }
#[inline(always)] #[inline(always)]
@@ -74,6 +80,7 @@ impl Index for u32 {
} }
impl Index for usize { impl Index for usize {
const ZERO: Self = 0;
#[inline(always)] #[inline(always)]
fn to_usize(self) -> usize { self } fn to_usize(self) -> usize { self }
#[inline(always)] #[inline(always)]
+12 -1
View File
@@ -58,11 +58,22 @@ impl<A> ArrayString<A>
/// assert_eq!(&string[..], "foo"); /// assert_eq!(&string[..], "foo");
/// assert_eq!(string.capacity(), 16); /// assert_eq!(string.capacity(), 16);
/// ``` /// ```
#[cfg(not(feature="unstable-const-fn"))]
pub fn new() -> ArrayString<A> { pub fn new() -> ArrayString<A> {
unsafe { unsafe {
ArrayString { ArrayString {
xs: MaybeUninitCopy::uninitialized(), xs: MaybeUninitCopy::uninitialized(),
len: Index::from(0), len: Index::ZERO,
}
}
}
#[cfg(feature="unstable-const-fn")]
pub const fn new() -> ArrayString<A> {
unsafe {
ArrayString {
xs: MaybeUninitCopy::uninitialized(),
len: Index::ZERO,
} }
} }
} }
+16 -1
View File
@@ -14,12 +14,19 @@
//! - Optional //! - Optional
//! - Enable more array sizes (see [Array] for more information) //! - Enable more array sizes (see [Array] for more information)
//! //!
//! - `unstable-const-fn`
//! - Optional
//! - Makes [`ArrayVec::new`] and [`ArrayString::new`] `const fn`s,
//! using the nightly `const_fn` feature.
//! - Unstable and requires nightly.
//!
//! ## Rust Version //! ## Rust Version
//! //!
//! This version of arrayvec requires Rust 1.36 or later. //! This version of arrayvec requires Rust 1.36 or later.
//! //!
#![doc(html_root_url="https://docs.rs/arrayvec/0.4/")] #![doc(html_root_url="https://docs.rs/arrayvec/0.4/")]
#![cfg_attr(not(feature="std"), no_std)] #![cfg_attr(not(feature="std"), no_std)]
#![cfg_attr(feature="unstable-const-fn", feature(const_fn))]
#[cfg(feature="serde")] #[cfg(feature="serde")]
extern crate serde; extern crate serde;
@@ -106,9 +113,17 @@ impl<A: Array> ArrayVec<A> {
/// assert_eq!(&array[..], &[1, 2]); /// assert_eq!(&array[..], &[1, 2]);
/// assert_eq!(array.capacity(), 16); /// assert_eq!(array.capacity(), 16);
/// ``` /// ```
#[cfg(not(feature="unstable-const-fn"))]
pub fn new() -> ArrayVec<A> { pub fn new() -> ArrayVec<A> {
unsafe { unsafe {
ArrayVec { xs: MaybeUninit::uninitialized(), len: Index::from(0) } ArrayVec { xs: MaybeUninit::uninitialized(), len: Index::ZERO }
}
}
#[cfg(feature="unstable-const-fn")]
pub const fn new() -> ArrayVec<A> {
unsafe {
ArrayVec { xs: MaybeUninit::uninitialized(), len: Index::ZERO }
} }
} }
+1 -1
View File
@@ -16,7 +16,7 @@ impl<T> Clone for MaybeUninit<T>
impl<T> MaybeUninit<T> { impl<T> MaybeUninit<T> {
/// Create a new MaybeUninit with uninitialized interior /// Create a new MaybeUninit with uninitialized interior
pub unsafe fn uninitialized() -> Self { pub const unsafe fn uninitialized() -> Self {
MaybeUninit { inner: StdMaybeUninit::uninit() } MaybeUninit { inner: StdMaybeUninit::uninit() }
} }