use core::marker::PhantomData;
use crate::{typed_slice::TypedSlice, IndexType};
#[doc(hidden)]
pub const fn __const_assert_len_in_bounds<I: IndexType, const N: usize>() {
struct AssertLenInBounds<I: IndexType, const N: usize>(PhantomData<I>);
impl<I: IndexType, const N: usize> AssertLenInBounds<I, N> {
pub const OK: () = {
if N > I::MAX_RAW_INDEX {
panic!("length exceeds maximum index type capacity");
}
};
}
const { AssertLenInBounds::<I, N>::OK };
}
#[cfg(feature = "alloc")]
#[doc(hidden)]
pub const fn __const_assert_vec_in_bounds<I: IndexType, T, const N: usize>(
_: &crate::typed_vec::TypedVec<I, T>,
) {
__const_assert_len_in_bounds::<I, N>();
}
#[doc(hidden)]
pub const fn __const_assert_slice_in_bounds<I: IndexType, T, const N: usize>(_: &TypedSlice<I, T>) {
__const_assert_len_in_bounds::<I, N>();
}
#[doc(hidden)]
pub const fn __unsafe_wrap_slice_mut<I: IndexType, T, const N: usize>(
slice: &mut [T],
) -> &mut TypedSlice<I, T> {
let res = unsafe { TypedSlice::from_slice_unchecked_mut(slice) };
__const_assert_slice_in_bounds::<I, T, N>(res);
res
}
#[doc(hidden)]
#[macro_export]
macro_rules! __ignore {
($($any:tt)*) => {
()
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __count {
($($x:expr),*) => {
<[()]>::len(&[ $( $crate::__ignore!($x) ),* ])
};
}
#[cfg(feature = "alloc")]
#[macro_export]
macro_rules! typed_vec {
($elem:expr; $n:expr) => {{
$crate::typed_vec::TypedVec::<_, _>::try_from_vec($crate::alloc::vec![($elem); ($n)]).unwrap()
}};
($($x:expr),* $(,)?) => {{
let res = unsafe { $crate::typed_vec::TypedVec::<_, _>::from_vec_unchecked($crate::alloc::vec![$($x),*]) };
const __LEN: usize = $crate::__count!($($x),*);
$crate::macros::__const_assert_vec_in_bounds::<_, _, __LEN>(&res);
res
}};
}
#[macro_export]
macro_rules! typed_array_vec {
($elem:expr; $n:expr) => {{
$crate::typed_array_vec::TypedArrayVec::<_, _, _>::from_iter(core::iter::repeat($elem).take($n))
}};
($($x:expr),* $(,)?) => {{
$crate::typed_array_vec::TypedArrayVec::from_iter([$($x),*])
}};
}
#[macro_export]
macro_rules! typed_array {
($elem:expr; $n:expr) => {{
$crate::typed_array::TypedArray::<_, _, $n>::from_array([$elem; $n])
}};
($($x:expr),* $(,)?) => {{
$crate::typed_array::TypedArray::from_array([$($x),*])
}};
}
#[macro_export]
macro_rules! typed_slice {
($($x:expr),* $(,)?) => {{
let res = unsafe { $crate::typed_slice::TypedSlice::<_, _>::from_slice_unchecked(&[$($x),*]) };
const __LEN: usize = $crate::__count!($($x),*);
$crate::macros::__const_assert_slice_in_bounds::<_, _, __LEN>(res);
res
}};
}
#[macro_export]
macro_rules! typed_slice_mut {
($($x:expr),* $(,)?) => {
$crate::macros::__unsafe_wrap_slice_mut::<_, _, { $crate::__count!($($x),*) }>(&mut [$($x),*])
};
}