use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
use crate::config::TypeConfig;
use crate::generator::{find_constraint_def, make_type_alias};
pub fn generate_neg_impls(config: &TypeConfig) -> TokenStream2 {
let mut impls = Vec::new();
for type_def in &config.constraint_types {
let type_name = &type_def.type_name;
let constraint_def = find_constraint_def(config, &type_def.constraint_name);
let Some(neg_constraint_name) = &constraint_def.neg_constraint_name else {
continue;
};
for float_type in &type_def.float_types {
let type_alias = make_type_alias(type_name, float_type);
let neg_type_alias = make_type_alias(neg_constraint_name, float_type);
impls.push(quote! {
impl Neg for #type_alias {
type Output = #neg_type_alias;
fn neg(self) -> Self::Output {
let result = -self.get();
unsafe { #neg_type_alias::new_unchecked(result) }
}
}
});
}
}
quote! {
#(#impls)*
}
}