From b3ba5d66f2f525715826c6e7d4581f9a998f4780 Mon Sep 17 00:00:00 2001 From: "Kevin R. Thornton" Date: Wed, 20 Jul 2022 13:31:08 -0700 Subject: [PATCH] refactor: add new macro to build owned tables --- src/_macros.rs | 17 +++++++ src/edge_table.rs | 104 +++++++++++++++++++--------------------- src/mutation_table.rs | 18 +++---- src/node_table.rs | 104 +++++++++++++++++++--------------------- src/population_table.rs | 18 +++---- 5 files changed, 131 insertions(+), 130 deletions(-) diff --git a/src/_macros.rs b/src/_macros.rs index 9bc414d18..55d693061 100644 --- a/src/_macros.rs +++ b/src/_macros.rs @@ -1008,6 +1008,23 @@ macro_rules! provenance_table_add_row { }; } +macro_rules! build_owned_table_type { + ($(#[$attr:meta])* => $name: ident, $deref_type: ident, $tskname: ident, $tskinit: ident, $tskfree: ident) => { + $(#[$attr])* + pub struct $name { + table: mbox::MBox<$crate::bindings::$tskname>, + } + + build_owned_tables!( + $name, + $deref_type, + $crate::bindings::$tskname, + $tskinit, + $tskfree + ); + }; +} + #[cfg(test)] mod test { use crate::error::TskitError; diff --git a/src/edge_table.rs b/src/edge_table.rs index e80f79218..c3d5eb341 100644 --- a/src/edge_table.rs +++ b/src/edge_table.rs @@ -170,62 +170,58 @@ impl<'a> EdgeTable<'a> { } } -/// A standalone edge table that owns its data. -/// -/// # Examples -/// -/// ``` -/// use tskit::OwnedEdgeTable; -/// -/// let mut edges = OwnedEdgeTable::default(); -/// let rowid = edges.add_row(1., 2., 0, 1).unwrap(); -/// assert_eq!(rowid, 0); -/// assert_eq!(edges.num_rows(), 1); -/// ``` -/// -/// An example with metadata. -/// This requires the cargo feature `"derive"` for `tskit`. -/// -/// ``` -/// # #[cfg(any(feature="doc", feature="derive"))] { -/// use tskit::OwnedEdgeTable; -/// -/// #[derive(serde::Serialize, -/// serde::Deserialize, -/// tskit::metadata::EdgeMetadata)] -/// #[serializer("serde_json")] -/// struct EdgeMetadata { -/// value: i32, -/// } -/// -/// let metadata = EdgeMetadata{value: 42}; -/// -/// let mut edges = OwnedEdgeTable::default(); -/// -/// let rowid = edges.add_row_with_metadata(0., 1., 5, 10, &metadata).unwrap(); -/// assert_eq!(rowid, 0); -/// -/// if let Some(decoded) = edges.metadata::(rowid).unwrap() { -/// assert_eq!(decoded.value, 42); -/// } else { -/// panic!("hmm...we expected some metadata!"); -/// } -/// -/// # } -/// ``` -pub struct OwnedEdgeTable { - table: mbox::MBox, -} +build_owned_table_type!( + /// A standalone edge table that owns its data. + /// + /// # Examples + /// + /// ``` + /// use tskit::OwnedEdgeTable; + /// + /// let mut edges = OwnedEdgeTable::default(); + /// let rowid = edges.add_row(1., 2., 0, 1).unwrap(); + /// assert_eq!(rowid, 0); + /// assert_eq!(edges.num_rows(), 1); + /// ``` + /// + /// An example with metadata. + /// This requires the cargo feature `"derive"` for `tskit`. + /// + /// ``` + /// # #[cfg(any(feature="doc", feature="derive"))] { + /// use tskit::OwnedEdgeTable; + /// + /// #[derive(serde::Serialize, + /// serde::Deserialize, + /// tskit::metadata::EdgeMetadata)] + /// #[serializer("serde_json")] + /// struct EdgeMetadata { + /// value: i32, + /// } + /// + /// let metadata = EdgeMetadata{value: 42}; + /// + /// let mut edges = OwnedEdgeTable::default(); + /// + /// let rowid = edges.add_row_with_metadata(0., 1., 5, 10, &metadata).unwrap(); + /// assert_eq!(rowid, 0); + /// + /// if let Some(decoded) = edges.metadata::(rowid).unwrap() { + /// assert_eq!(decoded.value, 42); + /// } else { + /// panic!("hmm...we expected some metadata!"); + /// } + /// + /// # } + /// ``` + => OwnedEdgeTable, + EdgeTable, + tsk_edge_table_t, + tsk_edge_table_init, + tsk_edge_table_free +); impl OwnedEdgeTable { edge_table_add_row!(=> add_row, self, *self.table); edge_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table); } - -build_owned_tables!( - OwnedEdgeTable, - EdgeTable, - ll_bindings::tsk_edge_table_t, - tsk_edge_table_init, - tsk_edge_table_free -); diff --git a/src/mutation_table.rs b/src/mutation_table.rs index 6b45ce63e..f7a6c6312 100644 --- a/src/mutation_table.rs +++ b/src/mutation_table.rs @@ -198,6 +198,7 @@ impl<'a> MutationTable<'a> { } } +build_owned_table_type!( /// A standalone mutation table that owns its data. /// /// # Examples @@ -241,19 +242,14 @@ impl<'a> MutationTable<'a> { /// /// # } /// ``` -pub struct OwnedMutationTable { - table: mbox::MBox, -} + => OwnedMutationTable, + MutationTable, + tsk_mutation_table_t, + tsk_mutation_table_init, + tsk_mutation_table_free +); impl OwnedMutationTable { mutation_table_add_row!(=> add_row, self, *self.table); mutation_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table); } - -build_owned_tables!( - OwnedMutationTable, - MutationTable, - ll_bindings::tsk_mutation_table_t, - tsk_mutation_table_init, - tsk_mutation_table_free -); diff --git a/src/node_table.rs b/src/node_table.rs index ad228de2a..764ddf5e4 100644 --- a/src/node_table.rs +++ b/src/node_table.rs @@ -245,66 +245,62 @@ impl<'a> NodeTable<'a> { } } -/// A standalone node table that owns its data. -/// -/// # Examples -/// -/// ``` -/// use tskit::OwnedNodeTable; -/// -/// let mut nodes = OwnedNodeTable::default(); -/// let rowid = nodes.add_row(0, 1.1, -1, -1).unwrap(); -/// assert_eq!(rowid, 0); -/// assert_eq!(nodes.num_rows(), 1); -/// ``` -/// -/// An example with metadata. -/// This requires the cargo feature `"derive"` for `tskit`. -/// -/// ``` -/// # #[cfg(any(feature="doc", feature="derive"))] { -/// use tskit::OwnedNodeTable; -/// -/// #[derive(serde::Serialize, -/// serde::Deserialize, -/// tskit::metadata::NodeMetadata)] -/// #[serializer("serde_json")] -/// struct NodeMetadata { -/// value: i32, -/// } -/// -/// let metadata = NodeMetadata{value: 42}; -/// -/// let mut nodes = OwnedNodeTable::default(); -/// -/// let rowid = nodes.add_row_with_metadata(0, 1., -1, -1, &metadata).unwrap(); -/// assert_eq!(rowid, 0); -/// -/// if let Some(decoded) = nodes.metadata::(rowid).unwrap() { -/// assert_eq!(decoded.value, 42); -/// } else { -/// panic!("hmm...we expected some metadata!"); -/// } -/// -/// # } -/// ``` -pub struct OwnedNodeTable { - table: mbox::MBox, -} +build_owned_table_type!( + /// A standalone node table that owns its data. + /// + /// # Examples + /// + /// ``` + /// use tskit::OwnedNodeTable; + /// + /// let mut nodes = OwnedNodeTable::default(); + /// let rowid = nodes.add_row(0, 1.1, -1, -1).unwrap(); + /// assert_eq!(rowid, 0); + /// assert_eq!(nodes.num_rows(), 1); + /// ``` + /// + /// An example with metadata. + /// This requires the cargo feature `"derive"` for `tskit`. + /// + /// ``` + /// # #[cfg(any(feature="doc", feature="derive"))] { + /// use tskit::OwnedNodeTable; + /// + /// #[derive(serde::Serialize, + /// serde::Deserialize, + /// tskit::metadata::NodeMetadata)] + /// #[serializer("serde_json")] + /// struct NodeMetadata { + /// value: i32, + /// } + /// + /// let metadata = NodeMetadata{value: 42}; + /// + /// let mut nodes = OwnedNodeTable::default(); + /// + /// let rowid = nodes.add_row_with_metadata(0, 1., -1, -1, &metadata).unwrap(); + /// assert_eq!(rowid, 0); + /// + /// if let Some(decoded) = nodes.metadata::(rowid).unwrap() { + /// assert_eq!(decoded.value, 42); + /// } else { + /// panic!("hmm...we expected some metadata!"); + /// } + /// + /// # } + /// ``` + => OwnedNodeTable, + NodeTable, + tsk_node_table_t, + tsk_node_table_init, + tsk_node_table_free +); impl OwnedNodeTable { node_table_add_row!(=> add_row, self, table); node_table_add_row_with_metadata!(=> add_row_with_metadata, self, table); } -build_owned_tables!( - OwnedNodeTable, - NodeTable, - ll_bindings::tsk_node_table_t, - tsk_node_table_init, - tsk_node_table_free -); - #[cfg(test)] mod test_owned_node_table { use super::*; diff --git a/src/population_table.rs b/src/population_table.rs index 935d062ed..c4233e95d 100644 --- a/src/population_table.rs +++ b/src/population_table.rs @@ -117,6 +117,7 @@ impl<'a> PopulationTable<'a> { } } +build_owned_table_type!( /// A standalone population table that owns its data. /// /// # Examples @@ -160,19 +161,14 @@ impl<'a> PopulationTable<'a> { /// /// # } /// ``` -pub struct OwnedPopulationTable { - table: mbox::MBox, -} + => OwnedPopulationTable, + PopulationTable, + tsk_population_table_t, + tsk_population_table_init, + tsk_population_table_free +); impl OwnedPopulationTable { population_table_add_row!(=> add_row, self, *self.table); population_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table); } - -build_owned_tables!( - OwnedPopulationTable, - PopulationTable, - ll_bindings::tsk_population_table_t, - tsk_population_table_init, - tsk_population_table_free -);