From 42253aa6e35bda2e11f01bf04e498ebeb240e539 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sat, 8 Nov 2025 19:08:21 +0500 Subject: [PATCH] got node handlers on enum rails, making box not necessary and fixing potential memory losses --- src/node/handler.rs | 58 ++++++++------------------------------------- src/node/mod.rs | 15 +++++------- 2 files changed, 16 insertions(+), 57 deletions(-) diff --git a/src/node/handler.rs b/src/node/handler.rs index 018d4dd..43e35fa 100644 --- a/src/node/handler.rs +++ b/src/node/handler.rs @@ -1,53 +1,15 @@ -pub trait NodeHandler { - fn run(&self, inputs: Vec) -> f64; +pub enum NodeHandler { + Number { number: f64 }, + Function { function: fn(Vec) -> f64 }, + Variable { getter: fn() -> f64 }, } -pub struct NodeFunction { - function: fn(Vec) -> f64, -} - -impl NodeFunction { - pub fn new(function: fn(Vec) -> f64) -> NodeFunction { - NodeFunction { function } - } -} - -impl NodeHandler for NodeFunction { - fn run(&self, inputs: Vec) -> f64 { - (self.function)(inputs) - } -} - -pub struct NodeNumber { - number: f64, -} - -impl NodeNumber { - pub fn new(number: Option) -> NodeNumber { - NodeNumber { - number: number.unwrap_or(0f64), +impl NodeHandler { + pub fn run(&self, inputs: Vec) -> f64 { + match self { + NodeHandler::Number { number } => number.clone(), + NodeHandler::Function { function } => function(inputs), + NodeHandler::Variable { getter } => getter(), } } } - -impl NodeHandler for NodeNumber { - fn run(&self, inputs: Vec) -> 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 { - (self.getter)() - } -} diff --git a/src/node/mod.rs b/src/node/mod.rs index 1921382..b88873f 100644 --- a/src/node/mod.rs +++ b/src/node/mod.rs @@ -6,17 +6,14 @@ mod node_modifier; pub struct Node { children: Vec, - handler: Box, + handler: NodeHandler, } impl Node { - pub fn new(children: Option>, handler: T) -> Self - where - T: NodeHandler + 'static, - { + pub fn new(children: Option>, handler: NodeHandler) -> Self { Self { children: children.unwrap_or(vec![]), - handler: Box::new(handler), + handler: handler, } } pub fn get_value(&self) -> f64 { @@ -36,19 +33,19 @@ impl Node { pub fn number(n: f64) -> Node { Node { children: vec![], - handler: Box::new(NodeNumber::new(Some(n))), + handler: NodeHandler::Number { number: n }, } } pub fn function(func: fn(Vec) -> f64) -> Node { Node { children: vec![], - handler: Box::new(NodeFunction::new(func)), + handler: NodeHandler::Function { function: func }, } } pub fn variable(getter: fn() -> f64) -> Node { Node { children: vec![], - handler: Box::new(NodeVariable::new(getter)), + handler: NodeHandler::Variable { getter }, } } }