use crate::Cast;
#[doc = crate::_tags!(num primitive)]
#[doc = crate::_doc_meta!{location("num/grain")}]
#[doc(alias = "PrimitiveJoin")]
pub trait PrimJoin<T, U, const LEN: usize> {
#[must_use]
fn from_array_be(values: [U; LEN]) -> T;
#[must_use]
fn from_array_le(values: [U; LEN]) -> T;
#[must_use]
fn from_array_ne(values: [U; LEN]) -> T;
#[must_use]
fn from_slice_be(values: &[U]) -> T;
#[must_use]
fn from_slice_le(values: &[U]) -> T;
#[must_use]
fn from_slice_ne(values: &[U]) -> T;
}
macro_rules! _num_grain_cast_trait_join_impl_from {
( $( $T:ident, $U:ident, $LEN:literal );+ $(;)? ) => {
$( _num_grain_cast_trait_join_impl_from![@$T, $U, $LEN]; )+
};
(@$T:ident, $U:ident, $LEN:literal) => { crate::paste! {
impl PrimJoin<$T, $U, $LEN> for $T {
fn from_array_be(values: [$U; $LEN]) -> $T { Cast::<$T>::[<from_ $U _be>](values) }
fn from_array_le(values: [$U; $LEN]) -> $T { Cast::<$T>::[<from_ $U _le>](values) }
fn from_array_ne(values: [$U; $LEN]) -> $T { Cast::<$T>::[<from_ $U _ne>](values) }
fn from_slice_be(values: &[$U]) -> $T {
let mut array = [0; $LEN];
for (i, &v) in values.iter().enumerate() {
array[i] = v;
}
Cast::<$T>::[<from_ $U _be>](array)
}
fn from_slice_le(values: &[$U]) -> $T {
let mut array = [0; $LEN];
for (i, &v) in values.iter().enumerate() {
array[i] = v;
}
Cast::<$T>::[<from_ $U _le>](array)
}
fn from_slice_ne(values: &[$U]) -> $T {
let mut array = [0; $LEN];
for (i, &v) in values.iter().enumerate() {
array[i] = v;
}
Cast::<$T>::[<from_ $U _ne>](array)
}
}
}};
}
_num_grain_cast_trait_join_impl_from![
u128, u64, 2; u128, u32, 4; u128, u16, 8; u128, u8, 16;
u64, u32, 2; u64, u16, 4; u64, u8, 8;
u32, u16, 2; u32, u8, 4;
u16, u8, 2;
];