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 quote::quote;

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

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

    for (lhs_simd_ty, lhs) in types.iter() {
        for (rhs_simd_ty, rhs) in types.iter() {
            let lhs_simd_ty = syn::Ident::new(&lhs_simd_ty, proc_macro2::Span::call_site());
            let rhs_simd_ty = syn::Ident::new(&rhs_simd_ty, proc_macro2::Span::call_site());
            let lhs_lanes = type_simd_lanes(lhs);
            let rhs_lanes = type_simd_lanes(rhs);
            let res = if lhs_lanes != rhs_lanes {
                quote! {
                    impl IntoVec<#rhs_simd_ty::#rhs_simd_ty> for #lhs_simd_ty::#lhs_simd_ty {
                        fn into_vec(self) -> #rhs_simd_ty::#rhs_simd_ty {
                            unreachable!()
                        }
                    }
                }
            } else {
                let into_method =
                    syn::Ident::new(&format!("to_{}", rhs), proc_macro2::Span::call_site());
                quote! {
                    impl IntoVec<#rhs_simd_ty::#rhs_simd_ty> for #lhs_simd_ty::#lhs_simd_ty {
                        fn into_vec(self) -> #rhs_simd_ty::#rhs_simd_ty {
                            self.#into_method()
                        }
                    }
                }
            };
            ret.extend(res);
        }
    }

    ret.into()
}