Skip to content

Commit 78dda67

Browse files
authored
refactor: remove MBox for tsk_treeseq_t storage (#306)
1 parent 0877353 commit 78dda67

File tree

1 file changed

+35
-13
lines changed

1 file changed

+35
-13
lines changed

src/trees.rs

+35-13
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ use crate::TreeSequenceFlags;
2323
use crate::TskReturnValue;
2424
use crate::TskitTypeAccess;
2525
use crate::{tsk_id_t, tsk_size_t, TableCollection};
26-
use ll_bindings::{tsk_tree_free, tsk_treeseq_free};
27-
use mbox::MBox;
26+
use ll_bindings::tsk_tree_free;
2827
use std::ptr::NonNull;
2928

3029
/// A Tree.
@@ -165,13 +164,36 @@ impl streaming_iterator::DoubleEndedStreamingIterator for Tree {
165164
/// let treeseq = tables.tree_sequence(tskit::TreeSequenceFlags::default()).unwrap();
166165
/// ```
167166
pub struct TreeSequence {
168-
pub(crate) inner: MBox<ll_bindings::tsk_treeseq_t>,
167+
pub(crate) inner: ll_bindings::tsk_treeseq_t,
168+
}
169+
170+
impl crate::ffi::WrapTskitType<ll_bindings::tsk_treeseq_t> for TreeSequence {
171+
fn wrap() -> Self {
172+
let inner = std::mem::MaybeUninit::<ll_bindings::tsk_treeseq_t>::uninit();
173+
let inner = unsafe { inner.assume_init() };
174+
Self { inner }
175+
}
169176
}
170177

171178
unsafe impl Send for TreeSequence {}
172179
unsafe impl Sync for TreeSequence {}
173180

174-
build_tskit_type!(TreeSequence, ll_bindings::tsk_treeseq_t, tsk_treeseq_free);
181+
impl TskitTypeAccess<ll_bindings::tsk_treeseq_t> for TreeSequence {
182+
fn as_ptr(&self) -> *const ll_bindings::tsk_treeseq_t {
183+
&self.inner
184+
}
185+
186+
fn as_mut_ptr(&mut self) -> *mut ll_bindings::tsk_treeseq_t {
187+
&mut self.inner
188+
}
189+
}
190+
191+
impl Drop for TreeSequence {
192+
fn drop(&mut self) {
193+
let rv = unsafe { ll_bindings::tsk_treeseq_free(&mut self.inner) };
194+
assert_eq!(rv, 0);
195+
}
196+
}
175197

176198
impl TreeSequence {
177199
/// Create a tree sequence from a [`TableCollection`].
@@ -475,7 +497,7 @@ impl TreeSequence {
475497
let timestamp = humantime::format_rfc3339(std::time::SystemTime::now()).to_string();
476498
let rv = unsafe {
477499
ll_bindings::tsk_provenance_table_add_row(
478-
&mut (*(*self.inner).tables).provenances,
500+
&mut (*self.inner.tables).provenances,
479501
timestamp.as_ptr() as *mut i8,
480502
timestamp.len() as tsk_size_t,
481503
record.as_ptr() as *mut i8,
@@ -496,37 +518,37 @@ impl TryFrom<TableCollection> for TreeSequence {
496518

497519
impl TableAccess for TreeSequence {
498520
fn edges(&self) -> EdgeTable {
499-
EdgeTable::new_from_table(unsafe { &(*(*self.inner).tables).edges })
521+
EdgeTable::new_from_table(unsafe { &(*self.inner.tables).edges })
500522
}
501523

502524
fn individuals(&self) -> IndividualTable {
503-
IndividualTable::new_from_table(unsafe { &(*(*self.inner).tables).individuals })
525+
IndividualTable::new_from_table(unsafe { &(*self.inner.tables).individuals })
504526
}
505527

506528
fn migrations(&self) -> MigrationTable {
507-
MigrationTable::new_from_table(unsafe { &(*(*self.inner).tables).migrations })
529+
MigrationTable::new_from_table(unsafe { &(*self.inner.tables).migrations })
508530
}
509531

510532
fn nodes(&self) -> NodeTable {
511-
NodeTable::new_from_table(unsafe { &(*(*self.inner).tables).nodes })
533+
NodeTable::new_from_table(unsafe { &(*self.inner.tables).nodes })
512534
}
513535

514536
fn sites(&self) -> SiteTable {
515-
SiteTable::new_from_table(unsafe { &(*(*self.inner).tables).sites })
537+
SiteTable::new_from_table(unsafe { &(*self.inner.tables).sites })
516538
}
517539

518540
fn mutations(&self) -> MutationTable {
519-
MutationTable::new_from_table(unsafe { &(*(*self.inner).tables).mutations })
541+
MutationTable::new_from_table(unsafe { &(*self.inner.tables).mutations })
520542
}
521543

522544
fn populations(&self) -> PopulationTable {
523-
PopulationTable::new_from_table(unsafe { &(*(*self.inner).tables).populations })
545+
PopulationTable::new_from_table(unsafe { &(*self.inner.tables).populations })
524546
}
525547

526548
#[cfg(any(feature = "provenance", doc))]
527549
fn provenances(&self) -> crate::provenance::ProvenanceTable {
528550
crate::provenance::ProvenanceTable::new_from_table(unsafe {
529-
&(*(*self.inner).tables).provenances
551+
&(*self.inner.tables).provenances
530552
})
531553
}
532554
}

0 commit comments

Comments
 (0)