From fb4301de216e08fff5aeb2bad08a9696cc83ea66 Mon Sep 17 00:00:00 2001 From: "Kevin R. Thornton" Date: Wed, 20 Jul 2022 14:00:48 -0700 Subject: [PATCH] feat: add tskit::OwnedSiteTable --- src/lib.rs | 2 +- src/site_table.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 73e46ee7a..cce524c1e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -430,7 +430,7 @@ pub use migration_table::{MigrationTable, MigrationTableRow}; pub use mutation_table::{MutationTable, MutationTableRow, OwnedMutationTable}; pub use node_table::{NodeTable, NodeTableRow, OwnedNodeTable}; pub use population_table::{OwnedPopulationTable, PopulationTable, PopulationTableRow}; -pub use site_table::{SiteTable, SiteTableRow}; +pub use site_table::{OwnedSiteTable, SiteTable, SiteTableRow}; pub use table_collection::TableCollection; pub use traits::IndividualLocation; pub use traits::IndividualParents; diff --git a/src/site_table.rs b/src/site_table.rs index cfd98d45f..65801caea 100644 --- a/src/site_table.rs +++ b/src/site_table.rs @@ -5,6 +5,7 @@ use crate::Position; use crate::SiteId; use crate::SizeType; use crate::TskitError; +use ll_bindings::{tsk_site_table_free, tsk_site_table_init}; /// Row of a [`SiteTable`] pub struct SiteTableRow { @@ -152,3 +153,59 @@ impl<'a> SiteTable<'a> { table_row_access!(r.into().0, self, make_site_table_row) } } + +build_owned_table_type!( + /// A standalone site table that owns its data. + /// + /// # Examples + /// + /// ``` + /// use tskit::OwnedSiteTable; + /// + /// let mut sites = OwnedSiteTable::default(); + /// let rowid = sites.add_row(1., None).unwrap(); + /// assert_eq!(rowid, 0); + /// assert_eq!(sites.num_rows(), 1); + /// ``` + /// + /// An example with metadata. + /// This requires the cargo feature `"derive"` for `tskit`. + /// + /// ``` + /// # #[cfg(any(feature="doc", feature="derive"))] { + /// use tskit::OwnedSiteTable; + /// + /// #[derive(serde::Serialize, + /// serde::Deserialize, + /// tskit::metadata::SiteMetadata)] + /// #[serializer("serde_json")] + /// struct SiteMetadata { + /// value: i32, + /// } + /// + /// let metadata = SiteMetadata{value: 42}; + /// + /// let mut sites = OwnedSiteTable::default(); + /// + /// let rowid = sites.add_row_with_metadata(0., None, &metadata).unwrap(); + /// assert_eq!(rowid, 0); + /// + /// if let Some(decoded) = sites.metadata::(rowid).unwrap() { + /// assert_eq!(decoded.value, 42); + /// } else { + /// panic!("hmm...we expected some metadata!"); + /// } + /// + /// # } + /// ``` + => OwnedSiteTable, + SiteTable, + tsk_site_table_t, + tsk_site_table_init, + tsk_site_table_free +); + +impl OwnedSiteTable { + site_table_add_row!(=> add_row, self, *self.table); + site_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table); +}