@@ -12,39 +12,27 @@ struct SegmentOverlapper {
1212 right : Position ,
1313 qbeg : usize ,
1414 qend : usize ,
15- obeg : usize ,
16- oend : usize ,
15+ num_overlaps : usize ,
1716}
1817
1918impl SegmentOverlapper {
2019 fn set_partition ( & mut self ) -> Position {
2120 let mut tright = Position :: MAX ;
2221 let mut b: usize = 0 ;
2322
24- for i in 0 ..self . oend {
23+ for i in 0 ..self . num_overlaps {
2524 if self . overlapping [ i] . right > self . left {
2625 self . overlapping [ b] = self . overlapping [ i] ;
2726 tright = std:: cmp:: min ( tright, self . overlapping [ b] . right ) ;
2827 b += 1 ;
2928 }
3029 }
3130
32- self . oend = b;
31+ self . num_overlaps = b;
3332
3433 tright
3534 }
3635
37- fn num_overlaps ( & self ) -> usize {
38- assert ! (
39- self . oend - self . obeg <= self . overlapping. len( ) ,
40- "overlap details = {} {} {}" ,
41- self . oend,
42- self . obeg,
43- self . overlapping. len( )
44- ) ;
45- self . oend - self . obeg
46- }
47-
4836 // Public interface below
4937
5038 const fn new ( ) -> SegmentOverlapper {
@@ -55,17 +43,15 @@ impl SegmentOverlapper {
5543 right : Position :: MAX ,
5644 qbeg : std:: usize:: MAX ,
5745 qend : std:: usize:: MAX ,
58- obeg : std:: usize:: MAX ,
59- oend : std:: usize:: MAX ,
46+ num_overlaps : std:: usize:: MAX ,
6047 }
6148 }
6249
6350 fn init ( & mut self ) {
6451 self . qbeg = 0 ;
6552 self . qend = self . segment_queue . len ( ) - 1 ;
6653 assert ! ( self . qend < self . segment_queue. len( ) ) ;
67- self . obeg = 0 ;
68- self . oend = 0 ;
54+ self . num_overlaps = 0 ;
6955 self . overlapping . clear ( ) ;
7056 }
7157
@@ -88,24 +74,32 @@ impl SegmentOverlapper {
8874 if self . qbeg < self . qend {
8975 self . left = self . right ;
9076 let mut tright = self . set_partition ( ) ;
91- if self . num_overlaps ( ) == 0 {
77+ if self . num_overlaps == 0 {
9278 self . left = self . segment_queue [ self . qbeg ] . left ;
9379 }
94- while self . qbeg < self . qend && self . segment_queue [ self . qbeg ] . left == self . left {
95- tright = std:: cmp:: min ( tright, self . segment_queue [ self . qbeg ] . right ) ;
96- // NOTE: I wonder how efficient this is vs C++?
97- self . overlapping
98- . insert ( self . oend , self . segment_queue [ self . qbeg ] ) ;
99- self . oend += 1 ;
100- self . qbeg += 1 ;
80+ for seg in self
81+ . segment_queue
82+ . iter ( )
83+ . skip ( self . qbeg )
84+ . take ( self . qend - self . qbeg )
85+ {
86+ if seg. left == self . left {
87+ tright = std:: cmp:: min ( tright, seg. right ) ;
88+ // NOTE: I wonder how efficient this is vs C++?
89+ self . overlapping . insert ( self . num_overlaps , * seg) ;
90+ self . num_overlaps += 1 ;
91+ self . qbeg += 1 ;
92+ } else {
93+ break ;
94+ }
10195 }
10296 self . right = std:: cmp:: min ( self . segment_queue [ self . qbeg ] . left , tright) ;
10397 rv = true ;
10498 } else {
10599 self . left = self . right ;
106100 self . right = Position :: MAX ;
107101 let tright = self . set_partition ( ) ;
108- if self . num_overlaps ( ) > 0 {
102+ if self . num_overlaps > 0 {
109103 self . right = tright;
110104 rv = true
111105 }
@@ -125,10 +119,6 @@ impl SegmentOverlapper {
125119 fn clear_queue ( & mut self ) {
126120 self . segment_queue . clear ( ) ;
127121 }
128-
129- fn overlap ( & self , i : usize ) -> & Segment {
130- & self . overlapping [ i]
131- }
132122}
133123
134124type AncestryList = NestedForwardList < Segment > ;
@@ -259,8 +249,8 @@ fn merge_ancestors(
259249 state. temp_edge_buffer . clear ( ) ;
260250
261251 while state. overlapper . advance ( ) {
262- if state. overlapper . num_overlaps ( ) == 1 {
263- ancestry_node = state. overlapper . overlap ( 0 ) . node ;
252+ if state. overlapper . num_overlaps == 1 {
253+ ancestry_node = state. overlapper . overlapping [ 0 ] . node ;
264254 if is_sample {
265255 buffer_edge (
266256 state. overlapper . get_left ( ) ,
@@ -281,8 +271,12 @@ fn merge_ancestors(
281271 idmap[ parent_input_id as usize ] = output_id;
282272 }
283273 ancestry_node = output_id;
284- for i in 0 ..state. overlapper . num_overlaps ( ) as usize {
285- let o = & state. overlapper . overlap ( i) ;
274+ for o in state
275+ . overlapper
276+ . overlapping
277+ . iter ( )
278+ . take ( state. overlapper . num_overlaps )
279+ {
286280 buffer_edge (
287281 state. overlapper . get_left ( ) ,
288282 state. overlapper . get_right ( ) ,
@@ -511,7 +505,7 @@ fn find_pre_existing_edges(
511505
512506 // TODO: this could eventually be called in a debug_assert
513507 if !rv. is_empty ( ) {
514- for i in 1 ..rv . len ( ) {
508+ for ( i , _ ) in rv . iter ( ) . enumerate ( ) . skip ( 1 ) {
515509 let t0 = tables. nodes_ [ rv[ i - 1 ] . parent as usize ] . time ;
516510 let t1 = tables. nodes_ [ rv[ i] . parent as usize ] . time ;
517511 if t0 < t1 {
0 commit comments