Fix const fns that were not const and add const ArrayVec::from
This commit is contained in:
parent
01b794e81a
commit
7a6edb2cc1
66
src/lib.rs
66
src/lib.rs
|
@ -6,6 +6,7 @@
|
||||||
#![feature(const_mut_refs)]
|
#![feature(const_mut_refs)]
|
||||||
#![feature(const_option)]
|
#![feature(const_option)]
|
||||||
#![feature(const_refs_to_cell)]
|
#![feature(const_refs_to_cell)]
|
||||||
|
#![feature(const_slice_from_raw_parts_mut)]
|
||||||
#![feature(const_slice_split_at_mut)]
|
#![feature(const_slice_split_at_mut)]
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![feature(effects)]
|
#![feature(effects)]
|
||||||
|
@ -23,7 +24,6 @@ use std::fmt::{Debug, Display};
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
use std::mem::MaybeUninit;
|
use std::mem::MaybeUninit;
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
use std::slice::SliceIndex;
|
|
||||||
|
|
||||||
#[derive(Copy)]
|
#[derive(Copy)]
|
||||||
pub struct ArrayVec<T, const N: usize> {
|
pub struct ArrayVec<T, const N: usize> {
|
||||||
|
@ -36,6 +36,32 @@ pub struct ArrayVec<T, const N: usize> {
|
||||||
// pub const EMPTY: ArrayVec<T, 0> = Self::new();
|
// pub const EMPTY: ArrayVec<T, 0> = Self::new();
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
const unsafe fn slice_unchecked<T>(slice: &[T], offset: usize, len: Option<usize>) -> &[T] {
|
||||||
|
std::slice::from_raw_parts(
|
||||||
|
slice.as_ptr().add(offset),
|
||||||
|
match len {
|
||||||
|
Some(t) => t,
|
||||||
|
None => slice.len() - offset,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
const unsafe fn slice_unchecked_mut<T>(
|
||||||
|
slice: &mut [T],
|
||||||
|
offset: usize,
|
||||||
|
len: Option<usize>,
|
||||||
|
) -> &mut [T] {
|
||||||
|
std::slice::from_raw_parts_mut(
|
||||||
|
slice.as_mut_ptr().add(offset),
|
||||||
|
match len {
|
||||||
|
Some(t) => t,
|
||||||
|
None => slice.len() - offset,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
impl<T, const N: usize> ArrayVec<T, N> {
|
impl<T, const N: usize> ArrayVec<T, N> {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn new() -> Self {
|
pub const fn new() -> Self {
|
||||||
|
@ -48,14 +74,19 @@ impl<T, const N: usize> ArrayVec<T, N> {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn as_slice(&self) -> &[T] {
|
pub const fn as_slice(&self) -> &[T] {
|
||||||
unsafe {
|
unsafe {
|
||||||
MaybeUninit::slice_assume_init_ref(&*(0..self.len).get_unchecked(self.data.as_slice()))
|
MaybeUninit::slice_assume_init_ref(slice_unchecked(&self.data, 0, Some(self.len)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn as_slice_mut(&mut self) -> &mut [T] {
|
pub const fn as_slice_mut(&mut self) -> &mut [T] {
|
||||||
let slice: &mut [MaybeUninit<T>] = &mut self.data;
|
unsafe {
|
||||||
unsafe { MaybeUninit::slice_assume_init_mut(&mut *(0..self.len).get_unchecked_mut(slice)) }
|
MaybeUninit::slice_assume_init_mut(slice_unchecked_mut(
|
||||||
|
&mut self.data,
|
||||||
|
0,
|
||||||
|
Some(self.len),
|
||||||
|
))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -85,13 +116,12 @@ impl<T, const N: usize> ArrayVec<T, N> {
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub const fn unused(&self) -> &[MaybeUninit<T>] {
|
pub const fn unused(&self) -> &[MaybeUninit<T>] {
|
||||||
unsafe { &*(self.len..).get_unchecked(self.data.as_slice()) }
|
unsafe { slice_unchecked(&self.data, self.len, None) }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub const fn unused_mut(&mut self) -> &mut [MaybeUninit<T>] {
|
pub const fn unused_mut(&mut self) -> &mut [MaybeUninit<T>] {
|
||||||
let slice: &mut [MaybeUninit<T>] = &mut self.data;
|
unsafe { slice_unchecked_mut(&mut self.data, self.len, None) }
|
||||||
unsafe { &mut *(self.len..).get_unchecked_mut(slice) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// # Safety
|
/// # Safety
|
||||||
|
@ -121,6 +151,14 @@ impl<T, const N: usize> ArrayVec<T, N> {
|
||||||
self.set_len(old_len + slice.len());
|
self.set_len(old_len + slice.len());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub const fn from(value: [T; N]) -> Self {
|
||||||
|
Self {
|
||||||
|
len: value.len(),
|
||||||
|
data: MaybeUninit::transpose(MaybeUninit::new(value)),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone, const N: usize> Clone for ArrayVec<T, N> {
|
impl<T: Clone, const N: usize> Clone for ArrayVec<T, N> {
|
||||||
|
@ -352,10 +390,7 @@ impl<const N: usize> Display for ArrayStr<N> {
|
||||||
impl<T, const N: usize> From<[T; N]> for ArrayVec<T, N> {
|
impl<T, const N: usize> From<[T; N]> for ArrayVec<T, N> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from(value: [T; N]) -> Self {
|
fn from(value: [T; N]) -> Self {
|
||||||
Self {
|
Self::from(value)
|
||||||
len: value.len(),
|
|
||||||
data: MaybeUninit::transpose(MaybeUninit::new(value)),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,3 +523,12 @@ impl<'a, const N: usize> TryFrom<char> for ArrayStr<N> {
|
||||||
// ArrayStr(self.0.concat(rhs.0))
|
// ArrayStr(self.0.concat(rhs.0))
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::ArrayVec;
|
||||||
|
|
||||||
|
const _FOO: ArrayVec<(), 4> = ArrayVec::from([(), (), (), ()]);
|
||||||
|
const _FOO_LEN: usize = _FOO.as_slice().len();
|
||||||
|
const _FOO_UNUSED: usize = _FOO.unused().len();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue