@@ -214,26 +214,51 @@ impl RecordBuffer {
214214 }
215215 }
216216
217- pub fn rid ( & self ) -> Option < u32 > {
217+ pub fn last_rid ( & self ) -> Option < u32 > {
218218 self . ringbuffer . back ( ) . map ( |var| var. rid )
219219 }
220220
221+ pub fn next_rid ( & self ) -> Option < u32 > {
222+ self . ringbuffer2 . back ( ) . map ( |var| var. rid )
223+ }
224+
225+ fn swap_buffers ( & mut self ) {
226+ // swap with buffer for next rid
227+ mem:: swap ( & mut self . ringbuffer2 , & mut self . ringbuffer ) ;
228+ // clear second buffer
229+ self . ringbuffer2 . clear ( ) ;
230+ }
231+
232+ fn drain_left ( & mut self , rid : u32 , window_start : u32 ) {
233+ // remove records too far left or from wrong rid
234+ let to_remove = self . ringbuffer . iter ( ) . take_while ( |var| var. pos < window_start || var. rid != rid) . count ( ) ;
235+ self . ringbuffer . drain ( ..to_remove) ;
236+ }
237+
221238 pub fn fill ( & mut self , chrom : & [ u8 ] , pos : u32 ) -> Result < ( ) , Box < Error > > {
222239 let window_start = cmp:: max ( pos as i32 - self . window as i32 - 1 , 0 ) as u32 ;
223240 let window_end = pos + self . window ;
224241 let rid = try!( self . reader . header . name2rid ( chrom) ) ;
225242
226- if let Some ( last_rid) = self . rid ( ) {
227- if rid != last_rid {
228- // swap with buffer for next rid
229- mem:: swap ( & mut self . ringbuffer2 , & mut self . ringbuffer ) ;
230- // clear second buffer
231- self . ringbuffer2 . clear ( ) ;
232- } else {
233- // remove records too far left of from wrong rid
234- let to_remove = self . ringbuffer . iter ( ) . take_while ( |var| var. pos < window_start || var. rid != rid) . count ( ) ;
235- self . ringbuffer . drain ( ..to_remove) ;
236- }
243+ match ( self . last_rid ( ) , self . next_rid ( ) ) {
244+ ( Some ( last_rid) , _) => {
245+ if last_rid != rid {
246+ self . swap_buffers ( ) ;
247+ } else {
248+ self . drain_left ( rid, window_start) ;
249+ }
250+ } ,
251+ ( _, Some ( _) ) => {
252+ self . swap_buffers ( ) ;
253+ self . drain_left ( rid, window_start) ;
254+ } ,
255+ _ => ( )
256+ }
257+
258+ if !self . ringbuffer2 . is_empty ( ) {
259+ // We have already read beyond the current rid. Hence we can't extend to the right for
260+ // this rid.
261+ return Ok ( ( ) )
237262 }
238263
239264 // extend to the right
0 commit comments