@@ -12,39 +12,27 @@ struct SegmentOverlapper {
12
12
right : Position ,
13
13
qbeg : usize ,
14
14
qend : usize ,
15
- obeg : usize ,
16
- oend : usize ,
15
+ num_overlaps : usize ,
17
16
}
18
17
19
18
impl SegmentOverlapper {
20
19
fn set_partition ( & mut self ) -> Position {
21
20
let mut tright = Position :: MAX ;
22
21
let mut b: usize = 0 ;
23
22
24
- for i in 0 ..self . oend {
23
+ for i in 0 ..self . num_overlaps {
25
24
if self . overlapping [ i] . right > self . left {
26
25
self . overlapping [ b] = self . overlapping [ i] ;
27
26
tright = std:: cmp:: min ( tright, self . overlapping [ b] . right ) ;
28
27
b += 1 ;
29
28
}
30
29
}
31
30
32
- self . oend = b;
31
+ self . num_overlaps = b;
33
32
34
33
tright
35
34
}
36
35
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
-
48
36
// Public interface below
49
37
50
38
const fn new ( ) -> SegmentOverlapper {
@@ -55,17 +43,15 @@ impl SegmentOverlapper {
55
43
right : Position :: MAX ,
56
44
qbeg : std:: usize:: MAX ,
57
45
qend : std:: usize:: MAX ,
58
- obeg : std:: usize:: MAX ,
59
- oend : std:: usize:: MAX ,
46
+ num_overlaps : std:: usize:: MAX ,
60
47
}
61
48
}
62
49
63
50
fn init ( & mut self ) {
64
51
self . qbeg = 0 ;
65
52
self . qend = self . segment_queue . len ( ) - 1 ;
66
53
assert ! ( self . qend < self . segment_queue. len( ) ) ;
67
- self . obeg = 0 ;
68
- self . oend = 0 ;
54
+ self . num_overlaps = 0 ;
69
55
self . overlapping . clear ( ) ;
70
56
}
71
57
@@ -88,24 +74,32 @@ impl SegmentOverlapper {
88
74
if self . qbeg < self . qend {
89
75
self . left = self . right ;
90
76
let mut tright = self . set_partition ( ) ;
91
- if self . num_overlaps ( ) == 0 {
77
+ if self . num_overlaps == 0 {
92
78
self . left = self . segment_queue [ self . qbeg ] . left ;
93
79
}
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
+ }
101
95
}
102
96
self . right = std:: cmp:: min ( self . segment_queue [ self . qbeg ] . left , tright) ;
103
97
rv = true ;
104
98
} else {
105
99
self . left = self . right ;
106
100
self . right = Position :: MAX ;
107
101
let tright = self . set_partition ( ) ;
108
- if self . num_overlaps ( ) > 0 {
102
+ if self . num_overlaps > 0 {
109
103
self . right = tright;
110
104
rv = true
111
105
}
@@ -125,10 +119,6 @@ impl SegmentOverlapper {
125
119
fn clear_queue ( & mut self ) {
126
120
self . segment_queue . clear ( ) ;
127
121
}
128
-
129
- fn overlap ( & self , i : usize ) -> & Segment {
130
- & self . overlapping [ i]
131
- }
132
122
}
133
123
134
124
type AncestryList = NestedForwardList < Segment > ;
@@ -259,8 +249,8 @@ fn merge_ancestors(
259
249
state. temp_edge_buffer . clear ( ) ;
260
250
261
251
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 ;
264
254
if is_sample {
265
255
buffer_edge (
266
256
state. overlapper . get_left ( ) ,
@@ -281,8 +271,12 @@ fn merge_ancestors(
281
271
idmap[ parent_input_id as usize ] = output_id;
282
272
}
283
273
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
+ {
286
280
buffer_edge (
287
281
state. overlapper . get_left ( ) ,
288
282
state. overlapper . get_right ( ) ,
@@ -511,7 +505,7 @@ fn find_pre_existing_edges(
511
505
512
506
// TODO: this could eventually be called in a debug_assert
513
507
if !rv. is_empty ( ) {
514
- for i in 1 ..rv . len ( ) {
508
+ for ( i , _ ) in rv . iter ( ) . enumerate ( ) . skip ( 1 ) {
515
509
let t0 = tables. nodes_ [ rv[ i - 1 ] . parent as usize ] . time ;
516
510
let t1 = tables. nodes_ [ rv[ i] . parent as usize ] . time ;
517
511
if t0 < t1 {
0 commit comments