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}