From 2cfa6ed6b0f297b899b8da4b87bda7e76b39c0f5 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 11 Dec 2024 20:20:33 +0100 Subject: [PATCH] Add `AnyOp` --- .../2024-12-09/src/geometry/operation.rs | 33 ++++++++++++++++++- .../2024-12-09/src/geometry/ops_log.rs | 8 ++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/experiments/2024-12-09/src/geometry/operation.rs b/experiments/2024-12-09/src/geometry/operation.rs index 4664f3340..82fe1ac8a 100644 --- a/experiments/2024-12-09/src/geometry/operation.rs +++ b/experiments/2024-12-09/src/geometry/operation.rs @@ -1,4 +1,4 @@ -use std::fmt; +use std::{fmt, rc::Rc}; use super::{Triangle, Vertex}; @@ -7,3 +7,34 @@ pub trait Operation: fmt::Display { fn triangles(&self, triangles: &mut Vec); fn children(&self) -> Vec>; } + +#[derive(Clone)] +pub struct AnyOp { + inner: Rc, +} + +impl AnyOp { + pub fn new(op: impl Operation + 'static) -> Self { + Self { inner: Rc::new(op) } + } +} + +impl fmt::Display for AnyOp { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.inner) + } +} + +impl Operation for AnyOp { + fn vertices(&self, vertices: &mut Vec) { + self.inner.vertices(vertices); + } + + fn triangles(&self, triangles: &mut Vec) { + self.inner.triangles(triangles); + } + + fn children(&self) -> Vec> { + self.inner.children() + } +} diff --git a/experiments/2024-12-09/src/geometry/ops_log.rs b/experiments/2024-12-09/src/geometry/ops_log.rs index cd97e326d..7f347da7b 100644 --- a/experiments/2024-12-09/src/geometry/ops_log.rs +++ b/experiments/2024-12-09/src/geometry/ops_log.rs @@ -2,7 +2,7 @@ use std::{fmt, rc::Rc}; use tuples::CombinRight; -use super::{Operation, Triangle, Vertex}; +use super::{operation::AnyOp, Operation, Triangle, Vertex}; #[derive(Default)] pub struct OpsLog { @@ -17,7 +17,7 @@ impl OpsLog { let vertex = vertex.into(); self.operations.push(OperationInSequence { - operation: Rc::new(vertex), + operation: AnyOp::new(vertex), previous: self.operations.last().map(|op| Rc::new(op.clone()) as _), }); @@ -34,7 +34,7 @@ impl OpsLog { let triangle = triangle.into(); self.operations.push(OperationInSequence { - operation: Rc::new(triangle), + operation: AnyOp::new(triangle), previous: self.operations.last().map(|op| Rc::new(op.clone()) as _), }); @@ -78,7 +78,7 @@ impl Operation for OpsLog { #[derive(Clone)] struct OperationInSequence { - pub operation: Rc, + pub operation: AnyOp, pub previous: Option>, }