Skip to content

Commit 94e93cb

Browse files
authored
fix: impl DerefMut for "owned" tables. (#371)
1 parent a392076 commit 94e93cb

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

src/_macros.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,14 @@ macro_rules! build_owned_tables {
527527
}
528528
}
529529

530+
impl std::ops::DerefMut for $name {
531+
fn deref_mut(&mut self) -> &mut Self::Target {
532+
// SAFETY: that T* and &T have same layout,
533+
// and Target is repr(transparent).
534+
unsafe { std::mem::transmute(&mut self.table) }
535+
}
536+
}
537+
530538
impl Drop for $name {
531539
fn drop(&mut self) {
532540
let rv = unsafe { $free(&mut (*self.table)) };

src/node_table.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,20 @@ impl<'a> NodeTable<'a> {
188188
/// table collection:
189189
///
190190
/// ```
191-
/// // let mut nodes = tskit::OwnedNodeTable::default();
192-
/// // assert!(nodes.add_row(tskit::NodeFlags::IS_SAMPLE, 10., -1, -1).is_ok());
193-
/// // let flags = nodes.flags_array_mut();
194-
/// // assert!(flags.iter().all(|f| f.is_sample()));
191+
/// let mut nodes = tskit::OwnedNodeTable::default();
192+
/// assert!(nodes.add_row(tskit::NodeFlags::IS_SAMPLE, 10., -1, -1).is_ok());
193+
/// # assert_eq!(nodes.num_rows(), 1);
194+
/// let flags = nodes.flags_array_mut();
195+
/// # assert_eq!(flags.len(), 1);
196+
/// assert!(flags.iter().all(|f| f.is_sample()));
197+
///
198+
/// // while we are at it, let's use our node
199+
/// // table to populate a table collection.
200+
/// # use tskit::TableAccess;
201+
/// let mut tables = tskit::TableCollection::new(10.0).unwrap();
202+
/// tables.set_nodes(&nodes);
203+
/// assert_eq!(tables.nodes().num_rows(), 1);
204+
/// assert_eq!(tables.nodes().flags_array_mut().iter().filter(|f| f.is_sample()).count(), 1);
195205
/// ```
196206
///
197207
/// # Note

0 commit comments

Comments
 (0)