From 0750abdc0821fa55b99817bdf101710d137ee3c6 Mon Sep 17 00:00:00 2001 From: Udo Eisenbarth <u.eisenbarth@gsi.de> Date: Wed, 7 Jun 2023 13:30:45 +0200 Subject: [PATCH] Add two examples for testing the overall node structure. --- examples/structtest.rs | 59 +++++++++++++++++++++++++++++++++++++++ examples/structtest2.rs | 61 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 examples/structtest.rs create mode 100644 examples/structtest2.rs diff --git a/examples/structtest.rs b/examples/structtest.rs new file mode 100644 index 00000000..65cb32c4 --- /dev/null +++ b/examples/structtest.rs @@ -0,0 +1,59 @@ +use petgraph::prelude::{DiGraph, EdgeIndex, NodeIndex}; +struct OpticDummy; + +struct OpticIdealLens { + focal_length: f64, +} +impl OpticIdealLens { + pub fn new(focal_length: f64) -> Self { + Self{focal_length} + } +} +trait Optical { + fn analyze(&self) { + println!("generic analyze"); + } +} +impl Optical for OpticDummy { + fn analyze(&self) { + println!("optic dummy analyze"); + } +} +impl Optical for OpticIdealLens { + fn analyze(&self) { + println!("ideal lens analyze. f={}",self.focal_length); + } +} +struct OpticNode<T: Optical> { + name: String, + node: T +} +impl <T: Optical> OpticNode<T> { + pub fn new(name: &str, t: T) -> Self { + Self{name: name.into(), node : t} + } + // pub fn node_mut(&mut self) -> &mut T { + // &mut self.node + // } + pub fn analyze(&mut self) { + print!("Analyze element {}: ",self.name); + self.node.analyze(); + } +} + +impl OpticNode<OpticIdealLens> { + pub fn set_focal_length(&mut self, f: f64) { + self.node.focal_length=f; + } +} +fn main() { + let mut node=OpticNode::new("Test1", OpticDummy); + node.analyze(); + + let mut node=OpticNode::new("Test2", OpticIdealLens::new(1.23)); + node.analyze(); + node.set_focal_length(3.45); + node.analyze(); + + // let g: DiGraph<OpticNode<>,()>=DiGraph::new(); // does not work since it needs a concrete type here.... +} \ No newline at end of file diff --git a/examples/structtest2.rs b/examples/structtest2.rs new file mode 100644 index 00000000..7c6914ef --- /dev/null +++ b/examples/structtest2.rs @@ -0,0 +1,61 @@ +use petgraph::prelude::{DiGraph, EdgeIndex, NodeIndex}; +trait Optical { + fn analyze(&self) { + println!("generic analyze"); + } +} +struct OpticDummy; + +struct OpticIdealLens { + focal_length: f64, +} + +impl OpticIdealLens { + pub fn new(focal_length: f64) -> Self { + Self{focal_length} + } +} + +impl Optical for OpticIdealLens { + fn analyze(&self) { + println!("ideal lens analyze: f={}",self.focal_length); + } +} +enum NodeType { + Dummy, + IdealLens(OpticIdealLens), + SimpleElement(f64) +} +impl NodeType { + fn analyze(&self) { + match self { + NodeType::Dummy => println!("dummy -> nothing to do here"), + NodeType::IdealLens(n) => n.analyze(), + _ => println!("not covered") + } + } +} +struct OpticNode { + name: String, + node: NodeType +} + +impl OpticNode { + fn new(name: &str, node_type: NodeType) -> Self { + Self{name: name.into(), node: node_type} + } + fn analyze(&self) { + print!("Analyze {}: ",self.name); + self.node.analyze(); + } +} +fn main() { + let node=OpticNode::new("Test1",NodeType::Dummy); + node.analyze(); + let node=OpticNode::new("Test2",NodeType::IdealLens(OpticIdealLens::new(1.23))); + node.analyze(); + let node=OpticNode::new("Test2",NodeType::SimpleElement(1.23)); + node.analyze(); + + let p:DiGraph<OpticNode,()> = DiGraph::new(); +} \ No newline at end of file -- GitLab