#![no_std]
#![deny(missing_docs)]
#[doc(hidden)]
pub extern crate core as __core;
#[macro_export]
macro_rules! array {
[$expr:expr; $count:expr] => {{
let value = $expr;
$crate::array![_ => $crate::__core::clone::Clone::clone(&value); $count]
}};
[$i:pat => $e:expr; $count:expr] => {
$crate::__array![$i => $e; $count]
};
}
use core::mem::{ManuallyDrop, MaybeUninit};
use core::ptr;
#[doc(hidden)]
#[repr(transparent)]
pub struct __ArrayVec<T, const N: usize>(pub __ArrayVecInner<T, N>);
impl<T, const N: usize> Drop for __ArrayVec<T, N> {
fn drop(&mut self) {
let initialized = &mut self.0.arr[..self.0.len] as *mut _ as *mut [T];
unsafe { ptr::drop_in_place(initialized) };
}
}
#[doc(hidden)]
#[non_exhaustive]
pub struct __ArrayVecInner<T, const N: usize> {
pub arr: [MaybeUninit<T>; N],
pub len: usize,
pub capacity: __Capacity<N>,
}
impl<T, const N: usize> __ArrayVecInner<T, N> {
#[doc(hidden)]
pub const unsafe fn new(arr: [MaybeUninit<T>; N]) -> Self {
Self {
arr,
len: 0,
capacity: __Capacity,
}
}
}
#[doc(hidden)]
pub struct __Capacity<const N: usize>;
impl<const N: usize> __Capacity<N> {
#[doc(hidden)]
pub const fn get(&self) -> usize {
N
}
}
#[doc(hidden)]
#[repr(C)]
pub union __Transmuter<T, const N: usize> {
pub init_uninit_array: ManuallyDrop<MaybeUninit<[T; N]>>,
pub uninit_array: ManuallyDrop<[MaybeUninit<T>; N]>,
pub out: ManuallyDrop<[T; N]>,
}
#[doc(hidden)]
#[repr(C)]
pub union __ArrayVecTransmuter<T, const N: usize> {
pub vec: ManuallyDrop<__ArrayVec<T, N>>,
pub inner: ManuallyDrop<__ArrayVecInner<T, N>>,
}
#[doc(hidden)]
#[macro_export]
macro_rules! __array {
[$i:pat => $e:expr; $count:expr] => {{
let mut vec = $crate::__ArrayVec::<_, {$count}>(unsafe { $crate::__ArrayVecInner::new(
$crate::__core::mem::ManuallyDrop::into_inner(unsafe {
$crate::__Transmuter {
init_uninit_array: $crate::__core::mem::ManuallyDrop::new($crate::__core::mem::MaybeUninit::uninit()),
}
.uninit_array
}),
)});
while vec.0.len < (&vec.0.capacity).get() {
let $i = vec.0.len;
let _please_do_not_use_continue_without_label;
let value;
struct __PleaseDoNotUseBreakWithoutLabel;
loop {
_please_do_not_use_continue_without_label = ();
value = $e;
break __PleaseDoNotUseBreakWithoutLabel;
};
vec.0.arr[vec.0.len] = $crate::__core::mem::MaybeUninit::new(value);
vec.0.len += 1;
}
let inner = $crate::__core::mem::ManuallyDrop::into_inner(unsafe {
$crate::__ArrayVecTransmuter {
vec: $crate::__core::mem::ManuallyDrop::new(vec),
}
.inner
});
$crate::__core::mem::ManuallyDrop::into_inner(unsafe {
$crate::__Transmuter {
uninit_array: $crate::__core::mem::ManuallyDrop::new(inner.arr),
}
.out
})
}}
}