Skip to content

Commit af0b72b

Browse files
committed
WIP using impl Iterator in graph traits instead of box<dyn Iterator>
1 parent a06a177 commit af0b72b

12 files changed

+220
-285
lines changed

src/algo/tarjan_scc.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ where
218218
);
219219
Self {
220220
dfs,
221-
unchecked: graph.all_vertices(),
221+
unchecked: Box::new(graph.all_vertices()),
222222
}
223223
}
224224
}

src/common/adjacency_list/impl_graph.rs

+75-83
Original file line numberDiff line numberDiff line change
@@ -16,122 +16,114 @@ where
1616
type Vertex = usize;
1717
type VertexWeight = Vw;
1818

19-
fn all_vertices_weighted(
20-
&self,
21-
) -> Box<dyn '_ + Iterator<Item = (Self::Vertex, &Self::VertexWeight)>>
19+
fn all_vertices_weighted(&self) -> impl Iterator<Item = (Self::Vertex, &Self::VertexWeight)>
2220
{
23-
Box::new(self.vertices.iter().enumerate().map(|(v, (w, _))| (v, w)))
21+
self.vertices.iter().enumerate().map(|(v, (w, _))| (v, w))
2422
}
2523

2624
fn edges_between<'a: 'b, 'b>(
2725
&'a self,
2826
source: impl 'b + Borrow<Self::Vertex>,
2927
sink: impl 'b + Borrow<Self::Vertex>,
30-
) -> Box<dyn 'b + Iterator<Item = &'a Self::EdgeWeight>>
28+
) -> impl 'b + Iterator<Item = &'a Self::EdgeWeight>
3129
{
3230
let source = source.borrow().clone();
3331
let sink = sink.borrow().clone();
3432

35-
Box::new(
36-
self.vertices
37-
.get(source)
38-
.into_iter()
39-
.flat_map(move |(_, edges)| {
40-
edges.iter().filter_map(move |(si, w)| {
41-
if *si == sink
42-
{
43-
Some(w)
44-
}
45-
else
46-
{
47-
None
48-
}
49-
})
33+
self.vertices
34+
.get(source)
35+
.into_iter()
36+
.flat_map(move |(_, edges)| {
37+
edges.iter().filter_map(move |(si, w)| {
38+
if *si == sink
39+
{
40+
Some(w)
41+
}
42+
else
43+
{
44+
None
45+
}
5046
})
51-
.chain(
52-
self.vertices
53-
.get(sink)
54-
.into_iter()
55-
.flat_map(move |(_, edges)| {
56-
edges.iter().filter_map(move |(si, w)| {
57-
if !Self::Directedness::directed() && *si != sink && *si == source
58-
{
59-
Some(w)
60-
}
61-
else
62-
{
63-
None
64-
}
65-
})
66-
}),
67-
),
68-
)
47+
})
48+
.chain(
49+
self.vertices
50+
.get(sink)
51+
.into_iter()
52+
.flat_map(move |(_, edges)| {
53+
edges.iter().filter_map(move |(si, w)| {
54+
if !Self::Directedness::directed() && *si != sink && *si == source
55+
{
56+
Some(w)
57+
}
58+
else
59+
{
60+
None
61+
}
62+
})
63+
}),
64+
)
6965
}
7066
}
7167

7268
impl<Vw, Ew, D> GraphMut for AdjListGraph<Vw, Ew, D>
7369
where
7470
D: Directedness,
7571
{
76-
fn all_vertices_weighted_mut<'a>(
77-
&'a mut self,
78-
) -> Box<dyn 'a + Iterator<Item = (Self::Vertex, &'a mut Self::VertexWeight)>>
72+
fn all_vertices_weighted_mut(
73+
&mut self,
74+
) -> impl '_ + Iterator<Item = (Self::Vertex, &mut Self::VertexWeight)>
7975
{
80-
Box::new(
81-
self.vertices
82-
.iter_mut()
83-
.enumerate()
84-
.map(|(v, (w, _))| (v, w)),
85-
)
76+
self.vertices
77+
.iter_mut()
78+
.enumerate()
79+
.map(|(v, (w, _))| (v, w))
8680
}
8781

8882
fn edges_between_mut<'a: 'b, 'b>(
8983
&'a mut self,
9084
source: impl 'b + Borrow<Self::Vertex>,
9185
sink: impl 'b + Borrow<Self::Vertex>,
92-
) -> Box<dyn 'b + Iterator<Item = &'a mut Self::EdgeWeight>>
86+
) -> impl 'b + Iterator<Item = &'a mut Self::EdgeWeight>
9387
{
9488
let source = source.borrow().clone();
9589
let sink = sink.borrow().clone();
9690

97-
Box::new(
98-
self.vertices
99-
.iter_mut()
100-
.enumerate()
101-
.filter_map(move |(so, (_, edges))| {
102-
if source == so
103-
{
104-
Some((false, edges))
105-
}
106-
else if !Self::Directedness::directed() && (so == sink)
107-
{
108-
Some((true, edges))
109-
}
110-
else
111-
{
112-
None
113-
}
114-
})
115-
.flat_map(|(sink_first, edges)| {
116-
edges
117-
.iter_mut()
118-
.map(move |(si, weight)| (sink_first, si, weight))
119-
})
120-
.filter_map(move |(sink_first, si, weight)| {
121-
if sink_first
122-
{
123-
if source == *si
124-
{
125-
return Some(weight);
126-
}
127-
}
128-
else if sink == *si
91+
self.vertices
92+
.iter_mut()
93+
.enumerate()
94+
.filter_map(move |(so, (_, edges))| {
95+
if source == so
96+
{
97+
Some((false, edges))
98+
}
99+
else if !Self::Directedness::directed() && (so == sink)
100+
{
101+
Some((true, edges))
102+
}
103+
else
104+
{
105+
None
106+
}
107+
})
108+
.flat_map(|(sink_first, edges)| {
109+
edges
110+
.iter_mut()
111+
.map(move |(si, weight)| (sink_first, si, weight))
112+
})
113+
.filter_map(move |(sink_first, si, weight)| {
114+
if sink_first
115+
{
116+
if source == *si
129117
{
130118
return Some(weight);
131119
}
132-
None
133-
}),
134-
)
120+
}
121+
else if sink == *si
122+
{
123+
return Some(weight);
124+
}
125+
None
126+
})
135127
}
136128
}
137129

src/core/graph.rs

+42-52
Original file line numberDiff line numberDiff line change
@@ -75,53 +75,49 @@ pub trait Graph
7575
type Directedness: Directedness;
7676

7777
/// Returns copies of all current vertex values in the graph.
78-
fn all_vertices_weighted(
79-
&self,
80-
) -> Box<dyn '_ + Iterator<Item = (Self::Vertex, &Self::VertexWeight)>>;
78+
fn all_vertices_weighted(&self) -> impl Iterator<Item = (Self::Vertex, &Self::VertexWeight)>;
8179

8280
/// Returns the weights of all edges that are sourced in v1 and sinked in
8381
/// v2. I.e. all edges where e == (v1,v2,_).
8482
///
8583
/// If the graph is undirected, returns all edges connecting the two
86-
/// vertices I.e. all edges where e == (v1,v2,_) or e == (v2,v1,_)
84+
/// vertices. I.e. all edges where e == (v1,v2,_) or e == (v2,v1,_)
8785
fn edges_between<'a: 'b, 'b>(
8886
&'a self,
8987
source: impl 'b + Borrow<Self::Vertex>,
9088
sink: impl 'b + Borrow<Self::Vertex>,
91-
) -> Box<dyn 'b + Iterator<Item = &'a Self::EdgeWeight>>;
89+
) -> impl 'b + Iterator<Item = &'a Self::EdgeWeight>;
9290

9391
// Optional methods
9492

9593
/// Returns copies of all current edges in the graph.
96-
fn all_edges<'a>(
97-
&'a self,
98-
) -> Box<dyn 'a + Iterator<Item = (Self::Vertex, Self::Vertex, &'a Self::EdgeWeight)>>
94+
fn all_edges(
95+
&self,
96+
) -> impl '_ + Iterator<Item = (Self::Vertex, Self::Vertex, &Self::EdgeWeight)>
9997
{
10098
let mut finished = Vec::new();
101-
Box::new(
102-
self.all_vertices()
103-
.flat_map(move |v| self.edges_sourced_in(v).map(move |(v2, w)| (v, v2, w)))
104-
.filter(move |(so, si, _)| {
105-
if finished.last().is_none() || finished.last().unwrap() != so
106-
{
107-
finished.push(so.clone());
108-
}
109-
110-
if !Self::Directedness::directed()
111-
{
112-
si == so || !finished.contains(&si)
113-
}
114-
else
115-
{
116-
true
117-
}
118-
}),
119-
)
99+
self.all_vertices()
100+
.flat_map(move |v| self.edges_sourced_in(v).map(move |(v2, w)| (v, v2, w)))
101+
.filter(move |(so, si, _)| {
102+
if finished.last().is_none() || finished.last().unwrap() != so
103+
{
104+
finished.push(so.clone());
105+
}
106+
107+
if !Self::Directedness::directed()
108+
{
109+
si == so || !finished.contains(&si)
110+
}
111+
else
112+
{
113+
true
114+
}
115+
})
120116
}
121117

122-
fn all_vertices<'a>(&'a self) -> Box<dyn 'a + Iterator<Item = Self::Vertex>>
118+
fn all_vertices(&self) -> impl '_ + Iterator<Item = Self::Vertex>
123119
{
124-
Box::new(self.all_vertices_weighted().map(|(v, _)| v))
120+
self.all_vertices_weighted().map(|(v, _)| v)
125121
}
126122

127123
fn vertex_weight(&self, v: impl Borrow<Self::Vertex>) -> Option<&Self::VertexWeight>
@@ -141,9 +137,9 @@ pub trait Graph
141137
iter.into_iter().all(|v| self.contains_vertex(v))
142138
}
143139

144-
fn all_vertex_weights<'a>(&'a self) -> Box<dyn 'a + Iterator<Item = &'a Self::VertexWeight>>
140+
fn all_vertex_weights(&self) -> impl '_ + Iterator<Item = &Self::VertexWeight>
145141
{
146-
Box::new(self.all_vertices_weighted().map(|(_, w)| w))
142+
self.all_vertices_weighted().map(|(_, w)| w)
147143
}
148144

149145
/// Returns the sink and weight of any edge sourced in the given vertex.
@@ -154,12 +150,12 @@ pub trait Graph
154150
fn edges_sourced_in<'a: 'b, 'b>(
155151
&'a self,
156152
v: impl 'b + Borrow<Self::Vertex>,
157-
) -> Box<dyn 'b + Iterator<Item = (Self::Vertex, &'a Self::EdgeWeight)>>
153+
) -> impl 'b + Iterator<Item = (Self::Vertex, &'a Self::EdgeWeight)>
158154
{
159-
Box::new(self.all_vertices().flat_map(move |v2| {
155+
self.all_vertices().flat_map(move |v2| {
160156
self.edges_between(v.borrow().clone(), v2.borrow().clone())
161157
.map(move |w| (v2.clone(), w))
162-
}))
158+
})
163159
}
164160

165161
/// Returns the source and weight of any edge sinked in the given vertex.
@@ -170,12 +166,12 @@ pub trait Graph
170166
fn edges_sinked_in<'a: 'b, 'b>(
171167
&'a self,
172168
v: impl 'b + Borrow<Self::Vertex>,
173-
) -> Box<dyn 'b + Iterator<Item = (Self::Vertex, &'a Self::EdgeWeight)>>
169+
) -> impl 'b + Iterator<Item = (Self::Vertex, &'a Self::EdgeWeight)>
174170
{
175-
Box::new(self.all_vertices().flat_map(move |v2| {
171+
self.all_vertices().flat_map(move |v2| {
176172
self.edges_between(v2.borrow().clone(), v.borrow().clone())
177173
.map(move |w| (v2.clone(), w))
178-
}))
174+
})
179175
}
180176

181177
/// Returns the neighboring vertex and the weight of any edge incident
@@ -185,15 +181,11 @@ pub trait Graph
185181
fn edges_incident_on<'a: 'b, 'b>(
186182
&'a self,
187183
v: impl 'b + Borrow<Self::Vertex>,
188-
) -> Box<dyn 'b + Iterator<Item = (Self::Vertex, &'a Self::EdgeWeight)>>
184+
) -> impl 'b + Iterator<Item = (Self::Vertex, &'a Self::EdgeWeight)>
189185
{
190-
Box::new(
191-
self.edges_sourced_in(v.borrow().clone()).chain(
192-
self.edges_sinked_in(v.borrow().clone())
193-
.filter(move |(v2, _)| {
194-
Self::Directedness::directed() && v.borrow() != v2.borrow()
195-
}),
196-
),
186+
self.edges_sourced_in(v.borrow().clone()).chain(
187+
self.edges_sinked_in(v.borrow().clone())
188+
.filter(move |(v2, _)| Self::Directedness::directed() && v.borrow() != v2.borrow()),
197189
)
198190
}
199191

@@ -202,12 +194,10 @@ pub trait Graph
202194
fn vertex_neighbors<'a: 'b, 'b>(
203195
&'a self,
204196
v: impl 'b + Borrow<Self::Vertex>,
205-
) -> Box<dyn 'b + Iterator<Item = Self::Vertex>>
197+
) -> impl 'b + Iterator<Item = Self::Vertex>
206198
{
207-
Box::new(
208-
self.all_vertices()
209-
.filter(move |other| self.neighbors(v.borrow(), other.borrow())),
210-
)
199+
self.all_vertices()
200+
.filter(move |other| self.neighbors(v.borrow(), other.borrow()))
211201
}
212202

213203
/// Returns whether the two vertices are connected by an edge in any
@@ -235,13 +225,13 @@ pub trait GraphMut: Graph
235225
{
236226
fn all_vertices_weighted_mut(
237227
&mut self,
238-
) -> Box<dyn '_ + Iterator<Item = (Self::Vertex, &mut Self::VertexWeight)>>;
228+
) -> impl '_ + Iterator<Item = (Self::Vertex, &mut Self::VertexWeight)>;
239229

240230
fn edges_between_mut<'a: 'b, 'b>(
241231
&'a mut self,
242232
source: impl 'b + Borrow<Self::Vertex>,
243233
sink: impl 'b + Borrow<Self::Vertex>,
244-
) -> Box<dyn 'b + Iterator<Item = &'a mut Self::EdgeWeight>>;
234+
) -> impl 'b + Iterator<Item = &'a mut Self::EdgeWeight>;
245235

246236
// Optional methods
247237

0 commit comments

Comments
 (0)