use crate::datatypes::DataType;
use half::f16;
pub unsafe trait NativeType:
Sized + Copy + std::fmt::Debug + std::fmt::Display + PartialEq + Default + Sized + 'static
{
type Bytes: AsRef<[u8]>;
fn is_valid(data_type: &DataType) -> bool;
fn to_le_bytes(&self) -> Self::Bytes;
}
macro_rules! create_native {
($native_ty:ty,$($impl_pattern:pat_param)|+) => {
unsafe impl NativeType for $native_ty {
type Bytes = [u8; std::mem::size_of::<Self>()];
#[inline]
fn to_le_bytes(&self) -> Self::Bytes {
Self::to_le_bytes(*self)
}
#[inline]
fn is_valid(data_type: &DataType) -> bool {
matches!(data_type, $($impl_pattern)|+)
}
}
};
}
create_native!(u8, DataType::UInt8);
create_native!(u16, DataType::UInt16);
create_native!(u32, DataType::UInt32);
create_native!(u64, DataType::UInt64);
create_native!(i8, DataType::Int8);
create_native!(i16, DataType::Int16);
create_native!(
i32,
DataType::Int32 | DataType::Date32 | DataType::Time32(_)
);
create_native!(
i64,
DataType::Int64 | DataType::Date64 | DataType::Time64(_) | DataType::Timestamp(_, _)
);
create_native!(f16, DataType::Float16);
create_native!(f32, DataType::Float32);
create_native!(f64, DataType::Float64);