mirror of https://codeberg.org/topola/topola.git
geometry: use narrower types for returned adjacents
This commit is contained in:
parent
4c3d0062b0
commit
87705653bd
|
|
@ -30,6 +30,18 @@ impl From<BendIndex> for GeometryIndex {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TryFrom<GeometryIndex> for BendIndex {
|
||||||
|
type Error = (); // TODO.
|
||||||
|
|
||||||
|
fn try_from(index: GeometryIndex) -> Result<BendIndex, ()> {
|
||||||
|
match index {
|
||||||
|
GeometryIndex::FixedBend(index) => Ok(BendIndex::Fixed(index)),
|
||||||
|
GeometryIndex::LooseBend(index) => Ok(BendIndex::Loose(index)),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[enum_dispatch(GetOffset, GetWidth)]
|
#[enum_dispatch(GetOffset, GetWidth)]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub enum BendWeight {
|
pub enum BendWeight {
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,18 @@ impl From<DotIndex> for GeometryIndex {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TryFrom<GeometryIndex> for DotIndex {
|
||||||
|
type Error = (); // TODO.
|
||||||
|
|
||||||
|
fn try_from(index: GeometryIndex) -> Result<DotIndex, ()> {
|
||||||
|
match index {
|
||||||
|
GeometryIndex::FixedDot(index) => Ok(DotIndex::Fixed(index)),
|
||||||
|
GeometryIndex::LooseDot(index) => Ok(DotIndex::Loose(index)),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[enum_dispatch(GetPos, GetWidth)]
|
#[enum_dispatch(GetPos, GetWidth)]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub enum DotWeight {
|
pub enum DotWeight {
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ pub struct Geometry<
|
||||||
DW: DotWeightTrait<GW> + Copy,
|
DW: DotWeightTrait<GW> + Copy,
|
||||||
SW: SegWeightTrait<GW> + Copy,
|
SW: SegWeightTrait<GW> + Copy,
|
||||||
BW: BendWeightTrait<GW> + Copy,
|
BW: BendWeightTrait<GW> + Copy,
|
||||||
GI: GetNodeIndex + Copy,
|
GI: GetNodeIndex + TryInto<DI> + TryInto<SI> + TryInto<BI> + Copy,
|
||||||
DI: GetNodeIndex + Copy,
|
DI: GetNodeIndex + Copy,
|
||||||
SI: GetNodeIndex + Copy,
|
SI: GetNodeIndex + Copy,
|
||||||
BI: GetNodeIndex + Copy,
|
BI: GetNodeIndex + Copy,
|
||||||
|
|
@ -173,7 +173,7 @@ impl<
|
||||||
DW: DotWeightTrait<GW> + Copy,
|
DW: DotWeightTrait<GW> + Copy,
|
||||||
SW: SegWeightTrait<GW> + Copy,
|
SW: SegWeightTrait<GW> + Copy,
|
||||||
BW: BendWeightTrait<GW> + Copy,
|
BW: BendWeightTrait<GW> + Copy,
|
||||||
GI: GetNodeIndex + Copy,
|
GI: GetNodeIndex + TryInto<DI> + TryInto<SI> + TryInto<BI> + Copy,
|
||||||
DI: GetNodeIndex + Copy,
|
DI: GetNodeIndex + Copy,
|
||||||
SI: GetNodeIndex + Copy,
|
SI: GetNodeIndex + Copy,
|
||||||
BI: GetNodeIndex + Copy,
|
BI: GetNodeIndex + Copy,
|
||||||
|
|
@ -267,11 +267,11 @@ impl<
|
||||||
|
|
||||||
fn inner_radius(&self, bend: BI) -> f64 {
|
fn inner_radius(&self, bend: BI) -> f64 {
|
||||||
let mut r = self.bend_weight(bend).offset();
|
let mut r = self.bend_weight(bend).offset();
|
||||||
let mut rail = bend.node_index();
|
let mut rail = bend;
|
||||||
|
|
||||||
while let Some(inner) = self.inner(rail) {
|
while let Some(inner) = self.inner(rail) {
|
||||||
let weight: BW = self
|
let weight: BW = self
|
||||||
.weight(inner)
|
.bend_weight(inner)
|
||||||
.try_into()
|
.try_into()
|
||||||
.unwrap_or_else(|_| unreachable!());
|
.unwrap_or_else(|_| unreachable!());
|
||||||
r += weight.width() + weight.offset();
|
r += weight.width() + weight.offset();
|
||||||
|
|
@ -342,7 +342,7 @@ impl<
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn first_rail(&self, index: NodeIndex<usize>) -> Option<NodeIndex<usize>> {
|
pub fn first_rail(&self, index: NodeIndex<usize>) -> Option<BI> {
|
||||||
self.graph
|
self.graph
|
||||||
.neighbors_directed(index, Incoming)
|
.neighbors_directed(index, Incoming)
|
||||||
.filter(|node| {
|
.filter(|node| {
|
||||||
|
|
@ -353,48 +353,81 @@ impl<
|
||||||
GeometryLabel::Core
|
GeometryLabel::Core
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
.map(|node| {
|
||||||
|
self.graph
|
||||||
|
.node_weight(node)
|
||||||
|
.unwrap()
|
||||||
|
.retag(node)
|
||||||
|
.try_into()
|
||||||
|
.unwrap_or_else(|_| unreachable!())
|
||||||
|
})
|
||||||
.next()
|
.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn core(&self, index: NodeIndex<usize>) -> Option<NodeIndex<usize>> {
|
pub fn core(&self, bend: BI) -> DI {
|
||||||
self.graph
|
self.graph
|
||||||
.neighbors(index)
|
.neighbors(bend.node_index())
|
||||||
.filter(|node| {
|
.filter(|node| {
|
||||||
matches!(
|
matches!(
|
||||||
self.graph
|
self.graph
|
||||||
.edge_weight(self.graph.find_edge(index, *node).unwrap())
|
.edge_weight(self.graph.find_edge(bend.node_index(), *node).unwrap())
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
GeometryLabel::Core
|
GeometryLabel::Core
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
.map(|node| {
|
||||||
|
self.graph
|
||||||
|
.node_weight(node)
|
||||||
|
.unwrap()
|
||||||
|
.retag(node)
|
||||||
|
.try_into()
|
||||||
|
.unwrap_or_else(|_| unreachable!())
|
||||||
|
})
|
||||||
.next()
|
.next()
|
||||||
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn inner(&self, index: NodeIndex<usize>) -> Option<NodeIndex<usize>> {
|
pub fn inner(&self, bend: BI) -> Option<BI> {
|
||||||
self.graph
|
self.graph
|
||||||
.neighbors_directed(index, Incoming)
|
.neighbors_directed(bend.node_index(), Incoming)
|
||||||
.filter(|node| {
|
.filter(|node| {
|
||||||
matches!(
|
matches!(
|
||||||
self.graph
|
self.graph
|
||||||
.edge_weight(self.graph.find_edge(*node, index).unwrap())
|
.edge_weight(self.graph.find_edge(*node, bend.node_index()).unwrap())
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
GeometryLabel::Outer
|
GeometryLabel::Outer
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
.map(|node| {
|
||||||
|
self.graph
|
||||||
|
.node_weight(node)
|
||||||
|
.unwrap()
|
||||||
|
.retag(node)
|
||||||
|
.try_into()
|
||||||
|
.unwrap_or_else(|_| unreachable!())
|
||||||
|
})
|
||||||
.next()
|
.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn outer(&self, index: NodeIndex<usize>) -> Option<NodeIndex<usize>> {
|
pub fn outer(&self, bend: BI) -> Option<BI> {
|
||||||
self.graph
|
self.graph
|
||||||
.neighbors_directed(index, Outgoing)
|
.neighbors_directed(bend.node_index(), Outgoing)
|
||||||
.filter(|node| {
|
.filter(|node| {
|
||||||
matches!(
|
matches!(
|
||||||
self.graph
|
self.graph
|
||||||
.edge_weight(self.graph.find_edge(index, *node).unwrap())
|
.edge_weight(self.graph.find_edge(bend.node_index(), *node).unwrap())
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
GeometryLabel::Outer
|
GeometryLabel::Outer
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
.map(|node| {
|
||||||
|
self.graph
|
||||||
|
.node_weight(node)
|
||||||
|
.unwrap()
|
||||||
|
.retag(node)
|
||||||
|
.try_into()
|
||||||
|
.unwrap_or_else(|_| unreachable!())
|
||||||
|
})
|
||||||
.next()
|
.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,19 @@ impl From<SegIndex> for GeometryIndex {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TryFrom<GeometryIndex> for SegIndex {
|
||||||
|
type Error = (); // TODO.
|
||||||
|
|
||||||
|
fn try_from(index: GeometryIndex) -> Result<SegIndex, ()> {
|
||||||
|
match index {
|
||||||
|
GeometryIndex::FixedSeg(index) => Ok(SegIndex::Fixed(index)),
|
||||||
|
GeometryIndex::LoneLooseSeg(index) => Ok(SegIndex::LoneLoose(index)),
|
||||||
|
GeometryIndex::SeqLooseSeg(index) => Ok(SegIndex::SeqLoose(index)),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[enum_dispatch(GetWidth)]
|
#[enum_dispatch(GetWidth)]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub enum SegWeight {
|
pub enum SegWeight {
|
||||||
|
|
|
||||||
|
|
@ -88,33 +88,38 @@ pub trait GetFirstRail: GetLayout + GetNodeIndex {
|
||||||
self.layout()
|
self.layout()
|
||||||
.geometry()
|
.geometry()
|
||||||
.first_rail(self.node_index())
|
.first_rail(self.node_index())
|
||||||
.map(|node| LooseBendIndex::new(node))
|
.map(|node| LooseBendIndex::new(node.node_index()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait GetCore: GetLayout + GetNodeIndex {
|
pub trait GetBendIndex {
|
||||||
|
fn bend_index(&self) -> BendIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait GetCore: GetLayout + GetBendIndex {
|
||||||
fn core(&self) -> FixedDotIndex {
|
fn core(&self) -> FixedDotIndex {
|
||||||
self.layout()
|
FixedDotIndex::new(
|
||||||
.geometry()
|
self.layout()
|
||||||
.core(self.node_index())
|
.geometry()
|
||||||
.map(|node| FixedDotIndex::new(node))
|
.core(self.bend_index())
|
||||||
.unwrap()
|
.node_index(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait GetInnerOuter: GetLayout + GetNodeIndex {
|
pub trait GetInnerOuter: GetLayout + GetBendIndex {
|
||||||
fn inner(&self) -> Option<LooseBendIndex> {
|
fn inner(&self) -> Option<LooseBendIndex> {
|
||||||
self.layout()
|
self.layout()
|
||||||
.geometry()
|
.geometry()
|
||||||
.inner(self.node_index())
|
.inner(self.bend_index())
|
||||||
.map(|node| LooseBendIndex::new(node))
|
.map(|node| LooseBendIndex::new(node.node_index()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn outer(&self) -> Option<LooseBendIndex> {
|
fn outer(&self) -> Option<LooseBendIndex> {
|
||||||
self.layout()
|
self.layout()
|
||||||
.geometry()
|
.geometry()
|
||||||
.outer(self.node_index())
|
.outer(self.bend_index())
|
||||||
.map(|node| LooseBendIndex::new(node))
|
.map(|node| LooseBendIndex::new(node.node_index()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -446,6 +451,12 @@ impl<'a> GetOtherEnd<DotIndex, LooseDotIndex> for SeqLooseSeg<'a> {}
|
||||||
pub type FixedBend<'a> = GenericPrimitive<'a, FixedBendWeight>;
|
pub type FixedBend<'a> = GenericPrimitive<'a, FixedBendWeight>;
|
||||||
impl_fixed_primitive!(FixedBend, FixedBendWeight);
|
impl_fixed_primitive!(FixedBend, FixedBendWeight);
|
||||||
|
|
||||||
|
impl<'a> GetBendIndex for FixedBend<'a> {
|
||||||
|
fn bend_index(&self) -> BendIndex {
|
||||||
|
self.index.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> MakeShape for FixedBend<'a> {
|
impl<'a> MakeShape for FixedBend<'a> {
|
||||||
fn shape(&self) -> Shape {
|
fn shape(&self) -> Shape {
|
||||||
self.layout.geometry().bend_shape(self.index.into())
|
self.layout.geometry().bend_shape(self.index.into())
|
||||||
|
|
@ -469,6 +480,18 @@ impl<'a> GetCore for FixedBend<'a> {} // TODO: Fixed bends don't have cores actu
|
||||||
pub type LooseBend<'a> = GenericPrimitive<'a, LooseBendWeight>;
|
pub type LooseBend<'a> = GenericPrimitive<'a, LooseBendWeight>;
|
||||||
impl_loose_primitive!(LooseBend, LooseBendWeight);
|
impl_loose_primitive!(LooseBend, LooseBendWeight);
|
||||||
|
|
||||||
|
impl<'a> GetBendIndex for LooseBend<'a> {
|
||||||
|
fn bend_index(&self) -> BendIndex {
|
||||||
|
self.index.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> From<LooseBend<'a>> for BendIndex {
|
||||||
|
fn from(bend: LooseBend<'a>) -> BendIndex {
|
||||||
|
bend.index.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> MakeShape for LooseBend<'a> {
|
impl<'a> MakeShape for LooseBend<'a> {
|
||||||
fn shape(&self) -> Shape {
|
fn shape(&self) -> Shape {
|
||||||
self.layout.geometry().bend_shape(self.index.into())
|
self.layout.geometry().bend_shape(self.index.into())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue