got node handlers on enum rails, making box not necessary and fixing
potential memory losses
This commit is contained in:
parent
5355a2c6af
commit
42253aa6e3
2 changed files with 16 additions and 57 deletions
|
|
@ -1,53 +1,15 @@
|
||||||
pub trait NodeHandler {
|
pub enum NodeHandler {
|
||||||
fn run(&self, inputs: Vec<f64>) -> f64;
|
Number { number: f64 },
|
||||||
|
Function { function: fn(Vec<f64>) -> f64 },
|
||||||
|
Variable { getter: fn() -> f64 },
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct NodeFunction {
|
impl NodeHandler {
|
||||||
function: fn(Vec<f64>) -> f64,
|
pub fn run(&self, inputs: Vec<f64>) -> f64 {
|
||||||
}
|
match self {
|
||||||
|
NodeHandler::Number { number } => number.clone(),
|
||||||
impl NodeFunction {
|
NodeHandler::Function { function } => function(inputs),
|
||||||
pub fn new(function: fn(Vec<f64>) -> f64) -> NodeFunction {
|
NodeHandler::Variable { getter } => getter(),
|
||||||
NodeFunction { function }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl NodeHandler for NodeFunction {
|
|
||||||
fn run(&self, inputs: Vec<f64>) -> f64 {
|
|
||||||
(self.function)(inputs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct NodeNumber {
|
|
||||||
number: f64,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl NodeNumber {
|
|
||||||
pub fn new(number: Option<f64>) -> NodeNumber {
|
|
||||||
NodeNumber {
|
|
||||||
number: number.unwrap_or(0f64),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NodeHandler for NodeNumber {
|
|
||||||
fn run(&self, inputs: Vec<f64>) -> f64 {
|
|
||||||
self.number
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct NodeVariable {
|
|
||||||
getter: fn() -> f64,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl NodeVariable {
|
|
||||||
pub fn new(getter: fn() -> f64) -> NodeVariable {
|
|
||||||
NodeVariable { getter }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl NodeHandler for NodeVariable {
|
|
||||||
fn run(&self, inputs: Vec<f64>) -> f64 {
|
|
||||||
(self.getter)()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -6,17 +6,14 @@ mod node_modifier;
|
||||||
|
|
||||||
pub struct Node {
|
pub struct Node {
|
||||||
children: Vec<Node>,
|
children: Vec<Node>,
|
||||||
handler: Box<dyn NodeHandler>,
|
handler: NodeHandler,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Node {
|
impl Node {
|
||||||
pub fn new<T>(children: Option<Vec<Node>>, handler: T) -> Self
|
pub fn new(children: Option<Vec<Node>>, handler: NodeHandler) -> Self {
|
||||||
where
|
|
||||||
T: NodeHandler + 'static,
|
|
||||||
{
|
|
||||||
Self {
|
Self {
|
||||||
children: children.unwrap_or(vec![]),
|
children: children.unwrap_or(vec![]),
|
||||||
handler: Box::new(handler),
|
handler: handler,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn get_value(&self) -> f64 {
|
pub fn get_value(&self) -> f64 {
|
||||||
|
|
@ -36,19 +33,19 @@ impl Node {
|
||||||
pub fn number(n: f64) -> Node {
|
pub fn number(n: f64) -> Node {
|
||||||
Node {
|
Node {
|
||||||
children: vec![],
|
children: vec![],
|
||||||
handler: Box::new(NodeNumber::new(Some(n))),
|
handler: NodeHandler::Number { number: n },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn function(func: fn(Vec<f64>) -> f64) -> Node {
|
pub fn function(func: fn(Vec<f64>) -> f64) -> Node {
|
||||||
Node {
|
Node {
|
||||||
children: vec![],
|
children: vec![],
|
||||||
handler: Box::new(NodeFunction::new(func)),
|
handler: NodeHandler::Function { function: func },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn variable(getter: fn() -> f64) -> Node {
|
pub fn variable(getter: fn() -> f64) -> Node {
|
||||||
Node {
|
Node {
|
||||||
children: vec![],
|
children: vec![],
|
||||||
handler: Box::new(NodeVariable::new(getter)),
|
handler: NodeHandler::Variable { getter },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue