我有以下可用代码,但不是很DRY:
impl<'a, G, E, N, EW, NW, ER, NOW, EOW> Overlay<'a, G, E, N, EW, NW, ER, NOW, EOW>
where
&'a G: GraphBase<EdgeId = E, NodeId = N> +
Data<EdgeWeight = EW, NodeWeight = NW> +
DataMap,
ER: EdgeRef<Weight = EW, EdgeId = E, NodeId = N>,
E: Copy + Eq + Hash,
N: Copy + Eq + Hash,
{
fn overlayed_elements(&'a self) -> OverlayedItems<'a, G, E, N, EW, NW, ER, NOW, EOW>{
OverlayedItems{
overlay: self,
phase: Phase::Nodes(self.nodes.iter()),
node_indexes: HashMap::new(),
}
}
pub fn overlay_edge<'b>(&'b mut self, edge: ER, eow: EOW) {
self.edges.insert(edge.id(), eow);
self.edge_refs.insert(edge.id(), edge);
}
pub fn overlay_node<'b>(&'b mut self, node: N, now: NOW) {
self.nodes.insert(node, now);
}
fn remove_edge<'b>(&'b mut self, edge: E) {
self.edges.remove(&edge);
self.edge_refs.remove(&edge);
}
fn remove_node<'b>(&'b mut self, node: N) {
self.nodes.remove(&node);
}
}
我有很多重复的
<'a, G, E, N, EW, NW, ER, NOW, EOW>
,通常似乎所有这些特性都占用了很多空间。这只是糟糕的代码,还是我做错了什么?
GraphBase
特征中的EdgeId
和NodeId
)并不总是需要指定。看看是否可以从实现中删除E
,N
,EW
和NW
。我没有测试过,但您应该能够通过编写G::EdgeId
等来使用这些类型。 - Aloso