@@ -320,6 +320,24 @@ fn births(
320
320
}
321
321
}
322
322
323
+ fn rotate_edge_table ( mid : usize , tables : & mut tskit:: TableCollection ) {
324
+ // NOTE: using unsafe here because we don't have
325
+ // a rust API yet.
326
+ let num_edges: usize = tables. edges ( ) . num_rows ( ) . try_into ( ) . unwrap ( ) ;
327
+ let parent =
328
+ unsafe { std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . parent , num_edges) } ;
329
+ let child =
330
+ unsafe { std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . child , num_edges) } ;
331
+ let left =
332
+ unsafe { std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . left , num_edges) } ;
333
+ let right =
334
+ unsafe { std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . right , num_edges) } ;
335
+ parent. rotate_left ( mid) ;
336
+ child. rotate_left ( mid) ;
337
+ left. rotate_left ( mid) ;
338
+ right. rotate_left ( mid) ;
339
+ }
340
+
323
341
fn simplify (
324
342
bookmark : & tskit:: types:: Bookmark ,
325
343
alive : & mut [ Diploid ] ,
@@ -338,25 +356,8 @@ fn simplify(
338
356
}
339
357
340
358
if bookmark. offsets . edges > 0 {
341
- // NOTE: there should be API support for this operation
342
- unimplemented ! ( "fix code duplication" ) ;
343
- let num_edges: usize = tables. edges ( ) . num_rows ( ) . try_into ( ) . unwrap ( ) ;
344
- let parent = unsafe {
345
- std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . parent , num_edges)
346
- } ;
347
- let child = unsafe {
348
- std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . child , num_edges)
349
- } ;
350
- let left =
351
- unsafe { std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . left , num_edges) } ;
352
- let right = unsafe {
353
- std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . right , num_edges)
354
- } ;
355
359
let mid: usize = bookmark. offsets . edges . try_into ( ) . unwrap ( ) ;
356
- parent. rotate_left ( mid) ;
357
- child. rotate_left ( mid) ;
358
- left. rotate_left ( mid) ;
359
- right. rotate_left ( mid) ;
360
+ rotate_edge_table ( mid, tables) ;
360
361
}
361
362
362
363
match tables. simplify (
@@ -431,24 +432,8 @@ fn update_bookmark(
431
432
. find ( |( _index, time) | * * time > most_ancient_birth_time)
432
433
{
433
434
Some ( ( index, _time) ) => {
434
- unimplemented ! ( "fix code duplication" ) ;
435
+ rotate_edge_table ( index , tables ) ;
435
436
let num_edges: usize = tables. edges ( ) . num_rows ( ) . try_into ( ) . unwrap ( ) ;
436
- let parent = unsafe {
437
- std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . parent , num_edges)
438
- } ;
439
- let child = unsafe {
440
- std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . child , num_edges)
441
- } ;
442
- let left = unsafe {
443
- std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . left , num_edges)
444
- } ;
445
- let right = unsafe {
446
- std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . right , num_edges)
447
- } ;
448
- parent. rotate_left ( index) ;
449
- child. rotate_left ( index) ;
450
- left. rotate_left ( index) ;
451
- right. rotate_left ( index) ;
452
437
bookmark. offsets . edges = ( num_edges - index) . try_into ( ) . unwrap ( ) ;
453
438
}
454
439
None => bookmark. offsets . edges = 0 ,
0 commit comments