@@ -320,6 +320,24 @@ fn births(
320320 }
321321}
322322
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+
323341fn simplify (
324342 bookmark : & tskit:: types:: Bookmark ,
325343 alive : & mut [ Diploid ] ,
@@ -338,25 +356,8 @@ fn simplify(
338356 }
339357
340358 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- } ;
355359 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) ;
360361 }
361362
362363 match tables. simplify (
@@ -431,24 +432,8 @@ fn update_bookmark(
431432 . find ( |( _index, time) | * * time > most_ancient_birth_time)
432433 {
433434 Some ( ( index, _time) ) => {
434- unimplemented ! ( "fix code duplication" ) ;
435+ rotate_edge_table ( index , tables ) ;
435436 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) ;
452437 bookmark. offsets . edges = ( num_edges - index) . try_into ( ) . unwrap ( ) ;
453438 }
454439 None => bookmark. offsets . edges = 0 ,
0 commit comments