use proc_macro2::TokenStream;
use quote::quote;
pub struct CodeGenerator;
impl CodeGenerator {
pub fn generate_integer(value: i64) -> TokenStream {
quote! {
mathhook_core::Expression::integer(# value)
}
}
pub fn generate_float(value: f64) -> TokenStream {
quote! {
mathhook_core::Expression::float(# value)
}
}
pub fn generate_symbol(name: &str) -> TokenStream {
match name {
"pi" => {
quote! {
mathhook_core::Expression::pi()
}
}
"e" => {
quote! {
mathhook_core::Expression::e()
}
}
"i" => {
quote! {
mathhook_core::Expression::i()
}
}
_ => {
quote! {
mathhook_core::Expression::symbol(mathhook_core::Symbol::scalar(#
name))
}
}
}
}
pub fn generate_add(left: &TokenStream, right: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::add(vec![# left, # right])
}
}
pub fn generate_sub(left: &TokenStream, right: &TokenStream) -> TokenStream {
let neg_right = Self::generate_neg(right);
quote! {
mathhook_core::Expression::add(vec![# left, # neg_right])
}
}
pub fn generate_mul(left: &TokenStream, right: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::mul(vec![# left, # right])
}
}
pub fn generate_div(left: &TokenStream, right: &TokenStream) -> TokenStream {
let inv_right = quote! {
mathhook_core::Expression::pow(# right, mathhook_core::Expression::integer(-
1))
};
quote! {
mathhook_core::Expression::mul(vec![# left, # inv_right])
}
}
pub fn generate_pow(base: &TokenStream, exp: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::pow(# base, # exp)
}
}
pub fn generate_neg(expr: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::mul(vec![mathhook_core::Expression::integer(- 1),
# expr])
}
}
pub fn generate_function(name: &str, args: &Vec<TokenStream>) -> TokenStream {
quote! {
mathhook_core::Expression::function(# name, vec![# (# args),*])
}
}
pub fn generate_relation_equal(left: &TokenStream, right: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::relation(# left, # right,
mathhook_core::core::expression::RelationType::Equal)
}
}
pub fn generate_relation_less(left: &TokenStream, right: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::relation(# left, # right,
mathhook_core::core::expression::RelationType::Less)
}
}
pub fn generate_relation_greater(left: &TokenStream, right: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::relation(# left, # right,
mathhook_core::core::expression::RelationType::Greater)
}
}
pub fn generate_relation_less_equal(left: &TokenStream, right: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::relation(# left, # right,
mathhook_core::core::expression::RelationType::LessEqual)
}
}
pub fn generate_relation_greater_equal(left: &TokenStream, right: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::relation(# left, # right,
mathhook_core::core::expression::RelationType::GreaterEqual)
}
}
pub fn generate_method_abs(receiver: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::function("abs", vec![# receiver])
}
}
pub fn generate_method_sqrt(receiver: &TokenStream) -> TokenStream {
quote! {
mathhook_core::Expression::function("sqrt", vec![# receiver])
}
}
pub fn generate_method_simplify(receiver: &TokenStream) -> TokenStream {
quote! {
(# receiver).simplify()
}
}
}