Skip to content

Commit ac205a7

Browse files
authored
feat: add tskit::OwnedSiteTable (#283)
1 parent 4ee76e9 commit ac205a7

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ pub use migration_table::{MigrationTable, MigrationTableRow};
430430
pub use mutation_table::{MutationTable, MutationTableRow, OwnedMutationTable};
431431
pub use node_table::{NodeTable, NodeTableRow, OwnedNodeTable};
432432
pub use population_table::{OwnedPopulationTable, PopulationTable, PopulationTableRow};
433-
pub use site_table::{SiteTable, SiteTableRow};
433+
pub use site_table::{OwnedSiteTable, SiteTable, SiteTableRow};
434434
pub use table_collection::TableCollection;
435435
pub use traits::IndividualLocation;
436436
pub use traits::IndividualParents;

src/site_table.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::Position;
55
use crate::SiteId;
66
use crate::SizeType;
77
use crate::TskitError;
8+
use ll_bindings::{tsk_site_table_free, tsk_site_table_init};
89

910
/// Row of a [`SiteTable`]
1011
pub struct SiteTableRow {
@@ -152,3 +153,59 @@ impl<'a> SiteTable<'a> {
152153
table_row_access!(r.into().0, self, make_site_table_row)
153154
}
154155
}
156+
157+
build_owned_table_type!(
158+
/// A standalone site table that owns its data.
159+
///
160+
/// # Examples
161+
///
162+
/// ```
163+
/// use tskit::OwnedSiteTable;
164+
///
165+
/// let mut sites = OwnedSiteTable::default();
166+
/// let rowid = sites.add_row(1., None).unwrap();
167+
/// assert_eq!(rowid, 0);
168+
/// assert_eq!(sites.num_rows(), 1);
169+
/// ```
170+
///
171+
/// An example with metadata.
172+
/// This requires the cargo feature `"derive"` for `tskit`.
173+
///
174+
/// ```
175+
/// # #[cfg(any(feature="doc", feature="derive"))] {
176+
/// use tskit::OwnedSiteTable;
177+
///
178+
/// #[derive(serde::Serialize,
179+
/// serde::Deserialize,
180+
/// tskit::metadata::SiteMetadata)]
181+
/// #[serializer("serde_json")]
182+
/// struct SiteMetadata {
183+
/// value: i32,
184+
/// }
185+
///
186+
/// let metadata = SiteMetadata{value: 42};
187+
///
188+
/// let mut sites = OwnedSiteTable::default();
189+
///
190+
/// let rowid = sites.add_row_with_metadata(0., None, &metadata).unwrap();
191+
/// assert_eq!(rowid, 0);
192+
///
193+
/// if let Some(decoded) = sites.metadata::<SiteMetadata>(rowid).unwrap() {
194+
/// assert_eq!(decoded.value, 42);
195+
/// } else {
196+
/// panic!("hmm...we expected some metadata!");
197+
/// }
198+
///
199+
/// # }
200+
/// ```
201+
=> OwnedSiteTable,
202+
SiteTable,
203+
tsk_site_table_t,
204+
tsk_site_table_init,
205+
tsk_site_table_free
206+
);
207+
208+
impl OwnedSiteTable {
209+
site_table_add_row!(=> add_row, self, *self.table);
210+
site_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
211+
}

0 commit comments

Comments
 (0)