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