1- use std:: mem:: MaybeUninit ;
21use std:: ops:: Deref ;
32use std:: ops:: DerefMut ;
43
@@ -13,7 +12,7 @@ use crate::TreeFlags;
1312use crate :: TreeInterface ;
1413use crate :: TreeSequenceFlags ;
1514use crate :: TskReturnValue ;
16- use crate :: { tsk_id_t, tsk_size_t , TableCollection } ;
15+ use crate :: { tsk_id_t, TableCollection } ;
1716use ll_bindings:: tsk_tree_free;
1817use std:: ptr:: NonNull ;
1918
@@ -185,7 +184,7 @@ impl streaming_iterator::DoubleEndedStreamingIterator for Tree {
185184/// assert_eq!(treeseq.nodes_mut().num_rows(), 3);
186185/// ```
187186pub struct TreeSequence {
188- pub ( crate ) inner : ll_bindings :: tsk_treeseq_t ,
187+ pub ( crate ) inner : sys :: LLTreeSeq ,
189188 views : crate :: table_views:: TableViews ,
190189}
191190
@@ -194,7 +193,7 @@ unsafe impl Sync for TreeSequence {}
194193
195194impl Drop for TreeSequence {
196195 fn drop ( & mut self ) {
197- let rv = unsafe { ll_bindings:: tsk_treeseq_free ( & mut self . inner ) } ;
196+ let rv = unsafe { ll_bindings:: tsk_treeseq_free ( self . as_mut_ptr ( ) ) } ;
198197 assert_eq ! ( rv, 0 ) ;
199198 }
200199}
@@ -247,31 +246,24 @@ impl TreeSequence {
247246 tables : TableCollection ,
248247 flags : F ,
249248 ) -> Result < Self , TskitError > {
250- let mut inner = std:: mem:: MaybeUninit :: < ll_bindings:: tsk_treeseq_t > :: uninit ( ) ;
251- let mut flags: u32 = flags. into ( ) . bits ( ) ;
252- flags |= ll_bindings:: TSK_TAKE_OWNERSHIP ;
253249 let raw_tables_ptr = tables. into_raw ( ) ?;
254- let rv =
255- unsafe { ll_bindings:: tsk_treeseq_init ( inner. as_mut_ptr ( ) , raw_tables_ptr, flags) } ;
250+ let mut inner = sys:: LLTreeSeq :: new ( raw_tables_ptr, flags. into ( ) . bits ( ) ) ?;
256251 let views = crate :: table_views:: TableViews :: new_from_tree_sequence ( inner. as_mut_ptr ( ) ) ?;
257- handle_tsk_return_value ! ( rv, {
258- let inner = unsafe { inner. assume_init( ) } ;
259- Self { inner, views }
260- } )
252+ Ok ( Self { inner, views } )
261253 }
262254
263255 fn as_ref ( & self ) -> & ll_bindings:: tsk_treeseq_t {
264- & self . inner
256+ self . inner . as_ref ( )
265257 }
266258
267259 /// Pointer to the low-level C type.
268260 pub fn as_ptr ( & self ) -> * const ll_bindings:: tsk_treeseq_t {
269- & self . inner
261+ self . inner . as_ptr ( )
270262 }
271263
272264 /// Mutable pointer to the low-level C type.
273265 pub fn as_mut_ptr ( & mut self ) -> * mut ll_bindings:: tsk_treeseq_t {
274- & mut self . inner
266+ self . inner . as_mut_ptr ( )
275267 }
276268
277269 /// Dump the tree sequence to file.
@@ -290,11 +282,7 @@ impl TreeSequence {
290282 let c_str = std:: ffi:: CString :: new ( filename) . map_err ( |_| {
291283 TskitError :: LibraryError ( "call to ffi::Cstring::new failed" . to_string ( ) )
292284 } ) ?;
293- let rv = unsafe {
294- ll_bindings:: tsk_treeseq_dump ( self . as_ptr ( ) , c_str. as_ptr ( ) , options. into ( ) . bits ( ) )
295- } ;
296-
297- handle_tsk_return_value ! ( rv)
285+ self . inner . dump ( c_str, options. into ( ) . bits ( ) )
298286 }
299287
300288 /// Load from a file.
@@ -401,7 +389,7 @@ impl TreeSequence {
401389
402390 /// Get the number of trees.
403391 pub fn num_trees ( & self ) -> SizeType {
404- unsafe { ll_bindings :: tsk_treeseq_get_num_trees ( self . as_ptr ( ) ) } . into ( )
392+ self . inner . num_trees ( ) . into ( )
405393 }
406394
407395 /// Calculate the average Kendall-Colijn (`K-C`) distance between
@@ -416,17 +404,12 @@ impl TreeSequence {
416404 /// * `lambda` specifies the relative weight of topology and branch length.
417405 /// See [`TreeInterface::kc_distance`] for more details.
418406 pub fn kc_distance ( & self , other : & TreeSequence , lambda : f64 ) -> Result < f64 , TskitError > {
419- let mut kc: f64 = f64:: NAN ;
420- let kcp: * mut f64 = & mut kc;
421- let code = unsafe {
422- ll_bindings:: tsk_treeseq_kc_distance ( self . as_ptr ( ) , other. as_ptr ( ) , lambda, kcp)
423- } ;
424- handle_tsk_return_value ! ( code, kc)
407+ self . inner . kc_distance ( & other. inner , lambda)
425408 }
426409
427410 // FIXME: document
428411 pub fn num_samples ( & self ) -> SizeType {
429- unsafe { ll_bindings :: tsk_treeseq_get_num_samples ( self . as_ptr ( ) ) } . into ( )
412+ self . inner . num_samples ( ) . into ( )
430413 }
431414
432415 /// Simplify tables and return a new tree sequence.
@@ -448,42 +431,29 @@ impl TreeSequence {
448431 options : O ,
449432 idmap : bool ,
450433 ) -> Result < ( Self , Option < Vec < NodeId > > ) , TskitError > {
451- // The output is an UNINITIALIZED treeseq,
452- // else we leak memory.
453- let mut ts = MaybeUninit :: < ll_bindings:: tsk_treeseq_t > :: uninit ( ) ;
454434 let mut output_node_map: Vec < NodeId > = vec ! [ ] ;
455435 if idmap {
456436 output_node_map. resize ( usize:: try_from ( self . nodes ( ) . num_rows ( ) ) ?, NodeId :: NULL ) ;
457437 }
458- let rv = unsafe {
459- ll_bindings:: tsk_treeseq_simplify (
460- self . as_ptr ( ) ,
461- // NOTE: casting away const-ness:
462- samples. as_ptr ( ) . cast :: < tsk_id_t > ( ) ,
463- samples. len ( ) as tsk_size_t ,
464- options. into ( ) . bits ( ) ,
465- ts. as_mut_ptr ( ) ,
466- match idmap {
467- true => output_node_map. as_mut_ptr ( ) . cast :: < tsk_id_t > ( ) ,
468- false => std:: ptr:: null_mut ( ) ,
469- } ,
470- )
438+ let llsamples = unsafe {
439+ std:: slice:: from_raw_parts ( samples. as_ptr ( ) . cast :: < tsk_id_t > ( ) , samples. len ( ) )
471440 } ;
472- // TODO: is it possible that this can leak somehow?
473- handle_tsk_return_value ! (
474- rv,
475- (
476- {
477- let mut inner = unsafe { ts. assume_init( ) } ;
478- let views = crate :: table_views:: TableViews :: new_from_tree_sequence( & mut inner) ?;
479- Self { inner, views }
480- } ,
481- match idmap {
482- true => Some ( output_node_map) ,
483- false => None ,
484- }
485- )
486- )
441+ let mut inner = self . inner . simplify (
442+ llsamples,
443+ options. into ( ) . bits ( ) ,
444+ match idmap {
445+ true => output_node_map. as_mut_ptr ( ) . cast :: < tsk_id_t > ( ) ,
446+ false => std:: ptr:: null_mut ( ) ,
447+ } ,
448+ ) ?;
449+ let views = crate :: table_views:: TableViews :: new_from_tree_sequence ( inner. as_mut_ptr ( ) ) ?;
450+ Ok ( (
451+ Self { inner, views } ,
452+ match idmap {
453+ true => Some ( output_node_map) ,
454+ false => None ,
455+ } ,
456+ ) )
487457 }
488458
489459 #[ cfg( feature = "provenance" ) ]
@@ -532,11 +502,11 @@ impl TreeSequence {
532502 let timestamp = humantime:: format_rfc3339 ( std:: time:: SystemTime :: now ( ) ) . to_string ( ) ;
533503 let rv = unsafe {
534504 ll_bindings:: tsk_provenance_table_add_row (
535- & mut ( * self . inner . tables ) . provenances ,
505+ & mut ( * self . inner . as_ref ( ) . tables ) . provenances ,
536506 timestamp. as_ptr ( ) as * mut i8 ,
537- timestamp. len ( ) as tsk_size_t ,
507+ timestamp. len ( ) as ll_bindings :: tsk_size_t ,
538508 record. as_ptr ( ) as * mut i8 ,
539- record. len ( ) as tsk_size_t ,
509+ record. len ( ) as ll_bindings :: tsk_size_t ,
540510 )
541511 } ;
542512 handle_tsk_return_value ! ( rv, crate :: ProvenanceId :: from( rv) )
@@ -739,6 +709,7 @@ pub(crate) mod test_trees {
739709
740710 #[ test]
741711 fn test_iterate_samples_two_trees ( ) {
712+ use super :: ll_bindings:: tsk_size_t;
742713 let treeseq = treeseq_from_small_table_collection_two_trees ( ) ;
743714 assert_eq ! ( treeseq. num_trees( ) , 2 ) ;
744715 let mut tree_iter = treeseq. tree_iterator ( TreeFlags :: SAMPLE_LISTS ) . unwrap ( ) ;
0 commit comments