From 43e5810588c6ebb107a3648de274a349f27e33e6 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:14:14 +0200 Subject: [PATCH 01/12] Remove `GlobalCurve::new` --- .../fj-kernel/src/algorithms/intersect/surface_surface.rs | 2 +- crates/fj-kernel/src/algorithms/sweep/vertex.rs | 2 +- crates/fj-kernel/src/algorithms/transform/curve.rs | 2 +- crates/fj-kernel/src/iter.rs | 2 +- crates/fj-kernel/src/objects/curve.rs | 7 ------- crates/fj-kernel/src/partial/objects/curve.rs | 6 +++--- crates/fj-kernel/src/validate/mod.rs | 2 +- 7 files changed, 8 insertions(+), 15 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/surface_surface.rs b/crates/fj-kernel/src/algorithms/intersect/surface_surface.rs index 8411625f6..cd3864e9a 100644 --- a/crates/fj-kernel/src/algorithms/intersect/surface_surface.rs +++ b/crates/fj-kernel/src/algorithms/intersect/surface_surface.rs @@ -57,7 +57,7 @@ impl SurfaceSurfaceIntersection { let curves = surfaces_and_planes.map(|(surface, plane)| { let path = SurfacePath::Line(plane.project_line(&line)); - let global_form = GlobalCurve::new(objects); + let global_form = objects.global_curves.insert(GlobalCurve); Curve::new(surface, path, global_form, objects) }); diff --git a/crates/fj-kernel/src/algorithms/sweep/vertex.rs b/crates/fj-kernel/src/algorithms/sweep/vertex.rs index 954cb532a..8edc75e87 100644 --- a/crates/fj-kernel/src/algorithms/sweep/vertex.rs +++ b/crates/fj-kernel/src/algorithms/sweep/vertex.rs @@ -131,7 +131,7 @@ impl Sweep for Handle { cache: &mut SweepCache, objects: &Objects, ) -> Result { - let curve = GlobalCurve::new(objects); + let curve = objects.global_curves.insert(GlobalCurve); let a = self.clone(); let b = cache diff --git a/crates/fj-kernel/src/algorithms/transform/curve.rs b/crates/fj-kernel/src/algorithms/transform/curve.rs index 9bad63cc7..d034d9dbf 100644 --- a/crates/fj-kernel/src/algorithms/transform/curve.rs +++ b/crates/fj-kernel/src/algorithms/transform/curve.rs @@ -23,7 +23,7 @@ impl TransformObject for Handle { // All we need to do here is create a new `GlobalCurve` instance, to // make sure the transformed `GlobalCurve` has a different identity than // the original one. - Ok(GlobalCurve::new(objects)) + Ok(objects.global_curves.insert(GlobalCurve)) } } diff --git a/crates/fj-kernel/src/iter.rs b/crates/fj-kernel/src/iter.rs index 7b0aac402..0091fab7f 100644 --- a/crates/fj-kernel/src/iter.rs +++ b/crates/fj-kernel/src/iter.rs @@ -443,7 +443,7 @@ mod tests { fn global_curve() { let objects = Objects::new(); - let object = GlobalCurve::new(&objects); + let object = objects.global_curves.insert(GlobalCurve); assert_eq!(0, object.curve_iter().count()); assert_eq!(0, object.cycle_iter().count()); diff --git a/crates/fj-kernel/src/objects/curve.rs b/crates/fj-kernel/src/objects/curve.rs index 927684978..2a379748f 100644 --- a/crates/fj-kernel/src/objects/curve.rs +++ b/crates/fj-kernel/src/objects/curve.rs @@ -47,10 +47,3 @@ impl Curve { /// A curve, defined in global (3D) coordinates #[derive(Clone, Copy, Debug)] pub struct GlobalCurve; - -impl GlobalCurve { - /// Construct a new instance of `Handle` and add it to the store - pub fn new(objects: &Objects) -> Handle { - objects.global_curves.insert(GlobalCurve) - } -} diff --git a/crates/fj-kernel/src/partial/objects/curve.rs b/crates/fj-kernel/src/partial/objects/curve.rs index ab04bcb67..fa7b59a1f 100644 --- a/crates/fj-kernel/src/partial/objects/curve.rs +++ b/crates/fj-kernel/src/partial/objects/curve.rs @@ -92,9 +92,9 @@ impl PartialCurve { let surface = self.surface.expect("Can't build `Curve` without surface"); - let global_form = self - .global_form - .unwrap_or_else(|| GlobalCurve::new(objects).into()); + let global_form = self.global_form.unwrap_or_else(|| { + objects.global_curves.insert(GlobalCurve).into() + }); Ok(Curve::new(surface, path, global_form, objects)) } diff --git a/crates/fj-kernel/src/validate/mod.rs b/crates/fj-kernel/src/validate/mod.rs index dca5dc80e..96a76125a 100644 --- a/crates/fj-kernel/src/validate/mod.rs +++ b/crates/fj-kernel/src/validate/mod.rs @@ -209,7 +209,7 @@ mod tests { let curve = { let path = SurfacePath::line_from_points(points_surface); - let global_form = GlobalCurve::new(&objects); + let global_form = objects.global_curves.insert(GlobalCurve); Curve::new(surface.clone(), path, global_form, &objects) }; From 2a8b0ffe90fc558c9fddc9e5c3cebd24a393dd9f Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:16:15 +0200 Subject: [PATCH 02/12] Simplify `Curve::new` --- .../src/algorithms/intersect/surface_surface.rs | 4 +++- crates/fj-kernel/src/algorithms/sweep/edge.rs | 9 +++++---- crates/fj-kernel/src/algorithms/sweep/vertex.rs | 5 ++--- crates/fj-kernel/src/objects/curve.rs | 9 ++++----- crates/fj-kernel/src/partial/objects/curve.rs | 4 +++- crates/fj-kernel/src/validate/mod.rs | 6 +++++- 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/surface_surface.rs b/crates/fj-kernel/src/algorithms/intersect/surface_surface.rs index cd3864e9a..d6d8cb963 100644 --- a/crates/fj-kernel/src/algorithms/intersect/surface_surface.rs +++ b/crates/fj-kernel/src/algorithms/intersect/surface_surface.rs @@ -59,7 +59,9 @@ impl SurfaceSurfaceIntersection { let path = SurfacePath::Line(plane.project_line(&line)); let global_form = objects.global_curves.insert(GlobalCurve); - Curve::new(surface, path, global_form, objects) + objects + .curves + .insert(Curve::new(surface, path, global_form)) }); Some(Self { diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index 222c0ff61..747c6a504 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -50,12 +50,11 @@ impl Sweep for (Handle, Color) { points_curve_and_surface, )); - Curve::new( + objects.curves.insert(Curve::new( surface.clone(), path, edge.curve().global_form().clone(), - objects, - ) + )) }; let vertices = { @@ -117,7 +116,9 @@ impl Sweep for (Handle, Color) { points_curve_and_surface, )); - Curve::new(surface.clone(), path, global, objects) + objects + .curves + .insert(Curve::new(surface.clone(), path, global)) }; let global = GlobalEdge::new( diff --git a/crates/fj-kernel/src/algorithms/sweep/vertex.rs b/crates/fj-kernel/src/algorithms/sweep/vertex.rs index 8edc75e87..d69477016 100644 --- a/crates/fj-kernel/src/algorithms/sweep/vertex.rs +++ b/crates/fj-kernel/src/algorithms/sweep/vertex.rs @@ -88,12 +88,11 @@ impl Sweep for (Handle, Handle) { let curve = { let line = Line::from_points(points_surface); - Curve::new( + objects.curves.insert(Curve::new( surface.clone(), SurfacePath::Line(line), edge_global.curve().clone(), - objects, - ) + )) }; let vertices_surface = { diff --git a/crates/fj-kernel/src/objects/curve.rs b/crates/fj-kernel/src/objects/curve.rs index 2a379748f..54837aa5f 100644 --- a/crates/fj-kernel/src/objects/curve.rs +++ b/crates/fj-kernel/src/objects/curve.rs @@ -3,7 +3,7 @@ use crate::{ storage::{Handle, HandleWrapper}, }; -use super::{Objects, Surface}; +use super::Surface; /// A curve, defined in local surface coordinates #[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] @@ -19,13 +19,12 @@ impl Curve { surface: Handle, path: SurfacePath, global_form: impl Into>, - objects: &Objects, - ) -> Handle { - objects.curves.insert(Self { + ) -> Self { + Self { surface, path, global_form: global_form.into(), - }) + } } /// Access the path that defines this curve diff --git a/crates/fj-kernel/src/partial/objects/curve.rs b/crates/fj-kernel/src/partial/objects/curve.rs index fa7b59a1f..2d8090f6f 100644 --- a/crates/fj-kernel/src/partial/objects/curve.rs +++ b/crates/fj-kernel/src/partial/objects/curve.rs @@ -96,7 +96,9 @@ impl PartialCurve { objects.global_curves.insert(GlobalCurve).into() }); - Ok(Curve::new(surface, path, global_form, objects)) + Ok(objects + .curves + .insert(Curve::new(surface, path, global_form))) } } diff --git a/crates/fj-kernel/src/validate/mod.rs b/crates/fj-kernel/src/validate/mod.rs index 96a76125a..4aecfd2b7 100644 --- a/crates/fj-kernel/src/validate/mod.rs +++ b/crates/fj-kernel/src/validate/mod.rs @@ -211,7 +211,11 @@ mod tests { let path = SurfacePath::line_from_points(points_surface); let global_form = objects.global_curves.insert(GlobalCurve); - Curve::new(surface.clone(), path, global_form, &objects) + objects.curves.insert(Curve::new( + surface.clone(), + path, + global_form, + )) }; let vertices_global = points_global From b2e070db198edec203e5a8bea08c36c95b4ad247 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:19:03 +0200 Subject: [PATCH 03/12] Simplify `GlobalVertex::from_position` --- .../fj-kernel/src/algorithms/sweep/vertex.rs | 5 ++-- crates/fj-kernel/src/iter.rs | 8 ++++-- crates/fj-kernel/src/objects/vertex.rs | 7 ++--- .../fj-kernel/src/partial/objects/vertex.rs | 4 ++- crates/fj-kernel/src/validate/mod.rs | 27 ++++++++++++++----- 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/vertex.rs b/crates/fj-kernel/src/algorithms/sweep/vertex.rs index d69477016..38591c773 100644 --- a/crates/fj-kernel/src/algorithms/sweep/vertex.rs +++ b/crates/fj-kernel/src/algorithms/sweep/vertex.rs @@ -137,10 +137,9 @@ impl Sweep for Handle { .global_vertex .entry(self.id()) .or_insert_with(|| { - GlobalVertex::from_position( + objects.global_vertices.insert(GlobalVertex::from_position( self.position() + path.into(), - objects, - ) + )) }) .clone(); diff --git a/crates/fj-kernel/src/iter.rs b/crates/fj-kernel/src/iter.rs index 0091fab7f..6d4363a01 100644 --- a/crates/fj-kernel/src/iter.rs +++ b/crates/fj-kernel/src/iter.rs @@ -462,7 +462,9 @@ mod tests { fn global_vertex() { let objects = Objects::new(); - let object = GlobalVertex::from_position([0., 0., 0.], &objects); + let object = objects + .global_vertices + .insert(GlobalVertex::from_position([0., 0., 0.])); assert_eq!(0, object.curve_iter().count()); assert_eq!(0, object.cycle_iter().count()); @@ -593,7 +595,9 @@ mod tests { .with_surface(Some(surface.clone())) .as_u_axis() .build(&objects)?; - let global_vertex = GlobalVertex::from_position([0., 0., 0.], &objects); + let global_vertex = objects + .global_vertices + .insert(GlobalVertex::from_position([0., 0., 0.])); let surface_vertex = SurfaceVertex::new([0., 0.], surface, global_vertex, &objects); let object = Vertex::new([0.], curve, surface_vertex, &objects); diff --git a/crates/fj-kernel/src/objects/vertex.rs b/crates/fj-kernel/src/objects/vertex.rs index fe4786604..dd8e01652 100644 --- a/crates/fj-kernel/src/objects/vertex.rs +++ b/crates/fj-kernel/src/objects/vertex.rs @@ -129,12 +129,9 @@ pub struct GlobalVertex { impl GlobalVertex { /// Construct a `GlobalVertex` from a position - pub fn from_position( - position: impl Into>, - objects: &Objects, - ) -> Handle { + pub fn from_position(position: impl Into>) -> Self { let position = position.into(); - objects.global_vertices.insert(Self { position }) + Self { position } } /// Access the position of the vertex diff --git a/crates/fj-kernel/src/partial/objects/vertex.rs b/crates/fj-kernel/src/partial/objects/vertex.rs index ce7fc2201..de17f8812 100644 --- a/crates/fj-kernel/src/partial/objects/vertex.rs +++ b/crates/fj-kernel/src/partial/objects/vertex.rs @@ -284,7 +284,9 @@ impl PartialGlobalVertex { .position .expect("Can't build a `GlobalVertex` without a position"); - Ok(GlobalVertex::from_position(position, objects)) + Ok(objects + .global_vertices + .insert(GlobalVertex::from_position(position))) } } diff --git a/crates/fj-kernel/src/validate/mod.rs b/crates/fj-kernel/src/validate/mod.rs index 4aecfd2b7..040ba689a 100644 --- a/crates/fj-kernel/src/validate/mod.rs +++ b/crates/fj-kernel/src/validate/mod.rs @@ -48,7 +48,9 @@ pub trait Validate: Sized { /// # validate::{Validate, ValidationConfig}, /// # }; /// # let objects = Objects::new(); - /// # let object = GlobalVertex::from_position([0., 0., 0.], &objects); + /// # let object = objects.global_vertices.insert( + /// # GlobalVertex::from_position([0., 0., 0.]) + /// # ); /// object.validate(); /// ``` /// ``` rust @@ -57,7 +59,9 @@ pub trait Validate: Sized { /// # validate::{Validate, ValidationConfig}, /// # }; /// # let objects = Objects::new(); - /// # let object = GlobalVertex::from_position([0., 0., 0.], &objects); + /// # let object = objects.global_vertices.insert( + /// # GlobalVertex::from_position([0., 0., 0.]) + /// # ); /// object.validate_with_config(&ValidationConfig::default()); /// ``` fn validate(self) -> Result, ValidationError> { @@ -218,8 +222,11 @@ mod tests { )) }; - let vertices_global = points_global - .map(|point| GlobalVertex::from_position(point, &objects)); + let vertices_global = points_global.map(|point| { + objects + .global_vertices + .insert(GlobalVertex::from_position(point)) + }); let [a_surface, b_surface] = points_surface .zip_ext(vertices_global) @@ -286,11 +293,19 @@ mod tests { }; // Adding a vertex should work. - shape.push(GlobalVertex::from_position(a, &objects)); + shape.push( + objects + .global_vertices + .insert(GlobalVertex::from_position(a)), + ); shape.clone().validate_with_config(&config)?; // Adding a second vertex that is considered identical should fail. - shape.push(GlobalVertex::from_position(b, &objects)); + shape.push( + objects + .global_vertices + .insert(GlobalVertex::from_position(b)), + ); let result = shape.validate_with_config(&config); assert!(matches!(result, Err(ValidationError::Uniqueness(_)))); From 8af41f88a6d747799e562b24b172a59589fc63a9 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:20:48 +0200 Subject: [PATCH 04/12] Simplify `SurfaceVertex::new` --- crates/fj-kernel/src/algorithms/sweep/edge.rs | 11 ++++++----- crates/fj-kernel/src/algorithms/sweep/vertex.rs | 6 +++++- crates/fj-kernel/src/iter.rs | 5 +++-- crates/fj-kernel/src/objects/vertex.rs | 7 +++---- crates/fj-kernel/src/partial/objects/vertex.rs | 6 +++++- crates/fj-kernel/src/validate/mod.rs | 5 ++--- 6 files changed, 24 insertions(+), 16 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index 747c6a504..2808a6fdc 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -63,11 +63,12 @@ impl Sweep for (Handle, Color) { vertices.each_ref_ext().zip_ext(points_surface).map( |(vertex, point_surface)| { - let surface_vertex = SurfaceVertex::new( - point_surface, - surface.clone(), - vertex.global_form().clone(), - objects, + let surface_vertex = objects.surface_vertices.insert( + SurfaceVertex::new( + point_surface, + surface.clone(), + vertex.global_form().clone(), + ), ); Vertex::new( diff --git a/crates/fj-kernel/src/algorithms/sweep/vertex.rs b/crates/fj-kernel/src/algorithms/sweep/vertex.rs index 38591c773..b58c7c9b9 100644 --- a/crates/fj-kernel/src/algorithms/sweep/vertex.rs +++ b/crates/fj-kernel/src/algorithms/sweep/vertex.rs @@ -101,7 +101,11 @@ impl Sweep for (Handle, Handle) { [ vertex.surface_form().clone(), - SurfaceVertex::new(position, surface, global_form, objects), + objects.surface_vertices.insert(SurfaceVertex::new( + position, + surface, + global_form, + )), ] }; diff --git a/crates/fj-kernel/src/iter.rs b/crates/fj-kernel/src/iter.rs index 6d4363a01..59d1346f0 100644 --- a/crates/fj-kernel/src/iter.rs +++ b/crates/fj-kernel/src/iter.rs @@ -598,8 +598,9 @@ mod tests { let global_vertex = objects .global_vertices .insert(GlobalVertex::from_position([0., 0., 0.])); - let surface_vertex = - SurfaceVertex::new([0., 0.], surface, global_vertex, &objects); + let surface_vertex = objects + .surface_vertices + .insert(SurfaceVertex::new([0., 0.], surface, global_vertex)); let object = Vertex::new([0.], curve, surface_vertex, &objects); assert_eq!(1, object.curve_iter().count()); diff --git a/crates/fj-kernel/src/objects/vertex.rs b/crates/fj-kernel/src/objects/vertex.rs index dd8e01652..0d5ab95d3 100644 --- a/crates/fj-kernel/src/objects/vertex.rs +++ b/crates/fj-kernel/src/objects/vertex.rs @@ -78,14 +78,13 @@ impl SurfaceVertex { position: impl Into>, surface: Handle, global_form: Handle, - objects: &Objects, - ) -> Handle { + ) -> Self { let position = position.into(); - objects.surface_vertices.insert(Self { + Self { position, surface, global_form, - }) + } } /// Access the position of the vertex on the surface diff --git a/crates/fj-kernel/src/partial/objects/vertex.rs b/crates/fj-kernel/src/partial/objects/vertex.rs index de17f8812..be5d91fed 100644 --- a/crates/fj-kernel/src/partial/objects/vertex.rs +++ b/crates/fj-kernel/src/partial/objects/vertex.rs @@ -209,7 +209,11 @@ impl PartialSurfaceVertex { }) .into_full(objects)?; - Ok(SurfaceVertex::new(position, surface, global_form, objects)) + Ok(objects.surface_vertices.insert(SurfaceVertex::new( + position, + surface, + global_form, + ))) } } diff --git a/crates/fj-kernel/src/validate/mod.rs b/crates/fj-kernel/src/validate/mod.rs index 040ba689a..1092ded44 100644 --- a/crates/fj-kernel/src/validate/mod.rs +++ b/crates/fj-kernel/src/validate/mod.rs @@ -231,12 +231,11 @@ mod tests { let [a_surface, b_surface] = points_surface .zip_ext(vertices_global) .map(|(point_surface, vertex_global)| { - SurfaceVertex::new( + objects.surface_vertices.insert(SurfaceVertex::new( point_surface, surface.clone(), vertex_global, - &objects, - ) + )) }); let deviation = Scalar::from_f64(0.25); From de41344ffbdaaabe0aa16ac347ef0c5db5e32ffc Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:22:32 +0200 Subject: [PATCH 05/12] Simplify `Vertex::new` --- crates/fj-kernel/src/algorithms/sweep/edge.rs | 10 ++++------ crates/fj-kernel/src/algorithms/sweep/vertex.rs | 5 ++--- crates/fj-kernel/src/iter.rs | 5 ++++- crates/fj-kernel/src/objects/vertex.rs | 9 ++++----- crates/fj-kernel/src/partial/objects/vertex.rs | 4 +++- crates/fj-kernel/src/validate/mod.rs | 10 ++++------ 6 files changed, 21 insertions(+), 22 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index 2808a6fdc..7772ec47e 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -71,12 +71,11 @@ impl Sweep for (Handle, Color) { ), ); - Vertex::new( + objects.vertices.insert(Vertex::new( vertex.position(), curve.clone(), surface_vertex, - objects, - ) + )) }, ) }; @@ -134,12 +133,11 @@ impl Sweep for (Handle, Color) { .each_ref_ext() .zip_ext(surface_vertices) .map(|(vertex, surface_form)| { - Vertex::new( + objects.vertices.insert(Vertex::new( vertex.position(), curve.clone(), surface_form, - objects, - ) + )) }); HalfEdge::new(vertices, global, objects) diff --git a/crates/fj-kernel/src/algorithms/sweep/vertex.rs b/crates/fj-kernel/src/algorithms/sweep/vertex.rs index b58c7c9b9..96fef8a4a 100644 --- a/crates/fj-kernel/src/algorithms/sweep/vertex.rs +++ b/crates/fj-kernel/src/algorithms/sweep/vertex.rs @@ -111,12 +111,11 @@ impl Sweep for (Handle, Handle) { // And now the vertices. Again, nothing wild here. let vertices = vertices_surface.map(|surface_form| { - Vertex::new( + objects.vertices.insert(Vertex::new( [surface_form.position().v], curve.clone(), surface_form, - objects, - ) + )) }); // And finally, creating the output `Edge` is just a matter of diff --git a/crates/fj-kernel/src/iter.rs b/crates/fj-kernel/src/iter.rs index 59d1346f0..9cf70f93d 100644 --- a/crates/fj-kernel/src/iter.rs +++ b/crates/fj-kernel/src/iter.rs @@ -601,7 +601,10 @@ mod tests { let surface_vertex = objects .surface_vertices .insert(SurfaceVertex::new([0., 0.], surface, global_vertex)); - let object = Vertex::new([0.], curve, surface_vertex, &objects); + let object = + objects + .vertices + .insert(Vertex::new([0.], curve, surface_vertex)); assert_eq!(1, object.curve_iter().count()); assert_eq!(0, object.cycle_iter().count()); diff --git a/crates/fj-kernel/src/objects/vertex.rs b/crates/fj-kernel/src/objects/vertex.rs index 0d5ab95d3..b7febcfc1 100644 --- a/crates/fj-kernel/src/objects/vertex.rs +++ b/crates/fj-kernel/src/objects/vertex.rs @@ -3,7 +3,7 @@ use pretty_assertions::assert_eq; use crate::storage::Handle; -use super::{Curve, Objects, Surface}; +use super::{Curve, Surface}; /// A vertex /// @@ -26,8 +26,7 @@ impl Vertex { position: impl Into>, curve: Handle, surface_form: Handle, - objects: &Objects, - ) -> Handle { + ) -> Self { let position = position.into(); assert_eq!( @@ -36,11 +35,11 @@ impl Vertex { "Surface form of vertex must be defined on same surface as curve", ); - objects.vertices.insert(Self { + Self { position, curve, surface_form, - }) + } } /// Access the position of the vertex on the curve diff --git a/crates/fj-kernel/src/partial/objects/vertex.rs b/crates/fj-kernel/src/partial/objects/vertex.rs index be5d91fed..02b158ce0 100644 --- a/crates/fj-kernel/src/partial/objects/vertex.rs +++ b/crates/fj-kernel/src/partial/objects/vertex.rs @@ -114,7 +114,9 @@ impl PartialVertex { }) .into_full(objects)?; - Ok(Vertex::new(position, curve, surface_form, objects)) + Ok(objects + .vertices + .insert(Vertex::new(position, curve, surface_form))) } } diff --git a/crates/fj-kernel/src/validate/mod.rs b/crates/fj-kernel/src/validate/mod.rs index 1092ded44..803c51d27 100644 --- a/crates/fj-kernel/src/validate/mod.rs +++ b/crates/fj-kernel/src/validate/mod.rs @@ -240,18 +240,16 @@ mod tests { let deviation = Scalar::from_f64(0.25); - let a = Vertex::new( + let a = objects.vertices.insert(Vertex::new( Point::from([Scalar::ZERO + deviation]), curve.clone(), a_surface, - &objects, - ); - let b = Vertex::new( + )); + let b = objects.vertices.insert(Vertex::new( Point::from([Scalar::ONE]), curve.clone(), b_surface, - &objects, - ); + )); let vertices = [a, b]; let global_edge = GlobalEdge::partial() From a9c44c30709f2ef0830fa475f24cca6fc9d8a7b6 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:25:22 +0200 Subject: [PATCH 06/12] Simplify `Cycle::new` --- crates/fj-kernel/src/algorithms/reverse/cycle.rs | 2 +- crates/fj-kernel/src/algorithms/sweep/edge.rs | 10 ++++------ crates/fj-kernel/src/builder/shell.rs | 4 +++- crates/fj-kernel/src/objects/cycle.rs | 9 ++++----- crates/fj-kernel/src/partial/objects/cycle.rs | 2 +- crates/fj-operations/src/sketch.rs | 3 ++- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/reverse/cycle.rs b/crates/fj-kernel/src/algorithms/reverse/cycle.rs index dd99a1a9c..205b87428 100644 --- a/crates/fj-kernel/src/algorithms/reverse/cycle.rs +++ b/crates/fj-kernel/src/algorithms/reverse/cycle.rs @@ -17,6 +17,6 @@ impl Reverse for Handle { edges.reverse(); - Cycle::new(surface, edges, objects) + objects.cycles.insert(Cycle::new(surface, edges)) } } diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index 7772ec47e..8014e3dd4 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -170,7 +170,7 @@ impl Sweep for (Handle, Color) { i += 1; } - Cycle::new(surface, edges, objects) + objects.cycles.insert(Cycle::new(surface, edges)) }; Ok(Face::builder(objects) @@ -247,11 +247,9 @@ mod tests { .build(&objects)? .reverse(&objects); - let cycle = Cycle::new( - surface, - [bottom, side_up, top, side_down], - &objects, - ); + let cycle = objects + .cycles + .insert(Cycle::new(surface, [bottom, side_up, top, side_down])); Face::builder(&objects).with_exterior(cycle).build() }; diff --git a/crates/fj-kernel/src/builder/shell.rs b/crates/fj-kernel/src/builder/shell.rs index 3dbac6881..6833efa65 100644 --- a/crates/fj-kernel/src/builder/shell.rs +++ b/crates/fj-kernel/src/builder/shell.rs @@ -258,7 +258,9 @@ impl<'a> ShellBuilder<'a> { } Face::builder(self.objects) - .with_exterior(Cycle::new(surface, edges, self.objects)) + .with_exterior( + self.objects.cycles.insert(Cycle::new(surface, edges)), + ) .build() }; diff --git a/crates/fj-kernel/src/objects/cycle.rs b/crates/fj-kernel/src/objects/cycle.rs index 1b5f7cde9..600ed651e 100644 --- a/crates/fj-kernel/src/objects/cycle.rs +++ b/crates/fj-kernel/src/objects/cycle.rs @@ -4,7 +4,7 @@ use pretty_assertions::assert_eq; use crate::{path::SurfacePath, storage::Handle}; -use super::{HalfEdge, Objects, Surface}; +use super::{HalfEdge, Surface}; /// A cycle of connected half-edges #[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] @@ -23,8 +23,7 @@ impl Cycle { pub fn new( surface: Handle, half_edges: impl IntoIterator>, - objects: &Objects, - ) -> Handle { + ) -> Self { let half_edges = half_edges.into_iter().collect::>(); // Verify, that the curves of all edges are defined in the correct @@ -65,10 +64,10 @@ impl Cycle { } } - objects.cycles.insert(Self { + Self { surface, half_edges, - }) + } } /// Access the surface that this cycle is in diff --git a/crates/fj-kernel/src/partial/objects/cycle.rs b/crates/fj-kernel/src/partial/objects/cycle.rs index fc177641d..8146a7256 100644 --- a/crates/fj-kernel/src/partial/objects/cycle.rs +++ b/crates/fj-kernel/src/partial/objects/cycle.rs @@ -233,7 +233,7 @@ impl PartialCycle { half_edges }; - Ok(Cycle::new(surface, half_edges, objects)) + Ok(objects.cycles.insert(Cycle::new(surface, half_edges))) } } diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index aeebe1e89..44f5fe67c 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -30,7 +30,8 @@ impl Shape for fj::Sketch { .with_surface(Some(surface.clone())) .as_circle_from_radius(circle.radius(), objects)? .build(objects)?; - let cycle = Cycle::new(surface, [half_edge], objects); + let cycle = + objects.cycles.insert(Cycle::new(surface, [half_edge])); Face::builder(objects) .with_exterior(cycle) From 714a26d406a1d8caf83bf66061653b939a0c4ac3 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:26:48 +0200 Subject: [PATCH 07/12] Simplify `GlobalEdge::new` --- crates/fj-kernel/src/algorithms/sweep/edge.rs | 5 ++--- crates/fj-kernel/src/algorithms/sweep/vertex.rs | 4 +++- crates/fj-kernel/src/objects/edge.rs | 5 ++--- crates/fj-kernel/src/partial/objects/edge.rs | 4 +++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index 8014e3dd4..2ad394ad4 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -121,13 +121,12 @@ impl Sweep for (Handle, Color) { .insert(Curve::new(surface.clone(), path, global)) }; - let global = GlobalEdge::new( + let global = objects.global_edges.insert(GlobalEdge::new( curve.global_form().clone(), surface_vertices .clone() .map(|surface_vertex| surface_vertex.global_form().clone()), - objects, - ); + )); let vertices = bottom_vertices .each_ref_ext() diff --git a/crates/fj-kernel/src/algorithms/sweep/vertex.rs b/crates/fj-kernel/src/algorithms/sweep/vertex.rs index 96fef8a4a..9ef57bfa4 100644 --- a/crates/fj-kernel/src/algorithms/sweep/vertex.rs +++ b/crates/fj-kernel/src/algorithms/sweep/vertex.rs @@ -147,7 +147,9 @@ impl Sweep for Handle { .clone(); let vertices = [a, b]; - let global_edge = GlobalEdge::new(curve, vertices.clone(), objects); + let global_edge = objects + .global_edges + .insert(GlobalEdge::new(curve, vertices.clone())); // The vertices of the returned `GlobalEdge` are in normalized order, // which means the order can't be relied upon by the caller. Return the diff --git a/crates/fj-kernel/src/objects/edge.rs b/crates/fj-kernel/src/objects/edge.rs index 28d6a5627..458fd1ea3 100644 --- a/crates/fj-kernel/src/objects/edge.rs +++ b/crates/fj-kernel/src/objects/edge.rs @@ -141,12 +141,11 @@ impl GlobalEdge { pub fn new( curve: impl Into>, vertices: [Handle; 2], - objects: &Objects, - ) -> Handle { + ) -> Self { let curve = curve.into(); let (vertices, _) = VerticesInNormalizedOrder::new(vertices); - objects.global_edges.insert(Self { curve, vertices }) + Self { curve, vertices } } /// Access the curve that defines the edge's geometry diff --git a/crates/fj-kernel/src/partial/objects/edge.rs b/crates/fj-kernel/src/partial/objects/edge.rs index 3cb70ddd5..537a95885 100644 --- a/crates/fj-kernel/src/partial/objects/edge.rs +++ b/crates/fj-kernel/src/partial/objects/edge.rs @@ -371,7 +371,9 @@ impl PartialGlobalEdge { .vertices .expect("Can't build `GlobalEdge` without vertices"); - Ok(GlobalEdge::new(curve, vertices, objects)) + Ok(objects + .global_edges + .insert(GlobalEdge::new(curve, vertices))) } } From 3f99da31c0bb99504defd0927b3be5d25794db64 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:28:13 +0200 Subject: [PATCH 08/12] Simplify `HalfEdge::new` --- crates/fj-kernel/src/algorithms/reverse/edge.rs | 4 +++- crates/fj-kernel/src/algorithms/sweep/edge.rs | 6 ++++-- crates/fj-kernel/src/algorithms/sweep/vertex.rs | 4 +++- crates/fj-kernel/src/objects/edge.rs | 9 ++++----- crates/fj-kernel/src/partial/objects/edge.rs | 4 +++- crates/fj-kernel/src/validate/mod.rs | 4 +++- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/reverse/edge.rs b/crates/fj-kernel/src/algorithms/reverse/edge.rs index 2943d6c31..559ff6b2b 100644 --- a/crates/fj-kernel/src/algorithms/reverse/edge.rs +++ b/crates/fj-kernel/src/algorithms/reverse/edge.rs @@ -12,6 +12,8 @@ impl Reverse for Handle { [b, a] }; - HalfEdge::new(vertices, self.global_form().clone(), objects) + objects + .half_edges + .insert(HalfEdge::new(vertices, self.global_form().clone())) } } diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index 2ad394ad4..18c6073cb 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -80,7 +80,9 @@ impl Sweep for (Handle, Color) { ) }; - HalfEdge::new(vertices, edge.global_form().clone(), objects) + objects + .half_edges + .insert(HalfEdge::new(vertices, edge.global_form().clone())) }; let side_edges = @@ -139,7 +141,7 @@ impl Sweep for (Handle, Color) { )) }); - HalfEdge::new(vertices, global, objects) + objects.half_edges.insert(HalfEdge::new(vertices, global)) }; let cycle = { diff --git a/crates/fj-kernel/src/algorithms/sweep/vertex.rs b/crates/fj-kernel/src/algorithms/sweep/vertex.rs index 9ef57bfa4..9f9b644ee 100644 --- a/crates/fj-kernel/src/algorithms/sweep/vertex.rs +++ b/crates/fj-kernel/src/algorithms/sweep/vertex.rs @@ -120,7 +120,9 @@ impl Sweep for (Handle, Handle) { // And finally, creating the output `Edge` is just a matter of // assembling the pieces we've already created. - Ok(HalfEdge::new(vertices, edge_global, objects)) + Ok(objects + .half_edges + .insert(HalfEdge::new(vertices, edge_global))) } } diff --git a/crates/fj-kernel/src/objects/edge.rs b/crates/fj-kernel/src/objects/edge.rs index 458fd1ea3..a82f0b795 100644 --- a/crates/fj-kernel/src/objects/edge.rs +++ b/crates/fj-kernel/src/objects/edge.rs @@ -4,7 +4,7 @@ use pretty_assertions::{assert_eq, assert_ne}; use crate::storage::{Handle, HandleWrapper}; -use super::{Curve, GlobalCurve, GlobalVertex, Objects, Vertex}; +use super::{Curve, GlobalCurve, GlobalVertex, Vertex}; /// A half-edge #[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] @@ -32,8 +32,7 @@ impl HalfEdge { pub fn new( [a, b]: [Handle; 2], global_form: Handle, - objects: &Objects, - ) -> Handle { + ) -> Self { // Make sure `curve` and `vertices` match. assert_eq!( a.curve().id(), @@ -75,10 +74,10 @@ impl HalfEdge { "Vertices of an edge must not be coincident on curve" ); - objects.half_edges.insert(Self { + Self { vertices: [a, b], global_form, - }) + } } /// Access the curve that defines the half-edge's geometry diff --git a/crates/fj-kernel/src/partial/objects/edge.rs b/crates/fj-kernel/src/partial/objects/edge.rs index 537a95885..7e62826e9 100644 --- a/crates/fj-kernel/src/partial/objects/edge.rs +++ b/crates/fj-kernel/src/partial/objects/edge.rs @@ -293,7 +293,9 @@ impl PartialHalfEdge { }) .into_full(objects)?; - Ok(HalfEdge::new(vertices, global_form, objects)) + Ok(objects + .half_edges + .insert(HalfEdge::new(vertices, global_form))) } } diff --git a/crates/fj-kernel/src/validate/mod.rs b/crates/fj-kernel/src/validate/mod.rs index 803c51d27..3ac3ff8ed 100644 --- a/crates/fj-kernel/src/validate/mod.rs +++ b/crates/fj-kernel/src/validate/mod.rs @@ -255,7 +255,9 @@ mod tests { let global_edge = GlobalEdge::partial() .from_curve_and_vertices(&curve, &vertices) .build(&objects)?; - let half_edge = HalfEdge::new(vertices, global_edge, &objects); + let half_edge = objects + .half_edges + .insert(HalfEdge::new(vertices, global_edge)); let result = half_edge.clone().validate_with_config(&ValidationConfig { From 520cc134ee5ebc25538d4b3a0eb5be8998569010 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:29:24 +0200 Subject: [PATCH 09/12] Simplify `Solid::new` --- crates/fj-kernel/src/builder/solid.rs | 2 +- crates/fj-kernel/src/objects/solid.rs | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/crates/fj-kernel/src/builder/solid.rs b/crates/fj-kernel/src/builder/solid.rs index 5aee4e33a..2eb9b7172 100644 --- a/crates/fj-kernel/src/builder/solid.rs +++ b/crates/fj-kernel/src/builder/solid.rs @@ -42,6 +42,6 @@ impl<'a> SolidBuilder<'a> { /// Build the [`Solid`] pub fn build(self) -> Handle { - Solid::new(self.shells, self.objects) + self.objects.solids.insert(Solid::new(self.shells)) } } diff --git a/crates/fj-kernel/src/objects/solid.rs b/crates/fj-kernel/src/objects/solid.rs index 51221a0ac..84286d9ab 100644 --- a/crates/fj-kernel/src/objects/solid.rs +++ b/crates/fj-kernel/src/objects/solid.rs @@ -25,13 +25,10 @@ impl Solid { } /// Construct an empty instance of `Solid` - pub fn new( - shells: impl IntoIterator>, - objects: &Objects, - ) -> Handle { - objects.solids.insert(Self { + pub fn new(shells: impl IntoIterator>) -> Self { + Self { shells: shells.into_iter().collect(), - }) + } } /// Access the solid's shells From 16406acfefeeb69ed118745e8f6b2a2f8a11051e Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:30:11 +0200 Subject: [PATCH 10/12] Simplify `Sketch::new` --- crates/fj-kernel/src/builder/sketch.rs | 2 +- crates/fj-kernel/src/objects/sketch.rs | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/crates/fj-kernel/src/builder/sketch.rs b/crates/fj-kernel/src/builder/sketch.rs index 6a66a5216..1a4a2f1b0 100644 --- a/crates/fj-kernel/src/builder/sketch.rs +++ b/crates/fj-kernel/src/builder/sketch.rs @@ -53,6 +53,6 @@ impl<'a> SketchBuilder<'a> { /// Build the [`Sketch`] pub fn build(self) -> Handle { - Sketch::new(self.faces, self.objects) + self.objects.sketches.insert(Sketch::new(self.faces)) } } diff --git a/crates/fj-kernel/src/objects/sketch.rs b/crates/fj-kernel/src/objects/sketch.rs index 1e8659e18..5c5e001ba 100644 --- a/crates/fj-kernel/src/objects/sketch.rs +++ b/crates/fj-kernel/src/objects/sketch.rs @@ -24,13 +24,10 @@ impl Sketch { } /// Construct an empty instance of `Sketch` - pub fn new( - faces: impl IntoIterator>, - objects: &Objects, - ) -> Handle { - objects.sketches.insert(Self { + pub fn new(faces: impl IntoIterator>) -> Self { + Self { faces: faces.into_iter().collect(), - }) + } } /// Access the sketch's faces From ffd3810289ac50b5ae959444313a90191d3f5b76 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:43:56 +0200 Subject: [PATCH 11/12] Simplify `Shell::new` --- crates/fj-kernel/src/builder/shell.rs | 2 +- crates/fj-kernel/src/objects/shell.rs | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/crates/fj-kernel/src/builder/shell.rs b/crates/fj-kernel/src/builder/shell.rs index 6833efa65..dd3160404 100644 --- a/crates/fj-kernel/src/builder/shell.rs +++ b/crates/fj-kernel/src/builder/shell.rs @@ -273,6 +273,6 @@ impl<'a> ShellBuilder<'a> { /// Build the [`Shell`] pub fn build(self) -> Handle { - Shell::new(self.faces, self.objects) + self.objects.shells.insert(Shell::new(self.faces)) } } diff --git a/crates/fj-kernel/src/objects/shell.rs b/crates/fj-kernel/src/objects/shell.rs index d10c2f3fb..673661e32 100644 --- a/crates/fj-kernel/src/objects/shell.rs +++ b/crates/fj-kernel/src/objects/shell.rs @@ -23,13 +23,10 @@ impl Shell { } /// Construct an empty instance of `Shell` - pub fn new( - faces: impl IntoIterator>, - objects: &Objects, - ) -> Handle { - objects.shells.insert(Self { + pub fn new(faces: impl IntoIterator>) -> Self { + Self { faces: faces.into_iter().collect(), - }) + } } /// Access the shell's faces From ba13c5d8dce54cbb00fd0e297f2e840b8e9377d0 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Oct 2022 11:44:55 +0200 Subject: [PATCH 12/12] Simplify `Face::new` --- crates/fj-kernel/src/builder/face.rs | 4 +++- crates/fj-kernel/src/objects/face.rs | 7 +++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/fj-kernel/src/builder/face.rs b/crates/fj-kernel/src/builder/face.rs index c4261ef4a..f04e01959 100644 --- a/crates/fj-kernel/src/builder/face.rs +++ b/crates/fj-kernel/src/builder/face.rs @@ -97,6 +97,8 @@ impl<'a> FaceBuilder<'a> { .expect("Can't build `Face` without exterior cycle"); let color = self.color.unwrap_or_default(); - Face::new(exterior, self.interiors, color, self.objects) + self.objects + .faces + .insert(Face::new(exterior, self.interiors, color)) } } diff --git a/crates/fj-kernel/src/objects/face.rs b/crates/fj-kernel/src/objects/face.rs index cb60b2b27..ed6d68ae0 100644 --- a/crates/fj-kernel/src/objects/face.rs +++ b/crates/fj-kernel/src/objects/face.rs @@ -63,8 +63,7 @@ impl Face { exterior: Handle, the_interiors: impl IntoIterator>, color: Color, - objects: &Objects, - ) -> Handle { + ) -> Self { let surface = exterior.surface().clone(); let mut interiors = Vec::new(); @@ -83,12 +82,12 @@ impl Face { interiors.push(interior); } - objects.faces.insert(Self { + Self { surface, exterior, interiors, color, - }) + } } /// Access this face's surface