@@ -23,8 +23,7 @@ use crate::TreeSequenceFlags;
23
23
use crate :: TskReturnValue ;
24
24
use crate :: TskitTypeAccess ;
25
25
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;
28
27
use std:: ptr:: NonNull ;
29
28
30
29
/// A Tree.
@@ -165,13 +164,36 @@ impl streaming_iterator::DoubleEndedStreamingIterator for Tree {
165
164
/// let treeseq = tables.tree_sequence(tskit::TreeSequenceFlags::default()).unwrap();
166
165
/// ```
167
166
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
+ }
169
176
}
170
177
171
178
unsafe impl Send for TreeSequence { }
172
179
unsafe impl Sync for TreeSequence { }
173
180
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
+ }
175
197
176
198
impl TreeSequence {
177
199
/// Create a tree sequence from a [`TableCollection`].
@@ -475,7 +497,7 @@ impl TreeSequence {
475
497
let timestamp = humantime:: format_rfc3339 ( std:: time:: SystemTime :: now ( ) ) . to_string ( ) ;
476
498
let rv = unsafe {
477
499
ll_bindings:: tsk_provenance_table_add_row (
478
- & mut ( * ( * self . inner ) . tables ) . provenances ,
500
+ & mut ( * self . inner . tables ) . provenances ,
479
501
timestamp. as_ptr ( ) as * mut i8 ,
480
502
timestamp. len ( ) as tsk_size_t ,
481
503
record. as_ptr ( ) as * mut i8 ,
@@ -496,37 +518,37 @@ impl TryFrom<TableCollection> for TreeSequence {
496
518
497
519
impl TableAccess for TreeSequence {
498
520
fn edges ( & self ) -> EdgeTable {
499
- EdgeTable :: new_from_table ( unsafe { & ( * ( * self . inner ) . tables ) . edges } )
521
+ EdgeTable :: new_from_table ( unsafe { & ( * self . inner . tables ) . edges } )
500
522
}
501
523
502
524
fn individuals ( & self ) -> IndividualTable {
503
- IndividualTable :: new_from_table ( unsafe { & ( * ( * self . inner ) . tables ) . individuals } )
525
+ IndividualTable :: new_from_table ( unsafe { & ( * self . inner . tables ) . individuals } )
504
526
}
505
527
506
528
fn migrations ( & self ) -> MigrationTable {
507
- MigrationTable :: new_from_table ( unsafe { & ( * ( * self . inner ) . tables ) . migrations } )
529
+ MigrationTable :: new_from_table ( unsafe { & ( * self . inner . tables ) . migrations } )
508
530
}
509
531
510
532
fn nodes ( & self ) -> NodeTable {
511
- NodeTable :: new_from_table ( unsafe { & ( * ( * self . inner ) . tables ) . nodes } )
533
+ NodeTable :: new_from_table ( unsafe { & ( * self . inner . tables ) . nodes } )
512
534
}
513
535
514
536
fn sites ( & self ) -> SiteTable {
515
- SiteTable :: new_from_table ( unsafe { & ( * ( * self . inner ) . tables ) . sites } )
537
+ SiteTable :: new_from_table ( unsafe { & ( * self . inner . tables ) . sites } )
516
538
}
517
539
518
540
fn mutations ( & self ) -> MutationTable {
519
- MutationTable :: new_from_table ( unsafe { & ( * ( * self . inner ) . tables ) . mutations } )
541
+ MutationTable :: new_from_table ( unsafe { & ( * self . inner . tables ) . mutations } )
520
542
}
521
543
522
544
fn populations ( & self ) -> PopulationTable {
523
- PopulationTable :: new_from_table ( unsafe { & ( * ( * self . inner ) . tables ) . populations } )
545
+ PopulationTable :: new_from_table ( unsafe { & ( * self . inner . tables ) . populations } )
524
546
}
525
547
526
548
#[ cfg( any( feature = "provenance" , doc) ) ]
527
549
fn provenances ( & self ) -> crate :: provenance:: ProvenanceTable {
528
550
crate :: provenance:: ProvenanceTable :: new_from_table ( unsafe {
529
- & ( * ( * self . inner ) . tables ) . provenances
551
+ & ( * self . inner . tables ) . provenances
530
552
} )
531
553
}
532
554
}
0 commit comments