hpt-macros 0.1.2

An internal library for generating helper functions for hpt
Documentation
use crate::type_utils::type_simd_lanes;
use proc_macro::TokenStream;
use proc_macro2::Ident;
use quote::quote;

pub fn impl_simd_eval() -> TokenStream {
    let mut ret = proc_macro2::TokenStream::new();

    let types = [
        (format!("boolx{}", type_simd_lanes("bool"))),
        (format!("bf16x{}", type_simd_lanes("bf16"))),
        (format!("f16x{}", type_simd_lanes("f16"))),
        (format!("f32x{}", type_simd_lanes("f32"))),
        (format!("f64x{}", type_simd_lanes("f64"))),
        (format!("i8x{}", type_simd_lanes("i8"))),
        (format!("i16x{}", type_simd_lanes("i16"))),
        (format!("i32x{}", type_simd_lanes("i32"))),
        (format!("i64x{}", type_simd_lanes("i64"))),
        (format!("u8x{}", type_simd_lanes("u8"))),
        (format!("u16x{}", type_simd_lanes("u16"))),
        (format!("u32x{}", type_simd_lanes("u32"))),
        (format!("u64x{}", type_simd_lanes("u64"))),
        (format!("isizex{}", type_simd_lanes("isize"))),
        (format!("usizex{}", type_simd_lanes("usize"))),
    ];

    for simd_ty in types.iter() {
        let simd_ty = Ident::new(&simd_ty, proc_macro2::Span::call_site());

        let res = quote! {
            impl Eval for #simd_ty::#simd_ty {
                type Output = <#simd_ty::#simd_ty as SimdCmpPromote<#simd_ty::#simd_ty>>::Output;
                fn _is_nan(&self) -> Self::Output {
                    self.__is_nan()
                }
                fn _is_true(&self) -> Self::Output {
                    self.__is_true()
                }
                fn _is_inf(&self) -> Self::Output {
                    self.__is_inf()
                }
            }
        };
        ret.extend(res);
    }

    ret.into()
}