@@ -194,10 +194,8 @@ impl Assembler {
194
194
195
195
/// Add a new contiguous range to the assembler, and return `Ok(bool)`,
196
196
/// or return `Err(TooManyHolesError)` if too many discontiguities are already recorded.
197
- /// Returns `Ok(true)` when there was an overlap.
198
- pub fn add ( & mut self , mut offset : usize , mut size : usize ) -> Result < bool , TooManyHolesError > {
197
+ pub fn add ( & mut self , mut offset : usize , mut size : usize ) -> Result < ( ) , TooManyHolesError > {
199
198
let mut index = 0 ;
200
- let mut overlap = size;
201
199
while index != self . contigs . len ( ) && size != 0 {
202
200
let contig = self . contigs [ index] ;
203
201
@@ -208,7 +206,6 @@ impl Assembler {
208
206
// The range being added covers the entire hole in this contig, merge it
209
207
// into the previous config.
210
208
self . contigs [ index - 1 ] . expand_data_by ( contig. total_size ( ) ) ;
211
- overlap -= contig. total_size ( ) ;
212
209
self . remove_contig_at ( index) ;
213
210
index += 0 ;
214
211
} else if offset == 0 && size < contig. hole_size && index > 0 {
@@ -217,12 +214,10 @@ impl Assembler {
217
214
// the previous contig.
218
215
self . contigs [ index - 1 ] . expand_data_by ( size) ;
219
216
self . contigs [ index] . shrink_hole_by ( size) ;
220
- overlap -= size;
221
217
index += 1 ;
222
218
} else if offset <= contig. hole_size && offset + size >= contig. hole_size {
223
219
// The range being added covers both a part of the hole and a part of the data
224
220
// in this contig, shrink the hole in this contig.
225
- overlap -= contig. hole_size - offset;
226
221
self . contigs [ index] . shrink_hole_to ( offset) ;
227
222
index += 1 ;
228
223
} else if offset + size >= contig. hole_size {
@@ -234,7 +229,6 @@ impl Assembler {
234
229
{
235
230
let inserted = self . add_contig_at ( index) ?;
236
231
* inserted = Contig :: hole_and_data ( offset, size) ;
237
- overlap -= size;
238
232
}
239
233
// Previous contigs[index] got moved to contigs[index+1]
240
234
self . contigs [ index + 1 ] . shrink_hole_by ( offset + size) ;
@@ -253,7 +247,7 @@ impl Assembler {
253
247
}
254
248
255
249
debug_assert ! ( size == 0 ) ;
256
- Ok ( overlap != 0 )
250
+ Ok ( ( ) )
257
251
}
258
252
259
253
/// Remove a contiguous range from the front of the assembler and `Some(data_size)`,
@@ -364,92 +358,92 @@ mod test {
364
358
#[ test]
365
359
fn test_empty_add_full ( ) {
366
360
let mut assr = Assembler :: new ( 16 ) ;
367
- assert_eq ! ( assr. add( 0 , 16 ) , Ok ( false ) ) ;
361
+ assert_eq ! ( assr. add( 0 , 16 ) , Ok ( ( ) ) ) ;
368
362
assert_eq ! ( assr, contigs![ ( 0 , 16 ) ] ) ;
369
363
}
370
364
371
365
#[ test]
372
366
fn test_empty_add_front ( ) {
373
367
let mut assr = Assembler :: new ( 16 ) ;
374
- assert_eq ! ( assr. add( 0 , 4 ) , Ok ( false ) ) ;
368
+ assert_eq ! ( assr. add( 0 , 4 ) , Ok ( ( ) ) ) ;
375
369
assert_eq ! ( assr, contigs![ ( 0 , 4 ) , ( 12 , 0 ) ] ) ;
376
370
}
377
371
378
372
#[ test]
379
373
fn test_empty_add_back ( ) {
380
374
let mut assr = Assembler :: new ( 16 ) ;
381
- assert_eq ! ( assr. add( 12 , 4 ) , Ok ( false ) ) ;
375
+ assert_eq ! ( assr. add( 12 , 4 ) , Ok ( ( ) ) ) ;
382
376
assert_eq ! ( assr, contigs![ ( 12 , 4 ) ] ) ;
383
377
}
384
378
385
379
#[ test]
386
380
fn test_empty_add_mid ( ) {
387
381
let mut assr = Assembler :: new ( 16 ) ;
388
- assert_eq ! ( assr. add( 4 , 8 ) , Ok ( false ) ) ;
382
+ assert_eq ! ( assr. add( 4 , 8 ) , Ok ( ( ) ) ) ;
389
383
assert_eq ! ( assr, contigs![ ( 4 , 8 ) , ( 4 , 0 ) ] ) ;
390
384
}
391
385
392
386
#[ test]
393
387
fn test_partial_add_front ( ) {
394
388
let mut assr = contigs ! [ ( 4 , 8 ) , ( 4 , 0 ) ] ;
395
- assert_eq ! ( assr. add( 0 , 4 ) , Ok ( false ) ) ;
389
+ assert_eq ! ( assr. add( 0 , 4 ) , Ok ( ( ) ) ) ;
396
390
assert_eq ! ( assr, contigs![ ( 0 , 12 ) , ( 4 , 0 ) ] ) ;
397
391
}
398
392
399
393
#[ test]
400
394
fn test_partial_add_back ( ) {
401
395
let mut assr = contigs ! [ ( 4 , 8 ) , ( 4 , 0 ) ] ;
402
- assert_eq ! ( assr. add( 12 , 4 ) , Ok ( false ) ) ;
396
+ assert_eq ! ( assr. add( 12 , 4 ) , Ok ( ( ) ) ) ;
403
397
assert_eq ! ( assr, contigs![ ( 4 , 12 ) ] ) ;
404
398
}
405
399
406
400
#[ test]
407
401
fn test_partial_add_front_overlap ( ) {
408
402
let mut assr = contigs ! [ ( 4 , 8 ) , ( 4 , 0 ) ] ;
409
- assert_eq ! ( assr. add( 0 , 8 ) , Ok ( true ) ) ;
403
+ assert_eq ! ( assr. add( 0 , 8 ) , Ok ( ( ) ) ) ;
410
404
assert_eq ! ( assr, contigs![ ( 0 , 12 ) , ( 4 , 0 ) ] ) ;
411
405
}
412
406
413
407
#[ test]
414
408
fn test_partial_add_front_overlap_split ( ) {
415
409
let mut assr = contigs ! [ ( 4 , 8 ) , ( 4 , 0 ) ] ;
416
- assert_eq ! ( assr. add( 2 , 6 ) , Ok ( true ) ) ;
410
+ assert_eq ! ( assr. add( 2 , 6 ) , Ok ( ( ) ) ) ;
417
411
assert_eq ! ( assr, contigs![ ( 2 , 10 ) , ( 4 , 0 ) ] ) ;
418
412
}
419
413
420
414
#[ test]
421
415
fn test_partial_add_back_overlap ( ) {
422
416
let mut assr = contigs ! [ ( 4 , 8 ) , ( 4 , 0 ) ] ;
423
- assert_eq ! ( assr. add( 8 , 8 ) , Ok ( true ) ) ;
417
+ assert_eq ! ( assr. add( 8 , 8 ) , Ok ( ( ) ) ) ;
424
418
assert_eq ! ( assr, contigs![ ( 4 , 12 ) ] ) ;
425
419
}
426
420
427
421
#[ test]
428
422
fn test_partial_add_back_overlap_split ( ) {
429
423
let mut assr = contigs ! [ ( 4 , 8 ) , ( 4 , 0 ) ] ;
430
- assert_eq ! ( assr. add( 10 , 4 ) , Ok ( true ) ) ;
424
+ assert_eq ! ( assr. add( 10 , 4 ) , Ok ( ( ) ) ) ;
431
425
assert_eq ! ( assr, contigs![ ( 4 , 10 ) , ( 2 , 0 ) ] ) ;
432
426
}
433
427
434
428
#[ test]
435
429
fn test_partial_add_both_overlap ( ) {
436
430
let mut assr = contigs ! [ ( 4 , 8 ) , ( 4 , 0 ) ] ;
437
- assert_eq ! ( assr. add( 0 , 16 ) , Ok ( true ) ) ;
431
+ assert_eq ! ( assr. add( 0 , 16 ) , Ok ( ( ) ) ) ;
438
432
assert_eq ! ( assr, contigs![ ( 0 , 16 ) ] ) ;
439
433
}
440
434
441
435
#[ test]
442
436
fn test_partial_add_both_overlap_split ( ) {
443
437
let mut assr = contigs ! [ ( 4 , 8 ) , ( 4 , 0 ) ] ;
444
- assert_eq ! ( assr. add( 2 , 12 ) , Ok ( true ) ) ;
438
+ assert_eq ! ( assr. add( 2 , 12 ) , Ok ( ( ) ) ) ;
445
439
assert_eq ! ( assr, contigs![ ( 2 , 12 ) , ( 2 , 0 ) ] ) ;
446
440
}
447
441
448
442
#[ test]
449
443
fn test_rejected_add_keeps_state ( ) {
450
444
let mut assr = Assembler :: new ( CONTIG_COUNT * 20 ) ;
451
445
for c in 1 ..=CONTIG_COUNT - 1 {
452
- assert_eq ! ( assr. add( c * 10 , 3 ) , Ok ( false ) ) ;
446
+ assert_eq ! ( assr. add( c * 10 , 3 ) , Ok ( ( ) ) ) ;
453
447
}
454
448
// Maximum of allowed holes is reached
455
449
let assr_before = assr. clone ( ) ;
@@ -499,39 +493,39 @@ mod test {
499
493
#[ test]
500
494
fn test_iter_full ( ) {
501
495
let mut assr = Assembler :: new ( 16 ) ;
502
- assert_eq ! ( assr. add( 0 , 16 ) , Ok ( false ) ) ;
496
+ assert_eq ! ( assr. add( 0 , 16 ) , Ok ( ( ) ) ) ;
503
497
let segments: Vec < _ > = assr. iter_data ( 10 ) . collect ( ) ;
504
498
assert_eq ! ( segments, vec![ ( 10 , 26 ) ] ) ;
505
499
}
506
500
507
501
#[ test]
508
502
fn test_iter_offset ( ) {
509
503
let mut assr = Assembler :: new ( 16 ) ;
510
- assert_eq ! ( assr. add( 0 , 16 ) , Ok ( false ) ) ;
504
+ assert_eq ! ( assr. add( 0 , 16 ) , Ok ( ( ) ) ) ;
511
505
let segments: Vec < _ > = assr. iter_data ( 100 ) . collect ( ) ;
512
506
assert_eq ! ( segments, vec![ ( 100 , 116 ) ] ) ;
513
507
}
514
508
515
509
#[ test]
516
510
fn test_iter_one_front ( ) {
517
511
let mut assr = Assembler :: new ( 16 ) ;
518
- assert_eq ! ( assr. add( 0 , 4 ) , Ok ( false ) ) ;
512
+ assert_eq ! ( assr. add( 0 , 4 ) , Ok ( ( ) ) ) ;
519
513
let segments: Vec < _ > = assr. iter_data ( 10 ) . collect ( ) ;
520
514
assert_eq ! ( segments, vec![ ( 10 , 14 ) ] ) ;
521
515
}
522
516
523
517
#[ test]
524
518
fn test_iter_one_back ( ) {
525
519
let mut assr = Assembler :: new ( 16 ) ;
526
- assert_eq ! ( assr. add( 12 , 4 ) , Ok ( false ) ) ;
520
+ assert_eq ! ( assr. add( 12 , 4 ) , Ok ( ( ) ) ) ;
527
521
let segments: Vec < _ > = assr. iter_data ( 10 ) . collect ( ) ;
528
522
assert_eq ! ( segments, vec![ ( 22 , 26 ) ] ) ;
529
523
}
530
524
531
525
#[ test]
532
526
fn test_iter_one_mid ( ) {
533
527
let mut assr = Assembler :: new ( 16 ) ;
534
- assert_eq ! ( assr. add( 4 , 8 ) , Ok ( false ) ) ;
528
+ assert_eq ! ( assr. add( 4 , 8 ) , Ok ( ( ) ) ) ;
535
529
let segments: Vec < _ > = assr. iter_data ( 10 ) . collect ( ) ;
536
530
assert_eq ! ( segments, vec![ ( 14 , 22 ) ] ) ;
537
531
}
@@ -556,4 +550,12 @@ mod test {
556
550
let segments: Vec < _ > = assr. iter_data ( 100 ) . collect ( ) ;
557
551
assert_eq ! ( segments, vec![ ( 102 , 108 ) , ( 110 , 111 ) , ( 113 , 115 ) ] ) ;
558
552
}
553
+
554
+ #[ test]
555
+ fn test_issue_694 ( ) {
556
+ let mut assr = Assembler :: new ( 16 ) ;
557
+ assert_eq ! ( assr. add( 0 , 1 ) , Ok ( ( ) ) ) ;
558
+ assert_eq ! ( assr. add( 2 , 1 ) , Ok ( ( ) ) ) ;
559
+ assert_eq ! ( assr. add( 1 , 1 ) , Ok ( ( ) ) ) ;
560
+ }
559
561
}
0 commit comments