Skip to content

Commit a3fa336

Browse files
committed
remove code duplication
1 parent dbb8224 commit a3fa336

File tree

1 file changed

+20
-35
lines changed

1 file changed

+20
-35
lines changed

examples/forward_simulation.rs

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
323341
fn 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

Comments
 (0)