Skip to content

Commit 7b843d0

Browse files
authored
refactor: TreeSequence no longer stores table types (#722)
1 parent dfe1b3c commit 7b843d0

File tree

2 files changed

+138
-60
lines changed

2 files changed

+138
-60
lines changed

src/table_views.rs

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
use std::ptr::NonNull;
2-
31
#[cfg(feature = "provenance")]
42
use crate::provenance::ProvenanceTable;
5-
use crate::sys::bindings as ll_bindings;
63
use crate::EdgeTable;
74
use crate::IndividualTable;
85
use crate::MigrationTable;
@@ -43,48 +40,6 @@ impl TableViews {
4340
})
4441
}
4542

46-
pub(crate) fn new_from_NonNull_table_collection(
47-
tables: &mut NonNull<ll_bindings::tsk_table_collection_t>,
48-
) -> Result<Self, TskitError> {
49-
Ok(Self {
50-
edges: crate::EdgeTable::new_from_table(&mut unsafe { tables.as_mut() }.edges)?,
51-
nodes: crate::NodeTable::new_from_table(&mut unsafe { tables.as_mut() }.nodes)?,
52-
sites: crate::SiteTable::new_from_table(&mut unsafe { tables.as_mut() }.sites)?,
53-
mutations: crate::MutationTable::new_from_table(
54-
&mut unsafe { tables.as_mut() }.mutations,
55-
)?,
56-
individuals: crate::IndividualTable::new_from_table(
57-
&mut unsafe { tables.as_mut() }.individuals,
58-
)?,
59-
populations: crate::PopulationTable::new_from_table(
60-
&mut unsafe { tables.as_mut() }.populations,
61-
)?,
62-
migrations: crate::MigrationTable::new_from_table(
63-
&mut unsafe { tables.as_mut() }.migrations,
64-
)?,
65-
#[cfg(feature = "provenance")]
66-
provenances: crate::provenance::ProvenanceTable::new_from_table(
67-
&mut unsafe { tables.as_mut() }.provenances,
68-
)?,
69-
})
70-
}
71-
72-
pub(crate) fn new_from_tree_sequence(
73-
treeseq: *mut ll_bindings::tsk_treeseq_t,
74-
) -> Result<Self, TskitError> {
75-
if treeseq.is_null() {
76-
return Err(TskitError::LibraryError(
77-
"tree sequence pointer is null".to_string(),
78-
));
79-
}
80-
let mut n = NonNull::new(unsafe { *treeseq }.tables).ok_or_else(|| {
81-
TskitError::LibraryError(
82-
"tree sequence contains NULL pointer to table collection".to_string(),
83-
)
84-
})?;
85-
Self::new_from_NonNull_table_collection(&mut n)
86-
}
87-
8843
/// Get reference to the [``EdgeTable``](crate::EdgeTable).
8944
pub fn edges(&self) -> &EdgeTable {
9045
&self.edges

src/trees/treeseq.rs

Lines changed: 138 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
use crate::error::TskitError;
22
use crate::sys;
3+
use crate::EdgeTable;
4+
use crate::IndividualTable;
5+
use crate::MigrationTable;
6+
use crate::MutationTable;
37
use crate::NodeId;
8+
use crate::NodeTable;
9+
use crate::PopulationTable;
410
use crate::Position;
511
use crate::SimplificationOptions;
12+
use crate::SiteTable;
613
use crate::SizeType;
714
use crate::TableCollection;
815
use crate::TableOutputOptions;
@@ -59,7 +66,6 @@ use super::Tree;
5966
pub struct TreeSequence {
6067
pub(crate) inner: sys::TreeSequence,
6168
tables: crate::TableCollection,
62-
views: crate::table_views::TableViews,
6369
}
6470

6571
unsafe impl Send for TreeSequence {}
@@ -115,17 +121,12 @@ impl TreeSequence {
115121
) -> Result<Self, TskitError> {
116122
let raw_tables_ptr = tables.into_inner();
117123
let mut inner = sys::TreeSequence::new(raw_tables_ptr, flags.into())?;
118-
let views = crate::table_views::TableViews::new_from_tree_sequence(inner.as_mut())?;
119124
let tables = unsafe {
120125
TableCollection::new_from_ll(sys::TableCollection::new_borrowed(
121126
std::ptr::NonNull::new(inner.as_mut().tables).unwrap(),
122127
))
123128
}?;
124-
Ok(Self {
125-
inner,
126-
tables,
127-
views,
128-
})
129+
Ok(Self { inner, tables })
129130
}
130131

131132
fn as_ref(&self) -> &ll_bindings::tsk_treeseq_t {
@@ -346,18 +347,13 @@ impl TreeSequence {
346347
false => None,
347348
},
348349
)?;
349-
let views = crate::table_views::TableViews::new_from_tree_sequence(inner.as_mut())?;
350350
let tables = unsafe {
351351
TableCollection::new_from_ll(sys::TableCollection::new_borrowed(
352352
std::ptr::NonNull::new(inner.as_mut().tables).unwrap(),
353353
))
354354
}?;
355355
Ok((
356-
Self {
357-
inner,
358-
tables,
359-
views,
360-
},
356+
Self { inner, tables },
361357
match idmap {
362358
true => Some(output_node_map),
363359
false => None,
@@ -481,8 +477,6 @@ impl TreeSequence {
481477
handle_tsk_return_value!(rv, crate::ProvenanceId::from(rv))
482478
}
483479

484-
delegate_table_view_api!();
485-
486480
/// Build a lending iterator over edge differences.
487481
///
488482
/// # Errors
@@ -510,6 +504,135 @@ impl TreeSequence {
510504
pub fn tables(&self) -> &TableCollection {
511505
&self.tables
512506
}
507+
508+
/// Get reference to the [``EdgeTable``](crate::EdgeTable).
509+
pub fn edges(&self) -> &EdgeTable {
510+
self.tables.edges()
511+
}
512+
513+
/// Get reference to the [``NodeTable``](crate::NodeTable).
514+
pub fn nodes(&self) -> &NodeTable {
515+
self.tables.nodes()
516+
}
517+
518+
/// Get reference to the [``SiteTable``](crate::SiteTable).
519+
pub fn sites(&self) -> &SiteTable {
520+
self.tables.sites()
521+
}
522+
523+
/// Get reference to the [``MigrationTable``](crate::MigrationTable).
524+
pub fn migrations(&self) -> &MigrationTable {
525+
self.tables.migrations()
526+
}
527+
528+
pub fn mutations(&self) -> &MutationTable {
529+
self.tables.mutations()
530+
}
531+
532+
/// Get reference to the [``IndividualTable``](crate::IndividualTable).
533+
pub fn individuals(&self) -> &IndividualTable {
534+
self.tables.individuals()
535+
}
536+
537+
/// Get reference to the [``PopulationTable``](crate::PopulationTable).
538+
pub fn populations(&self) -> &PopulationTable {
539+
self.tables.populations()
540+
}
541+
542+
#[cfg(feature = "provenance")]
543+
#[cfg_attr(doc_cfg, doc(cfg(feature = "provenance")))]
544+
/// Get reference to the [``ProvenanceTable``](crate::provenance::ProvenanceTable)
545+
pub fn provenances(&self) -> &crate::provenance::ProvenanceTable {
546+
self.tables.provenances()
547+
}
548+
549+
/// Return an iterator over the individuals.
550+
pub fn individuals_iter(&self) -> impl Iterator<Item = crate::IndividualTableRow> + '_ {
551+
self.individuals().iter()
552+
}
553+
554+
/// Return an iterator over the nodes.
555+
pub fn nodes_iter(&self) -> impl Iterator<Item = crate::NodeTableRow> + '_ {
556+
self.nodes().iter()
557+
}
558+
/// Return an iterator over the edges.
559+
pub fn edges_iter(&self) -> impl Iterator<Item = crate::EdgeTableRow> + '_ {
560+
self.edges().iter()
561+
}
562+
/// Return an iterator over the migrations.
563+
pub fn migrations_iter(&self) -> impl Iterator<Item = crate::MigrationTableRow> + '_ {
564+
self.migrations().iter()
565+
}
566+
/// Return an iterator over the mutations.
567+
pub fn mutations_iter(&self) -> impl Iterator<Item = crate::MutationTableRow> + '_ {
568+
self.mutations().iter()
569+
}
570+
/// Return an iterator over the populations.
571+
pub fn populations_iter(&self) -> impl Iterator<Item = crate::PopulationTableRow> + '_ {
572+
self.populations().iter()
573+
}
574+
/// Return an iterator over the sites.
575+
pub fn sites_iter(&self) -> impl Iterator<Item = crate::SiteTableRow> + '_ {
576+
self.sites().iter()
577+
}
578+
579+
#[cfg(feature = "provenance")]
580+
#[cfg_attr(doc_cfg, doc(cfg(feature = "provenance")))]
581+
/// Return an iterator over provenances
582+
pub fn provenances_iter(
583+
&self,
584+
) -> impl Iterator<Item = crate::provenance::ProvenanceTableRow> + '_ {
585+
self.provenances().iter()
586+
}
587+
588+
/// Obtain a vector containing the indexes ("ids")
589+
/// of all nodes for which [`crate::NodeFlags::is_sample`]
590+
/// is `true`.
591+
///
592+
/// The provided implementation dispatches to
593+
/// [`crate::NodeTable::samples_as_vector`].
594+
pub fn samples_as_vector(&self) -> Vec<crate::NodeId> {
595+
self.tables.samples_as_vector()
596+
}
597+
598+
/// Obtain a vector containing the indexes ("ids") of all nodes
599+
/// satisfying a certain criterion.
600+
///
601+
/// The provided implementation dispatches to
602+
/// [`crate::NodeTable::create_node_id_vector`].
603+
///
604+
/// # Parameters
605+
///
606+
/// * `f`: a function. The function is passed the current table
607+
/// collection and each [`crate::node_table::NodeTableRow`].
608+
/// If `f` returns `true`, the index of that row is included
609+
/// in the return value.
610+
///
611+
/// # Examples
612+
///
613+
/// Get all nodes with time > 0.0:
614+
///
615+
/// ```
616+
/// let mut tables = tskit::TableCollection::new(100.).unwrap();
617+
/// tables
618+
/// .add_node(tskit::NodeFlags::new_sample(), 0.0, tskit::PopulationId::NULL,
619+
/// tskit::IndividualId::NULL)
620+
/// .unwrap();
621+
/// tables
622+
/// .add_node(tskit::NodeFlags::new_sample(), 1.0, tskit::PopulationId::NULL,
623+
/// tskit::IndividualId::NULL)
624+
/// .unwrap();
625+
/// let samples = tables.create_node_id_vector(
626+
/// |row: &tskit::NodeTableRow| row.time > 0.,
627+
/// );
628+
/// assert_eq!(samples[0], 1);
629+
/// ```
630+
pub fn create_node_id_vector(
631+
&self,
632+
f: impl FnMut(&crate::NodeTableRow) -> bool,
633+
) -> Vec<crate::NodeId> {
634+
self.tables.create_node_id_vector(f)
635+
}
513636
}
514637

515638
impl TryFrom<TableCollection> for TreeSequence {

0 commit comments

Comments
 (0)