Skip to content

Commit fc4b479

Browse files
committed
possible solution to our naming issue
1 parent d343544 commit fc4b479

File tree

1 file changed

+34
-36
lines changed

1 file changed

+34
-36
lines changed

src/edge_differences.rs

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use crate::edge_differences::private::EdgeDifferenceIteration;
21
use crate::EdgeId;
32
use crate::NodeId;
43
use crate::Position;
@@ -106,6 +105,7 @@ impl<'ts> EdgeDifferencesIterator<'ts> {
106105
}
107106
}
108107

108+
#[derive(Clone)]
109109
pub struct CurrentTreeEdgeDifferences<'ts> {
110110
edges_left: &'ts [Position],
111111
edges_right: &'ts [Position],
@@ -119,27 +119,41 @@ pub struct CurrentTreeEdgeDifferences<'ts> {
119119
right: f64,
120120
}
121121

122-
pub struct X<'ts, T: EdgeDifferenceIteration> {
123-
edges_left: &'ts [Position],
124-
edges_right: &'ts [Position],
125-
edges_parent: &'ts [NodeId],
126-
edges_child: &'ts [NodeId],
127-
order: &'ts [EdgeId],
128-
range: (usize, usize),
129-
marker: std::marker::PhantomData<T>,
122+
#[repr(transparent)]
123+
pub struct EdgeRemovalsIterator<'ts>(CurrentTreeEdgeDifferences<'ts>);
124+
125+
#[repr(transparent)]
126+
pub struct EdgeInsertionsIterator<'ts>(CurrentTreeEdgeDifferences<'ts>);
127+
128+
impl<'ts> Iterator for EdgeRemovalsIterator<'ts> {
129+
type Item = EdgeDifference<Removal>;
130+
fn next(&mut self) -> Option<Self::Item> {
131+
if self.0.removals.0 < self.0.removals.1 {
132+
let index = self.0.removals.0;
133+
self.0.removals.0 += 1;
134+
Some(Self::Item::new(
135+
self.0.edges_left[self.0.removal_order[index].as_usize()],
136+
self.0.edges_right[self.0.removal_order[index].as_usize()],
137+
self.0.edges_parent[self.0.removal_order[index].as_usize()],
138+
self.0.edges_child[self.0.removal_order[index].as_usize()],
139+
))
140+
} else {
141+
None
142+
}
143+
}
130144
}
131145

132-
impl<'ts, T: EdgeDifferenceIteration> Iterator for X<'ts, T> {
133-
type Item = EdgeDifference<T>;
146+
impl<'ts> Iterator for EdgeInsertionsIterator<'ts> {
147+
type Item = EdgeDifference<Insertion>;
134148
fn next(&mut self) -> Option<Self::Item> {
135-
if self.range.0 < self.range.1 {
136-
let index = self.range.0;
137-
self.range.0 += 1;
149+
if self.0.insertions.0 < self.0.insertions.1 {
150+
let index = self.0.insertions.0;
151+
self.0.insertions.0 += 1;
138152
Some(Self::Item::new(
139-
self.edges_left[self.order[index].as_usize()],
140-
self.edges_right[self.order[index].as_usize()],
141-
self.edges_parent[self.order[index].as_usize()],
142-
self.edges_child[self.order[index].as_usize()],
153+
self.0.edges_left[self.0.insertion_order[index].as_usize()],
154+
self.0.edges_right[self.0.insertion_order[index].as_usize()],
155+
self.0.edges_parent[self.0.insertion_order[index].as_usize()],
156+
self.0.edges_child[self.0.insertion_order[index].as_usize()],
143157
))
144158
} else {
145159
None
@@ -149,27 +163,11 @@ impl<'ts, T: EdgeDifferenceIteration> Iterator for X<'ts, T> {
149163

150164
impl<'ts> CurrentTreeEdgeDifferences<'ts> {
151165
pub fn removals(&self) -> impl Iterator<Item = EdgeRemoval> + '_ {
152-
X {
153-
edges_left: self.edges_left,
154-
edges_right: self.edges_right,
155-
edges_parent: self.edges_parent,
156-
edges_child: self.edges_child,
157-
order: self.removal_order,
158-
range: self.removals,
159-
marker: std::marker::PhantomData::<Removal> {},
160-
}
166+
EdgeRemovalsIterator(self.clone())
161167
}
162168

163169
pub fn insertions(&self) -> impl Iterator<Item = EdgeInsertion> + '_ {
164-
X {
165-
edges_left: self.edges_left,
166-
edges_right: self.edges_right,
167-
edges_parent: self.edges_parent,
168-
edges_child: self.edges_child,
169-
order: self.insertion_order,
170-
range: self.insertions,
171-
marker: std::marker::PhantomData::<Insertion> {},
172-
}
170+
EdgeInsertionsIterator(self.clone())
173171
}
174172

175173
pub fn interval(&self) -> (Position, Position) {

0 commit comments

Comments
 (0)