Skip to main content

symjit/
defuns.rs

1use crate::code::{BinaryFunc, BinaryFuncCplx, Func, UnaryFunc, UnaryFuncCplx};
2use std::collections::HashMap;
3
4#[derive(Debug, Clone, Default)]
5pub struct Defuns {
6    pub funcs: HashMap<String, Func>,
7}
8
9impl Defuns {
10    pub fn new() -> Defuns {
11        Defuns {
12            funcs: HashMap::new(),
13        }
14    }
15
16    pub fn add_func(&mut self, name: &str, p: *const usize, num_args: usize) {
17        match num_args {
18            1 => {
19                let f: UnaryFunc = unsafe { std::mem::transmute(p) };
20                self.funcs.insert(name.to_string(), Func::Unary(f));
21            }
22            2 => {
23                let f: BinaryFunc = unsafe { std::mem::transmute(p) };
24                self.funcs.insert(name.to_string(), Func::Binary(f));
25            }
26            _ => {
27                panic!("only unary and binary functions are supported")
28            }
29        }
30    }
31
32    pub fn add_unary(&mut self, name: &str, f: UnaryFunc) {
33        self.funcs.insert(name.to_string(), Func::Unary(f));
34    }
35
36    pub fn add_binary(&mut self, name: &str, f: BinaryFunc) {
37        self.funcs.insert(name.to_string(), Func::Binary(f));
38    }
39
40    pub fn add_unary_complex(&mut self, name: &str, f: UnaryFuncCplx) {
41        self.funcs
42            .insert(format!("cplx_{}", name), Func::UnaryCplx(f));
43    }
44
45    pub fn add_binary_complex(&mut self, name: &str, f: BinaryFuncCplx) {
46        self.funcs
47            .insert(format!("cplx_{}", name), Func::BinaryCplx(f));
48    }
49
50    pub fn len(&self) -> usize {
51        self.funcs.len()
52    }
53
54    pub fn is_empty(&self) -> bool {
55        self.len() == 0
56    }
57}