From 8b1d95491d585b4fb12abf2b8ad730748d6c1043 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Tue, 30 Jan 2024 01:51:19 +0000 Subject: [PATCH] layout: move `GeometryIndex` and `GeometryWeight` to own file --- src/draw.rs | 4 +- src/guide.rs | 4 +- src/layout/band.rs | 6 +- src/layout/bend.rs | 12 ++-- src/layout/dot.rs | 11 +-- src/layout/geometry/geometry.rs | 110 +----------------------------- src/layout/graph.rs | 116 ++++++++++++++++++++++++++++++++ src/layout/layout.rs | 20 +++--- src/layout/loose.rs | 4 +- src/layout/mod.rs | 4 +- src/{ => layout}/primitive.rs | 10 +-- src/layout/seg.rs | 11 +-- src/main.rs | 6 +- src/mesh.rs | 5 +- src/router.rs | 4 +- src/segbend.rs | 11 +-- src/wraparoundable.rs | 10 +-- 17 files changed, 181 insertions(+), 167 deletions(-) create mode 100644 src/layout/graph.rs rename src/{ => layout}/primitive.rs (98%) diff --git a/src/draw.rs b/src/draw.rs index a1ed5ef..4717594 100644 --- a/src/draw.rs +++ b/src/draw.rs @@ -7,12 +7,12 @@ use crate::{ layout::{ bend::{BendIndex, LooseBendWeight}, dot::{DotIndex, FixedDotIndex, LooseDotIndex, LooseDotWeight}, - geometry::{GetBandIndex, MakePrimitive}, + graph::{GetBandIndex, MakePrimitive}, + primitive::GetOtherJoint, seg::{LoneLooseSegWeight, SeqLooseSegWeight}, }, layout::{Infringement, Layout, LayoutException}, math::{Circle, NoTangents}, - primitive::GetOtherJoint, rules::{Conditions, Rules}, wraparoundable::WraparoundableIndex, }; diff --git a/src/guide.rs b/src/guide.rs index cfe04db..ae65c11 100644 --- a/src/guide.rs +++ b/src/guide.rs @@ -7,10 +7,10 @@ use crate::{ bend::BendIndex, connectivity::BandIndex, dot::{DotIndex, FixedDotIndex, LooseDotIndex}, - geometry::{GetBandIndex, MakePrimitive}, + graph::{GetBandIndex, MakePrimitive}, + primitive::{GetCore, GetInnerOuter, GetOtherJoint, GetWeight, MakeShape}, }, math::{self, Circle, NoTangents}, - primitive::{GetCore, GetInnerOuter, GetOtherJoint, GetWeight, MakeShape}, rules::{Conditions, Rules}, segbend::Segbend, shape::{Shape, ShapeTrait}, diff --git a/src/layout/band.rs b/src/layout/band.rs index 2bd6d66..3f623cf 100644 --- a/src/layout/band.rs +++ b/src/layout/band.rs @@ -4,12 +4,12 @@ use super::{ }; use crate::{ graph::GetNodeIndex, - layout::Layout, layout::{ dot::{DotIndex, FixedDotIndex}, - geometry::{GeometryIndex, MakePrimitive}, + graph::{GeometryIndex, MakePrimitive}, + primitive::{GetJoints, GetOtherJoint, MakeShape}, + Layout, }, - primitive::{GetJoints, GetOtherJoint, MakeShape}, shape::ShapeTrait, }; diff --git a/src/layout/bend.rs b/src/layout/bend.rs index 33e2c48..75b6c48 100644 --- a/src/layout/bend.rs +++ b/src/layout/bend.rs @@ -4,14 +4,14 @@ use crate::{ graph::{GenericIndex, GetNodeIndex}, layout::{ connectivity::{BandIndex, ComponentIndex}, + geometry::{BendWeightTrait, GetOffset, GetWidth}, + graph::{ + GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, GetComponentIndexMut, + MakePrimitive, Retag, + }, + primitive::{GenericPrimitive, Primitive}, Layout, }, - primitive::{GenericPrimitive, Primitive}, -}; - -use super::geometry::{ - BendWeightTrait, GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, - GetComponentIndexMut, GetOffset, GetWidth, MakePrimitive, Retag, }; use petgraph::stable_graph::NodeIndex; diff --git a/src/layout/dot.rs b/src/layout/dot.rs index c9343f0..ff2a6d0 100644 --- a/src/layout/dot.rs +++ b/src/layout/dot.rs @@ -5,16 +5,17 @@ use crate::{ graph::{GenericIndex, GetNodeIndex}, layout::{ connectivity::{BandIndex, ComponentIndex}, + geometry::{DotWeightTrait, GetPos, GetWidth}, + graph::{ + GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, GetComponentIndexMut, + MakePrimitive, Retag, + }, + primitive::{GenericPrimitive, Primitive}, Layout, }, math::Circle, - primitive::{GenericPrimitive, Primitive}, }; -use super::geometry::{ - DotWeightTrait, GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, - GetComponentIndexMut, GetPos, GetWidth, MakePrimitive, Retag, -}; use petgraph::stable_graph::NodeIndex; #[enum_dispatch(GetNodeIndex, MakePrimitive)] diff --git a/src/layout/geometry/geometry.rs b/src/layout/geometry/geometry.rs index b09a9c7..ab811f8 100644 --- a/src/layout/geometry/geometry.rs +++ b/src/layout/geometry/geometry.rs @@ -11,41 +11,14 @@ use petgraph::{ use crate::{ graph::{GenericIndex, GetNodeIndex}, layout::{ - connectivity::{BandIndex, ComponentIndex}, - Layout, + bend::{BendWeight, FixedBendWeight, LooseBendWeight}, + dot::{DotWeight, FixedDotWeight, LooseDotWeight}, + graph::{GeometryWeight, Retag}, }, math::Circle, - primitive::Primitive, shape::{BendShape, DotShape, SegShape, Shape}, }; -use super::super::{ - bend::{FixedBendIndex, FixedBendWeight, LooseBendIndex, LooseBendWeight}, - dot::{FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, - seg::{ - FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SeqLooseSegIndex, - SeqLooseSegWeight, - }, -}; - -#[enum_dispatch] -pub trait Retag { - fn retag(&self, index: NodeIndex) -> GeometryIndex; -} - -#[enum_dispatch] -pub trait GetComponentIndex { - fn component(&self) -> ComponentIndex; -} - -pub trait GetComponentIndexMut { - fn component_mut(&mut self) -> &mut ComponentIndex; -} - -pub trait GetBandIndex { - fn band(&self) -> BandIndex; -} - #[enum_dispatch] pub trait GetPos { fn pos(&self) -> Point; @@ -61,78 +34,6 @@ pub trait GetOffset { fn offset(&self) -> f64; } -macro_rules! impl_weight { - ($weight_struct:ident, $weight_variant:ident, $index_struct:ident) => { - impl Retag for $weight_struct { - fn retag(&self, index: NodeIndex) -> GeometryIndex { - GeometryIndex::$weight_variant($index_struct::new(index)) - } - } - - pub type $index_struct = GenericIndex<$weight_struct>; - - impl MakePrimitive for $index_struct { - fn primitive<'a>(&self, layout: &'a Layout) -> Primitive<'a> { - Primitive::$weight_variant(GenericPrimitive::new(*self, layout)) - } - } - }; -} - -macro_rules! impl_fixed_weight { - ($weight_struct:ident, $weight_variant:ident, $index_struct:ident) => { - impl_weight!($weight_struct, $weight_variant, $index_struct); - - impl GetComponentIndex for $weight_struct { - fn component(&self) -> ComponentIndex { - self.component - } - } - - impl GetComponentIndexMut for $weight_struct { - fn component_mut(&mut self) -> &mut ComponentIndex { - &mut self.component - } - } - }; -} - -macro_rules! impl_loose_weight { - ($weight_struct:ident, $weight_variant:ident, $index_struct:ident) => { - impl_weight!($weight_struct, $weight_variant, $index_struct); - - impl GetBandIndex for $weight_struct { - fn band(&self) -> BandIndex { - self.band - } - } - }; -} - -#[enum_dispatch(GetNodeIndex, MakePrimitive)] -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum GeometryIndex { - FixedDot(FixedDotIndex), - LooseDot(LooseDotIndex), - FixedSeg(FixedSegIndex), - LoneLooseSeg(LoneLooseSegIndex), - SeqLooseSeg(SeqLooseSegIndex), - FixedBend(FixedBendIndex), - LooseBend(LooseBendIndex), -} - -#[enum_dispatch(GetWidth, Retag)] -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum GeometryWeight { - FixedDot(FixedDotWeight), - LooseDot(LooseDotWeight), - FixedSeg(FixedSegWeight), - LoneLooseSeg(LoneLooseSegWeight), - SeqLooseSeg(SeqLooseSegWeight), - FixedBend(FixedBendWeight), - LooseBend(LooseBendWeight), -} - #[derive(Debug, Clone, Copy, PartialEq)] pub enum GeometryLabel { Connection, @@ -140,11 +41,6 @@ pub enum GeometryLabel { Core, } -#[enum_dispatch] -pub trait MakePrimitive { - fn primitive<'a>(&self, layout: &'a Layout) -> Primitive<'a>; -} - pub trait DotWeightTrait: GetPos + GetWidth + Into + Copy {} pub trait SegWeightTrait: GetWidth + Into + Copy {} pub trait BendWeightTrait: GetOffset + GetWidth + Into + Copy {} diff --git a/src/layout/graph.rs b/src/layout/graph.rs new file mode 100644 index 0000000..9b63e70 --- /dev/null +++ b/src/layout/graph.rs @@ -0,0 +1,116 @@ +use enum_dispatch::enum_dispatch; + +use petgraph::stable_graph::NodeIndex; + +use crate::{ + graph::GetNodeIndex, + layout::{ + connectivity::{BandIndex, ComponentIndex}, + Layout, + }, +}; + +use super::{ + bend::{FixedBendIndex, FixedBendWeight, LooseBendIndex, LooseBendWeight}, + dot::{FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, + primitive::Primitive, + seg::{ + FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SeqLooseSegIndex, + SeqLooseSegWeight, + }, +}; + +#[enum_dispatch] +pub trait Retag { + fn retag(&self, index: NodeIndex) -> GeometryIndex; +} + +#[enum_dispatch] +pub trait GetComponentIndex { + fn component(&self) -> ComponentIndex; +} + +pub trait GetComponentIndexMut { + fn component_mut(&mut self) -> &mut ComponentIndex; +} + +pub trait GetBandIndex { + fn band(&self) -> BandIndex; +} + +#[enum_dispatch] +pub trait MakePrimitive { + fn primitive<'a>(&self, layout: &'a Layout) -> Primitive<'a>; +} + +macro_rules! impl_weight { + ($weight_struct:ident, $weight_variant:ident, $index_struct:ident) => { + impl Retag for $weight_struct { + fn retag(&self, index: NodeIndex) -> GeometryIndex { + GeometryIndex::$weight_variant($index_struct::new(index)) + } + } + + pub type $index_struct = GenericIndex<$weight_struct>; + + impl MakePrimitive for $index_struct { + fn primitive<'a>(&self, layout: &'a Layout) -> Primitive<'a> { + Primitive::$weight_variant(GenericPrimitive::new(*self, layout)) + } + } + }; +} + +macro_rules! impl_fixed_weight { + ($weight_struct:ident, $weight_variant:ident, $index_struct:ident) => { + impl_weight!($weight_struct, $weight_variant, $index_struct); + + impl GetComponentIndex for $weight_struct { + fn component(&self) -> ComponentIndex { + self.component + } + } + + impl GetComponentIndexMut for $weight_struct { + fn component_mut(&mut self) -> &mut ComponentIndex { + &mut self.component + } + } + }; +} + +macro_rules! impl_loose_weight { + ($weight_struct:ident, $weight_variant:ident, $index_struct:ident) => { + impl_weight!($weight_struct, $weight_variant, $index_struct); + + impl GetBandIndex for $weight_struct { + fn band(&self) -> BandIndex { + self.band + } + } + }; +} + +#[enum_dispatch(GetNodeIndex, MakePrimitive)] +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum GeometryIndex { + FixedDot(FixedDotIndex), + LooseDot(LooseDotIndex), + FixedSeg(FixedSegIndex), + LoneLooseSeg(LoneLooseSegIndex), + SeqLooseSeg(SeqLooseSegIndex), + FixedBend(FixedBendIndex), + LooseBend(LooseBendIndex), +} + +#[enum_dispatch(GetWidth, Retag)] +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum GeometryWeight { + FixedDot(FixedDotWeight), + LooseDot(LooseDotWeight), + FixedSeg(FixedSegWeight), + LoneLooseSeg(LoneLooseSegWeight), + SeqLooseSeg(SeqLooseSegWeight), + FixedBend(FixedBendWeight), + LooseBend(LooseBendWeight), +} diff --git a/src/layout/layout.rs b/src/layout/layout.rs index ab5e83a..a160661 100644 --- a/src/layout/layout.rs +++ b/src/layout/layout.rs @@ -17,21 +17,23 @@ use crate::graph::{GenericIndex, GetNodeIndex}; use crate::guide::Guide; use crate::layout::bend::BendIndex; use crate::layout::dot::DotWeight; -use crate::layout::geometry::{BendWeightTrait, DotWeightTrait, Geometry, SegWeightTrait}; -use crate::layout::seg::{SegIndex, SeqLooseSegWeight}; +use crate::layout::geometry::{ + BendWeightTrait, DotWeightTrait, Geometry, GeometryLabel, SegWeightTrait, +}; use crate::layout::{ bend::{FixedBendIndex, LooseBendIndex, LooseBendWeight}, dot::{DotIndex, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, - geometry::{ - GeometryIndex, GeometryLabel, GeometryWeight, GetComponentIndex, MakePrimitive, Retag, + graph::{GeometryIndex, GeometryWeight, GetComponentIndex, MakePrimitive, Retag}, + primitive::{ + GenericPrimitive, GetConnectable, GetCore, GetInnerOuter, GetJoints, GetLimbs, + GetOtherJoint, GetWeight, MakeShape, + }, + seg::{ + FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SegIndex, + SeqLooseSegIndex, SeqLooseSegWeight, }, - seg::{FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SeqLooseSegIndex}, }; use crate::math::NoTangents; -use crate::primitive::{ - GenericPrimitive, GetConnectable, GetCore, GetInnerOuter, GetJoints, GetLimbs, GetOtherJoint, - GetWeight, MakeShape, -}; use crate::segbend::Segbend; use crate::shape::{Shape, ShapeTrait}; use crate::wraparoundable::{GetWraparound, Wraparoundable, WraparoundableIndex}; diff --git a/src/layout/loose.rs b/src/layout/loose.rs index 6df30ba..bd8f684 100644 --- a/src/layout/loose.rs +++ b/src/layout/loose.rs @@ -7,10 +7,10 @@ use crate::{ layout::{ bend::LooseBendIndex, dot::{DotIndex, LooseDotIndex}, - geometry::{GeometryIndex, MakePrimitive}, + graph::{GeometryIndex, MakePrimitive}, + primitive::{GetJoints, LoneLooseSeg, LooseBend, LooseDot, Primitive, SeqLooseSeg}, seg::{LoneLooseSegIndex, SeqLooseSegIndex}, }, - primitive::{GetJoints, LoneLooseSeg, LooseBend, LooseDot, Primitive, SeqLooseSeg}, }; #[enum_dispatch] diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 7773882..56d2b97 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1,10 +1,12 @@ #[macro_use] -pub mod geometry; +pub mod graph; pub mod band; pub mod bend; pub mod connectivity; pub mod dot; +pub mod geometry; pub mod loose; +pub mod primitive; pub mod seg; mod layout; diff --git a/src/primitive.rs b/src/layout/primitive.rs similarity index 98% rename from src/primitive.rs rename to src/layout/primitive.rs index ffce0c8..b17dbdb 100644 --- a/src/primitive.rs +++ b/src/layout/primitive.rs @@ -9,14 +9,10 @@ use crate::layout::seg::{ }; use crate::layout::{ bend::{BendIndex, FixedBendWeight, LooseBendIndex, LooseBendWeight}, - dot::{DotIndex, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, - geometry::{ - GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, GetOffset, GetWidth, - MakePrimitive, Retag, - }, -}; -use crate::layout::{ connectivity::{BandIndex, ComponentIndex, GetNet}, + dot::{DotIndex, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, + geometry::{GetOffset, GetWidth}, + graph::{GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, MakePrimitive, Retag}, loose::{Loose, LooseIndex}, Layout, }; diff --git a/src/layout/seg.rs b/src/layout/seg.rs index bc05d88..5eccfac 100644 --- a/src/layout/seg.rs +++ b/src/layout/seg.rs @@ -4,15 +4,16 @@ use crate::{ graph::{GenericIndex, GetNodeIndex}, layout::{ connectivity::{BandIndex, ComponentIndex}, + geometry::{GetWidth, SegWeightTrait}, + graph::{ + GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, GetComponentIndexMut, + MakePrimitive, Retag, + }, + primitive::{GenericPrimitive, Primitive}, Layout, }, - primitive::{GenericPrimitive, Primitive}, }; -use super::geometry::{ - GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, GetComponentIndexMut, GetWidth, - MakePrimitive, Retag, SegWeightTrait, -}; use petgraph::stable_graph::NodeIndex; #[enum_dispatch(GetNodeIndex, MakePrimitive)] diff --git a/src/main.rs b/src/main.rs index 6789658..cd9c179 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,10 +12,10 @@ mod astar; mod draw; mod graph; mod guide; +#[macro_use] mod layout; mod math; mod mesh; -mod primitive; mod router; mod rules; mod segbend; @@ -28,12 +28,12 @@ use draw::DrawException; use geo::point; use layout::connectivity::BandIndex; use layout::dot::FixedDotWeight; -use layout::geometry::{GeometryIndex, MakePrimitive}; +use layout::graph::{GeometryIndex, MakePrimitive}; +use layout::primitive::MakeShape; use layout::seg::FixedSegWeight; use layout::{Infringement, Layout, LayoutException}; use mesh::{Mesh, MeshEdgeReference, VertexIndex}; use petgraph::visit::{EdgeRef, IntoEdgeReferences}; -use primitive::MakeShape; use router::RouterObserver; use sdl2::event::Event; diff --git a/src/mesh.rs b/src/mesh.rs index 6297ed7..0137350 100644 --- a/src/mesh.rs +++ b/src/mesh.rs @@ -7,7 +7,6 @@ use petgraph::visit::{self, NodeIndexable}; use petgraph::{stable_graph::NodeIndex, visit::EdgeRef}; use spade::{HasPosition, InsertionError, Point2}; -use crate::primitive::{GetCore, Primitive}; use crate::triangulation::TriangulationEdgeReference; use crate::{ graph::GetNodeIndex, @@ -15,9 +14,9 @@ use crate::{ layout::{ bend::{FixedBendIndex, LooseBendIndex}, dot::FixedDotIndex, - geometry::{GeometryIndex, MakePrimitive}, + graph::{GeometryIndex, MakePrimitive}, + primitive::{GetCore, MakeShape, Primitive}, }, - primitive::MakeShape, shape::ShapeTrait, triangulation::{GetVertexIndex, Triangulation}, }; diff --git a/src/router.rs b/src/router.rs index 865fb4b..370c230 100644 --- a/src/router.rs +++ b/src/router.rs @@ -11,12 +11,12 @@ use crate::layout::Layout; use crate::layout::{ connectivity::BandIndex, dot::FixedDotIndex, - geometry::{GeometryIndex, MakePrimitive}, + graph::{GeometryIndex, MakePrimitive}, + primitive::MakeShape, }; use crate::mesh::{Mesh, MeshEdgeReference, VertexIndex}; -use crate::primitive::MakeShape; use crate::rules::Rules; use crate::shape::ShapeTrait; use crate::tracer::{Trace, Tracer}; diff --git a/src/segbend.rs b/src/segbend.rs index 59e39e1..817b297 100644 --- a/src/segbend.rs +++ b/src/segbend.rs @@ -1,9 +1,10 @@ -use crate::{ - layout::Layout, - layout::{ - bend::LooseBendIndex, dot::LooseDotIndex, geometry::GeometryIndex, seg::SeqLooseSegIndex, - }, +use crate::layout::{ + bend::LooseBendIndex, + dot::LooseDotIndex, + graph::GeometryIndex, primitive::{GetInterior, GetJoints, GetOtherJoint, LooseBend, LooseDot}, + seg::SeqLooseSegIndex, + Layout, }; #[derive(Debug, Clone, Copy)] diff --git a/src/wraparoundable.rs b/src/wraparoundable.rs index 0224463..5c5bdf2 100644 --- a/src/wraparoundable.rs +++ b/src/wraparoundable.rs @@ -3,14 +3,14 @@ use petgraph::stable_graph::NodeIndex; use crate::{ graph::GetNodeIndex, - layout::Layout, layout::{ bend::{BendIndex, FixedBendIndex, LooseBendIndex}, dot::FixedDotIndex, - geometry::{GeometryIndex, MakePrimitive}, - }, - primitive::{ - FixedBend, FixedDot, GetFirstRail, GetInnerOuter, GetLayout, LooseBend, Primitive, + graph::{GeometryIndex, MakePrimitive}, + primitive::{ + FixedBend, FixedDot, GetFirstRail, GetInnerOuter, GetLayout, LooseBend, Primitive, + }, + Layout, }, };