Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/_macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ macro_rules! drop_for_tskit_type {

macro_rules! tskit_type_access {
($name: ident, $ll_name: ty) => {
impl crate::ffi::TskitTypeAccess<$ll_name> for $name {
impl crate::TskitTypeAccess<$ll_name> for $name {
fn as_ptr(&self) -> *const $ll_name {
&*self.inner
}
Expand Down
9 changes: 1 addition & 8 deletions src/ffi.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
//! Define traits related to wrapping tskit stuff

/// Provide pointer access to underlying C types
pub trait TskitTypeAccess<T> {
/// Return const pointer
fn as_ptr(&self) -> *const T;
/// Return mutable pointer
fn as_mut_ptr(&mut self) -> *mut T;
}

/// Indexable, iterable wrapper around C
/// arrays.
#[derive(Copy, Clone)]
Expand Down Expand Up @@ -92,6 +84,7 @@ mod tests {
use super::*;
use crate::bindings as ll_bindings;
use crate::tsk_size_t;
use crate::TskitTypeAccess;
use ll_bindings::tsk_table_collection_free;

pub struct TableCollectionMock {
Expand Down
8 changes: 5 additions & 3 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,19 @@ pub const TSK_NULL: tsk_id_t = -1;

pub use edge_table::{EdgeTable, EdgeTableRow};
pub use error::TskitError;
pub use flags:: SimplificationOptions;
pub use flags::SimplificationOptions;
pub use individual_table::{IndividualTable, IndividualTableRow};
pub use migration_table::{MigrationTable, MigrationTableRow};
pub use mutation_table::{MutationTable, MutationTableRow};
pub use node_table::{NodeTable, NodeTableRow};
pub use population_table::{PopulationTable, PopulationTableRow};
pub use site_table::{SiteTable, SiteTableRow};
pub use table_collection::TableCollection;
pub use traits::NodeIterator;
pub use traits::NodeListGenerator;
pub use traits::TableAccess;
pub use trees::{NodeIterator, NodeTraversalOrder, Tree, TreeFlags, TreeSequence};
pub use traits::TskitTypeAccess;
pub use trees::{NodeTraversalOrder, Tree, TreeFlags, TreeSequence};

/// Handles return codes from low-level tskit functions.
///
Expand Down Expand Up @@ -109,5 +111,5 @@ mod tests {

// Testing modules
mod test_fixtures;
mod test_tsk_variables;
mod test_simplification;
mod test_tsk_variables;
3 changes: 2 additions & 1 deletion src/table_collection.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::bindings as ll_bindings;
use crate::error::TskitError;
use crate::ffi::{TskitTypeAccess, WrapTskitType};
use crate::ffi::WrapTskitType;
use crate::metadata::*;
use crate::types::Bookmark;
use crate::EdgeTable;
Expand All @@ -13,6 +13,7 @@ use crate::SimplificationOptions;
use crate::SiteTable;
use crate::TableAccess;
use crate::TskReturnValue;
use crate::TskitTypeAccess;
use crate::{tsk_flags_t, tsk_id_t, tsk_size_t, TSK_NULL};
use ll_bindings::tsk_table_collection_free;

Expand Down
23 changes: 23 additions & 0 deletions src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ use crate::NodeTable;
use crate::PopulationTable;
use crate::SiteTable;

/// Provide pointer access to underlying C types
pub trait TskitTypeAccess<T> {
/// Return const pointer
fn as_ptr(&self) -> *const T;
/// Return mutable pointer
fn as_mut_ptr(&mut self) -> *mut T;
}

/// Immutable access to tables.
///
/// For objects that contain the full suite of tables,
Expand Down Expand Up @@ -189,3 +197,18 @@ pub trait NodeListGenerator: TableAccess {
self.nodes().create_node_id_vector(f)
}
}

/// Trait defining iteration over nodes.
pub trait NodeIterator {
fn next_node(&mut self);
fn current_node(&mut self) -> Option<tsk_id_t>;
}

impl Iterator for dyn NodeIterator {
type Item = tsk_id_t;

fn next(&mut self) -> Option<tsk_id_t> {
self.next_node();
self.current_node()
}
}
19 changes: 3 additions & 16 deletions src/trees.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
use crate::bindings as ll_bindings;
use crate::error::TskitError;
use crate::ffi::{TskitTypeAccess, WrapTskitType};
use crate::ffi::WrapTskitType;
use crate::EdgeTable;
use crate::IndividualTable;
use crate::MigrationTable;
use crate::MutationTable;
use crate::NodeIterator;
use crate::NodeTable;
use crate::PopulationTable;
use crate::SimplificationOptions;
use crate::SiteTable;
use crate::TableAccess;
use crate::TskitTypeAccess;
use crate::{tsk_flags_t, tsk_id_t, tsk_size_t, TableCollection, TSK_NULL};
use bitflags::bitflags;
use ll_bindings::{tsk_tree_free, tsk_treeseq_free};
Expand Down Expand Up @@ -433,21 +435,6 @@ pub enum NodeTraversalOrder {
Preorder,
}

/// Trait defining iteration over nodes.
pub trait NodeIterator {
fn next_node(&mut self);
fn current_node(&mut self) -> Option<tsk_id_t>;
}

impl Iterator for dyn NodeIterator {
type Item = tsk_id_t;

fn next(&mut self) -> Option<tsk_id_t> {
self.next_node();
self.current_node()
}
}

struct PreorderNodeIterator {
root_stack: Vec<i32>,
node_stack: Vec<i32>,
Expand Down