@@ -23,8 +23,7 @@ use crate::TreeSequenceFlags;
2323use crate :: TskReturnValue ;
2424use crate :: TskitTypeAccess ;
2525use 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;
2827use 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/// ```
167166pub 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
171178unsafe impl Send for TreeSequence { }
172179unsafe 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
176198impl 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
497519impl 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