Skip to content

Commit 0790d50

Browse files
committed
feat: add tskit::OwnedIndividualTable
1 parent ac205a7 commit 0790d50

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

src/individual_table.rs

+57
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::IndividualFlags;
44
use crate::IndividualId;
55
use crate::Location;
66
use crate::{tsk_id_t, tsk_size_t, TskitError};
7+
use ll_bindings::{tsk_individual_table_free, tsk_individual_table_init};
78

89
/// Row of a [`IndividualTable`]
910
pub struct IndividualTableRow {
@@ -278,3 +279,59 @@ impl<'a> IndividualTable<'a> {
278279
table_row_access!(ri.0, self, make_individual_table_row)
279280
}
280281
}
282+
283+
build_owned_table_type!(
284+
/// A standalone individual table that owns its data.
285+
///
286+
/// # Examples
287+
///
288+
/// ```
289+
/// use tskit::OwnedIndividualTable;
290+
///
291+
/// let mut individuals = OwnedIndividualTable::default();
292+
/// let rowid = individuals.add_row(0, None, None).unwrap();
293+
/// assert_eq!(rowid, 0);
294+
/// assert_eq!(individuals.num_rows(), 1);
295+
/// ```
296+
///
297+
/// An example with metadata.
298+
/// This requires the cargo feature `"derive"` for `tskit`.
299+
///
300+
/// ```
301+
/// # #[cfg(any(feature="doc", feature="derive"))] {
302+
/// use tskit::OwnedIndividualTable;
303+
///
304+
/// #[derive(serde::Serialize,
305+
/// serde::Deserialize,
306+
/// tskit::metadata::IndividualMetadata)]
307+
/// #[serializer("serde_json")]
308+
/// struct IndividualMetadata {
309+
/// value: i32,
310+
/// }
311+
///
312+
/// let metadata = IndividualMetadata{value: 42};
313+
///
314+
/// let mut individuals = OwnedIndividualTable::default();
315+
///
316+
/// let rowid = individuals.add_row_with_metadata(0, None, None, &metadata).unwrap();
317+
/// assert_eq!(rowid, 0);
318+
///
319+
/// if let Some(decoded) = individuals.metadata::<IndividualMetadata>(rowid).unwrap() {
320+
/// assert_eq!(decoded.value, 42);
321+
/// } else {
322+
/// panic!("hmm...we expected some metadata!");
323+
/// }
324+
///
325+
/// # }
326+
/// ```
327+
=> OwnedIndividualTable,
328+
IndividualTable,
329+
tsk_individual_table_t,
330+
tsk_individual_table_init,
331+
tsk_individual_table_free
332+
);
333+
334+
impl OwnedIndividualTable {
335+
individual_table_add_row!(=> add_row, self, *self.table);
336+
individual_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
337+
}

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ pub(crate) const TSK_NULL: tsk_id_t = -1;
425425
pub use edge_table::{EdgeTable, EdgeTableRow, OwnedEdgeTable};
426426
pub use error::TskitError;
427427
pub use flags::*;
428-
pub use individual_table::{IndividualTable, IndividualTableRow};
428+
pub use individual_table::{IndividualTable, IndividualTableRow, OwnedIndividualTable};
429429
pub use migration_table::{MigrationTable, MigrationTableRow};
430430
pub use mutation_table::{MutationTable, MutationTableRow, OwnedMutationTable};
431431
pub use node_table::{NodeTable, NodeTableRow, OwnedNodeTable};

0 commit comments

Comments
 (0)