diff --git a/src/band.rs b/src/band.rs index a8eb71c..2e4dffd 100644 --- a/src/band.rs +++ b/src/band.rs @@ -1,11 +1,11 @@ use crate::{ connectivity::{BandIndex, BandWeight, ConnectivityWeight, GetNet}, - geometry::{ + graph::GetNodeIndex, + layout::Layout, + layout::{ dot::{DotIndex, FixedDotIndex}, geometry::{GeometryIndex, MakePrimitive}, }, - graph::GetNodeIndex, - layout::Layout, loose::{GetNextLoose, LooseIndex}, primitive::{GetEnds, GetOtherEnd, MakeShape}, shape::ShapeTrait, diff --git a/src/connectivity.rs b/src/connectivity.rs index ce932dc..d21a1b9 100644 --- a/src/connectivity.rs +++ b/src/connectivity.rs @@ -1,7 +1,7 @@ use enum_dispatch::enum_dispatch; use petgraph::stable_graph::StableDiGraph; -use crate::{geometry::dot::FixedDotIndex, graph::GenericIndex}; +use crate::{graph::GenericIndex, layout::dot::FixedDotIndex}; #[enum_dispatch] pub trait GetNet { diff --git a/src/draw.rs b/src/draw.rs index a966e10..13f3b29 100644 --- a/src/draw.rs +++ b/src/draw.rs @@ -3,13 +3,13 @@ use geo::{EuclideanLength, Point}; use thiserror::Error; use crate::{ - geometry::{ + guide::{Guide, Head, HeadTrait, SegbendHead}, + layout::{ bend::{BendIndex, LooseBendWeight}, dot::{DotIndex, FixedDotIndex, LooseDotIndex, LooseDotWeight}, geometry::{GetBandIndex, MakePrimitive}, seg::{LoneLooseSegWeight, SeqLooseSegWeight}, }, - guide::{Guide, Head, HeadTrait, SegbendHead}, layout::{Infringement, Layout, LayoutException}, math::{Circle, NoTangents}, primitive::GetOtherEnd, diff --git a/src/geometry/mod.rs b/src/geometry/mod.rs deleted file mode 100644 index c23e091..0000000 --- a/src/geometry/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -#[macro_use] -pub mod geometry; -pub mod bend; -pub mod dot; -pub mod seg; diff --git a/src/graph.rs b/src/graph.rs index 52928b3..9fb264f 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -8,7 +8,7 @@ use petgraph::stable_graph::NodeIndex; // Due to apparent limitations of enum_dispatch we're forced to import some types backwards. -use crate::geometry::{bend::BendIndex, dot::DotIndex, geometry::GeometryIndex, seg::SegIndex}; +use crate::layout::{bend::BendIndex, dot::DotIndex, geometry::GeometryIndex, seg::SegIndex}; #[enum_dispatch] pub trait GetNodeIndex { diff --git a/src/guide.rs b/src/guide.rs index 20629bf..1cd8584 100644 --- a/src/guide.rs +++ b/src/guide.rs @@ -3,12 +3,12 @@ use geo::Line; use crate::{ connectivity::BandIndex, - geometry::{ + layout::Layout, + layout::{ bend::BendIndex, dot::{DotIndex, FixedDotIndex, LooseDotIndex}, geometry::{GetBandIndex, MakePrimitive}, }, - layout::Layout, math::{self, Circle, NoTangents}, primitive::{GetCore, GetInnerOuter, GetOtherEnd, GetWeight, MakeShape}, rules::{Conditions, Rules}, diff --git a/src/layout.rs b/src/layout.rs index 7e81e13..6aacf83 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -1,3 +1,9 @@ +#[macro_use] +pub mod geometry; +pub mod bend; +pub mod dot; +pub mod seg; + use contracts::{debug_ensures, debug_invariant}; use enum_dispatch::enum_dispatch; use geo::Point; @@ -13,22 +19,20 @@ use crate::connectivity::{ BandIndex, BandWeight, ComponentIndex, ComponentWeight, ConnectivityGraph, ConnectivityLabel, ConnectivityWeight, GetNet, }; -use crate::geometry::geometry::Geometry; -use crate::geometry::seg::SeqLooseSegWeight; -use crate::geometry::{ - bend::{BendWeight, FixedBendIndex, LooseBendIndex, LooseBendWeight}, - dot::{DotIndex, DotWeight, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, +use crate::graph::{GenericIndex, GetNodeIndex}; +use crate::guide::Guide; +use crate::layout::bend::BendIndex; +use crate::layout::geometry::{BendWeight, DotWeight, Geometry, SegWeight}; +use crate::layout::seg::{SegIndex, SeqLooseSegWeight}; +use crate::layout::{ + bend::{FixedBendIndex, LooseBendIndex, LooseBendWeight}, + dot::{DotIndex, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, geometry::{ GeometryGraph, GeometryIndex, GeometryLabel, GeometryWeight, GetComponentIndex, MakePrimitive, Retag, }, - seg::{ - FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SegWeight, - SeqLooseSegIndex, - }, + seg::{FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SeqLooseSegIndex}, }; -use crate::graph::{GenericIndex, GetNodeIndex}; -use crate::guide::Guide; use crate::loose::{GetNextLoose, Loose, LooseIndex}; use crate::math::NoTangents; use crate::primitive::{ @@ -71,7 +75,7 @@ pub struct AlreadyConnected(pub i64, pub GeometryIndex); pub struct Layout { rtree: RTree, connectivity: ConnectivityGraph, - geometry: Geometry, + geometry: Geometry, } #[debug_invariant(self.geometry.graph().node_count() == self.rtree.size())] @@ -246,7 +250,7 @@ impl Layout { to: FixedDotIndex, weight: FixedSegWeight, ) -> Result { - self.add_seg_infringably(from, to, weight, &[]) + self.add_seg_infringably(from.into(), to.into(), weight, &[]) } #[debug_ensures(ret.is_ok() -> self.geometry.graph().node_count() == old(self.geometry.graph().node_count() + 4))] @@ -518,7 +522,7 @@ impl Layout { ) -> Result { let seg_to = self.add_dot_infringably(dot_weight, infringables)?; let seg = self - .add_seg_infringably(from, seg_to, seg_weight, infringables) + .add_seg_infringably(from, seg_to.into(), seg_weight, infringables) .map_err(|err| { self.remove(seg_to.into()); err @@ -557,7 +561,7 @@ impl Layout { to: FixedDotIndex, weight: LoneLooseSegWeight, ) -> Result { - let seg = self.add_seg_infringably(from, to, weight, &[])?; + let seg = self.add_seg_infringably(from.into(), to.into(), weight, &[])?; self.connectivity.update_edge( self.primitive(from).component().node_index(), @@ -583,7 +587,7 @@ impl Layout { to: LooseDotIndex, weight: SeqLooseSegWeight, ) -> Result { - let seg = self.add_seg_infringably(from, to, weight, &[])?; + let seg = self.add_seg_infringably(from, to.into(), weight, &[])?; if let DotIndex::Fixed(dot) = from { self.connectivity.update_edge( @@ -602,8 +606,8 @@ impl Layout { #[debug_ensures(ret.is_err() -> self.geometry.graph().edge_count() == old(self.geometry.graph().edge_count()))] fn add_seg_infringably( &mut self, - from: impl GetNodeIndex, - to: impl GetNodeIndex, + from: DotIndex, + to: DotIndex, weight: W, infringables: &[GeometryIndex], ) -> Result, Infringement> @@ -662,7 +666,7 @@ impl Layout { match around { WraparoundableIndex::FixedDot(core) => self - .add_core_bend_infringably(from, to, core, weight, infringables) + .add_core_bend_infringably(from.into(), to.into(), core, weight, infringables) .map_err(Into::into), WraparoundableIndex::FixedBend(around) => self .add_outer_bend_infringably(from, to, around, weight, infringables) @@ -679,8 +683,8 @@ impl Layout { #[debug_ensures(ret.is_err() -> self.geometry.graph().edge_count() == old(self.geometry.graph().edge_count()))] fn add_core_bend_infringably( &mut self, - from: impl GetNodeIndex, - to: impl GetNodeIndex, + from: DotIndex, + to: DotIndex, core: FixedDotIndex, weight: W, infringables: &[GeometryIndex], @@ -688,7 +692,7 @@ impl Layout { where GenericIndex: Into + Copy, { - let bend = self.geometry.add_bend(from, to, core, weight); + let bend = self.geometry.add_bend(from, to, core.into(), weight); self.insert_into_rtree(bend.into()); self.fail_and_remove_if_infringes_except(bend.into(), infringables)?; @@ -701,8 +705,8 @@ impl Layout { #[debug_ensures(ret.is_err() -> self.geometry.graph().edge_count() == old(self.geometry.graph().edge_count()))] fn add_outer_bend_infringably( &mut self, - from: impl GetNodeIndex, - to: impl GetNodeIndex, + from: LooseDotIndex, + to: LooseDotIndex, inner: impl GetNodeIndex, weight: W, infringables: &[GeometryIndex], @@ -733,7 +737,9 @@ impl Layout { .first() .unwrap(); - let bend = self.geometry.add_bend(from, to, core, weight); + let bend = self + .geometry + .add_bend(from.into(), to.into(), core.into(), weight); self.geometry.graph.update_edge( inner.node_index(), @@ -947,7 +953,7 @@ impl Layout { #[debug_ensures(self.geometry.graph().node_count() == old(self.geometry.graph().node_count()))] #[debug_ensures(self.geometry.graph().edge_count() == old(self.geometry.graph().edge_count()))] - pub fn geometry(&self) -> &Geometry { + pub fn geometry(&self) -> &Geometry { &self.geometry } diff --git a/src/geometry/bend.rs b/src/layout/bend.rs similarity index 86% rename from src/geometry/bend.rs rename to src/layout/bend.rs index 750cc24..26ac986 100644 --- a/src/geometry/bend.rs +++ b/src/layout/bend.rs @@ -3,13 +3,13 @@ use enum_dispatch::enum_dispatch; use crate::{ connectivity::{BandIndex, ComponentIndex}, graph::GenericIndex, - layout::Layout, + layout::{GetNodeIndex, Layout}, primitive::{GenericPrimitive, Primitive}, }; use super::geometry::{ - GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, GetComponentIndexMut, - GetOffset, GetWidth, MakePrimitive, Retag, + BendWeight, GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, + GetComponentIndexMut, GetOffset, GetWidth, MakePrimitive, Retag, }; use petgraph::stable_graph::NodeIndex; @@ -29,8 +29,6 @@ impl From for GeometryIndex { } } -pub trait BendWeight: Into + Copy {} - #[derive(Debug, Clone, Copy, PartialEq)] pub struct FixedBendWeight { pub component: ComponentIndex, diff --git a/src/geometry/dot.rs b/src/layout/dot.rs similarity index 86% rename from src/geometry/dot.rs rename to src/layout/dot.rs index 019b73a..4841198 100644 --- a/src/geometry/dot.rs +++ b/src/layout/dot.rs @@ -3,14 +3,14 @@ use enum_dispatch::enum_dispatch; use crate::{ connectivity::{BandIndex, ComponentIndex}, graph::GenericIndex, - layout::Layout, + layout::{GetNodeIndex, Layout}, math::Circle, primitive::{GenericPrimitive, Primitive}, }; use super::geometry::{ - GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, GetComponentIndexMut, GetWidth, - MakePrimitive, Retag, + DotWeight, GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, + GetComponentIndexMut, GetWidth, MakePrimitive, Retag, }; use petgraph::stable_graph::NodeIndex; @@ -30,8 +30,6 @@ impl From for GeometryIndex { } } -pub trait DotWeight: GetWidth + Into + Copy {} - #[derive(Debug, Clone, Copy, PartialEq)] pub struct FixedDotWeight { pub component: ComponentIndex, diff --git a/src/geometry/geometry.rs b/src/layout/geometry.rs similarity index 82% rename from src/geometry/geometry.rs rename to src/layout/geometry.rs index 1443e0e..8d8b588 100644 --- a/src/geometry/geometry.rs +++ b/src/layout/geometry.rs @@ -1,3 +1,5 @@ +use std::marker::PhantomData; + use contracts::debug_invariant; use enum_dispatch::enum_dispatch; use geo::Point; @@ -11,11 +13,11 @@ use crate::{ }; use super::{ - bend::{BendWeight, FixedBendIndex, FixedBendWeight, LooseBendIndex, LooseBendWeight}, - dot::{DotWeight, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, + bend::{FixedBendIndex, FixedBendWeight, LooseBendIndex, LooseBendWeight}, + dot::{FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, seg::{ - FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SegWeight, - SeqLooseSegIndex, SeqLooseSegWeight, + FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SeqLooseSegIndex, + SeqLooseSegWeight, }, }; @@ -132,15 +134,25 @@ pub trait MakePrimitive { fn primitive<'a>(&self, layout: &'a Layout) -> Primitive<'a>; } +pub trait DotWeight: GetWidth + Into + Copy {} +pub trait SegWeight: Into + Copy {} +pub trait BendWeight: Into + Copy {} + #[derive(Debug)] -pub struct Geometry { +pub struct Geometry { pub graph: GeometryGraph, + dot_index_marker: PhantomData, + seg_index_marker: PhantomData, + bend_index_marker: PhantomData, } -impl Geometry { +impl Geometry { pub fn new() -> Self { Self { graph: StableDiGraph::default(), + dot_index_marker: PhantomData, + seg_index_marker: PhantomData, + bend_index_marker: PhantomData, } } @@ -148,12 +160,7 @@ impl Geometry { GenericIndex::::new(self.graph.add_node(weight.into())) } - pub fn add_seg( - &mut self, - from: impl GetNodeIndex, - to: impl GetNodeIndex, - weight: W, - ) -> GenericIndex { + pub fn add_seg(&mut self, from: DI, to: DI, weight: W) -> GenericIndex { let seg = GenericIndex::::new(self.graph.add_node(weight.into())); self.graph @@ -166,9 +173,9 @@ impl Geometry { pub fn add_bend( &mut self, - from: impl GetNodeIndex, - to: impl GetNodeIndex, - core: impl GetNodeIndex, + from: DI, + to: DI, + core: DI, weight: W, ) -> GenericIndex { let bend = GenericIndex::::new(self.graph.add_node(weight.into())); diff --git a/src/geometry/seg.rs b/src/layout/seg.rs similarity index 94% rename from src/geometry/seg.rs rename to src/layout/seg.rs index f2271ab..dd14d22 100644 --- a/src/geometry/seg.rs +++ b/src/layout/seg.rs @@ -3,13 +3,13 @@ use enum_dispatch::enum_dispatch; use crate::{ connectivity::{BandIndex, ComponentIndex}, graph::GenericIndex, - layout::Layout, + layout::{GetNodeIndex, Layout}, primitive::{GenericPrimitive, Primitive}, }; use super::geometry::{ GeometryIndex, GeometryWeight, GetBandIndex, GetComponentIndex, GetComponentIndexMut, GetWidth, - MakePrimitive, Retag, + MakePrimitive, Retag, SegWeight, }; use petgraph::stable_graph::NodeIndex; @@ -31,8 +31,6 @@ impl From for GeometryIndex { } } -pub trait SegWeight: Into + Copy {} - #[derive(Debug, Clone, Copy, PartialEq)] pub struct FixedSegWeight { pub component: ComponentIndex, diff --git a/src/loose.rs b/src/loose.rs index 7af55a3..7f958a1 100644 --- a/src/loose.rs +++ b/src/loose.rs @@ -2,14 +2,14 @@ use enum_dispatch::enum_dispatch; use petgraph::stable_graph::NodeIndex; use crate::{ - geometry::{ + graph::GetNodeIndex, + layout::Layout, + layout::{ bend::LooseBendIndex, dot::{DotIndex, LooseDotIndex}, geometry::{GeometryIndex, MakePrimitive}, seg::{LoneLooseSegIndex, SeqLooseSegIndex}, }, - graph::GetNodeIndex, - layout::Layout, primitive::{GetEnds, LoneLooseSeg, LooseBend, LooseDot, Primitive, SeqLooseSeg}, }; diff --git a/src/main.rs b/src/main.rs index 05b66e0..5b940eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,6 @@ mod astar; mod band; mod connectivity; mod draw; -mod geometry; mod graph; mod guide; mod layout; @@ -31,9 +30,9 @@ mod wraparoundable; use connectivity::BandIndex; use draw::DrawException; use geo::point; -use geometry::dot::FixedDotWeight; -use geometry::geometry::{GeometryIndex, MakePrimitive}; -use geometry::seg::FixedSegWeight; +use layout::dot::FixedDotWeight; +use layout::geometry::{GeometryIndex, MakePrimitive}; +use layout::seg::FixedSegWeight; use layout::{Infringement, Layout, LayoutException}; use mesh::{Mesh, MeshEdgeReference, VertexIndex}; use petgraph::visit::{EdgeRef, IntoEdgeReferences}; diff --git a/src/mesh.rs b/src/mesh.rs index 0309db3..6297ed7 100644 --- a/src/mesh.rs +++ b/src/mesh.rs @@ -10,13 +10,13 @@ use spade::{HasPosition, InsertionError, Point2}; use crate::primitive::{GetCore, Primitive}; use crate::triangulation::TriangulationEdgeReference; use crate::{ - geometry::{ + graph::GetNodeIndex, + layout::Layout, + layout::{ bend::{FixedBendIndex, LooseBendIndex}, dot::FixedDotIndex, geometry::{GeometryIndex, MakePrimitive}, }, - graph::GetNodeIndex, - layout::Layout, primitive::MakeShape, shape::ShapeTrait, triangulation::{GetVertexIndex, Triangulation}, diff --git a/src/primitive.rs b/src/primitive.rs index ca169f4..c7499d3 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -5,11 +5,13 @@ use petgraph::stable_graph::NodeIndex; use petgraph::Direction::{Incoming, Outgoing}; use crate::connectivity::{BandIndex, ComponentIndex, GetNet}; -use crate::geometry::seg::{ +use crate::graph::{GenericIndex, GetNodeIndex}; +use crate::layout::seg::{ FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SegIndex, SeqLooseSegIndex, SeqLooseSegWeight, }; -use crate::geometry::{ +use crate::layout::Layout; +use crate::layout::{ bend::{BendIndex, FixedBendIndex, FixedBendWeight, LooseBendIndex, LooseBendWeight}, dot::{DotIndex, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, geometry::{ @@ -17,8 +19,6 @@ use crate::geometry::{ GetWidth, MakePrimitive, Retag, }, }; -use crate::graph::{GenericIndex, GetNodeIndex}; -use crate::layout::Layout; use crate::loose::{Loose, LooseIndex}; use crate::math::{self, Circle}; use crate::shape::{BendShape, DotShape, SegShape, Shape, ShapeTrait}; diff --git a/src/router.rs b/src/router.rs index 87c47c5..1579893 100644 --- a/src/router.rs +++ b/src/router.rs @@ -7,12 +7,12 @@ use thiserror::Error; use crate::astar::{astar, AstarStrategy, PathTracker}; use crate::connectivity::BandIndex; use crate::draw::DrawException; -use crate::geometry::{ +use crate::guide::HeadTrait; +use crate::layout::Layout; +use crate::layout::{ dot::FixedDotIndex, geometry::{GeometryIndex, MakePrimitive}, }; -use crate::guide::HeadTrait; -use crate::layout::Layout; use crate::mesh::{Mesh, MeshEdgeReference, VertexIndex}; diff --git a/src/segbend.rs b/src/segbend.rs index 8482cad..843375f 100644 --- a/src/segbend.rs +++ b/src/segbend.rs @@ -1,8 +1,8 @@ use crate::{ - geometry::{ + layout::Layout, + layout::{ bend::LooseBendIndex, dot::LooseDotIndex, geometry::GeometryIndex, seg::SeqLooseSegIndex, }, - layout::Layout, primitive::{GetEnds, GetInterior, GetOtherEnd, LooseBend, LooseDot}, }; diff --git a/src/tracer.rs b/src/tracer.rs index 83c43da..dd10f72 100644 --- a/src/tracer.rs +++ b/src/tracer.rs @@ -2,9 +2,9 @@ use contracts::debug_ensures; use crate::{ draw::{Draw, DrawException}, - geometry::{bend::LooseBendIndex, dot::FixedDotIndex}, guide::{BareHead, Head, SegbendHead}, layout::Layout, + layout::{bend::LooseBendIndex, dot::FixedDotIndex}, mesh::{Mesh, VertexIndex}, rules::Rules, }; diff --git a/src/wraparoundable.rs b/src/wraparoundable.rs index 867fa43..0224463 100644 --- a/src/wraparoundable.rs +++ b/src/wraparoundable.rs @@ -2,13 +2,13 @@ use enum_dispatch::enum_dispatch; use petgraph::stable_graph::NodeIndex; use crate::{ - geometry::{ + graph::GetNodeIndex, + layout::Layout, + layout::{ bend::{BendIndex, FixedBendIndex, LooseBendIndex}, dot::FixedDotIndex, geometry::{GeometryIndex, MakePrimitive}, }, - graph::GetNodeIndex, - layout::Layout, primitive::{ FixedBend, FixedDot, GetFirstRail, GetInnerOuter, GetLayout, LooseBend, Primitive, },