1
- use std:: mem:: MaybeUninit ;
2
1
use std:: ops:: Deref ;
3
2
use std:: ops:: DerefMut ;
4
3
@@ -13,7 +12,7 @@ use crate::TreeFlags;
13
12
use crate :: TreeInterface ;
14
13
use crate :: TreeSequenceFlags ;
15
14
use crate :: TskReturnValue ;
16
- use crate :: { tsk_id_t, tsk_size_t , TableCollection } ;
15
+ use crate :: { tsk_id_t, TableCollection } ;
17
16
use ll_bindings:: tsk_tree_free;
18
17
use std:: ptr:: NonNull ;
19
18
@@ -185,7 +184,7 @@ impl streaming_iterator::DoubleEndedStreamingIterator for Tree {
185
184
/// assert_eq!(treeseq.nodes_mut().num_rows(), 3);
186
185
/// ```
187
186
pub struct TreeSequence {
188
- pub ( crate ) inner : ll_bindings :: tsk_treeseq_t ,
187
+ pub ( crate ) inner : sys :: LLTreeSeq ,
189
188
views : crate :: table_views:: TableViews ,
190
189
}
191
190
@@ -194,7 +193,7 @@ unsafe impl Sync for TreeSequence {}
194
193
195
194
impl Drop for TreeSequence {
196
195
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 ( ) ) } ;
198
197
assert_eq ! ( rv, 0 ) ;
199
198
}
200
199
}
@@ -247,31 +246,24 @@ impl TreeSequence {
247
246
tables : TableCollection ,
248
247
flags : F ,
249
248
) -> 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 ;
253
249
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 ( ) ) ?;
256
251
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 } )
261
253
}
262
254
263
255
fn as_ref ( & self ) -> & ll_bindings:: tsk_treeseq_t {
264
- & self . inner
256
+ self . inner . as_ref ( )
265
257
}
266
258
267
259
/// Pointer to the low-level C type.
268
260
pub fn as_ptr ( & self ) -> * const ll_bindings:: tsk_treeseq_t {
269
- & self . inner
261
+ self . inner . as_ptr ( )
270
262
}
271
263
272
264
/// Mutable pointer to the low-level C type.
273
265
pub fn as_mut_ptr ( & mut self ) -> * mut ll_bindings:: tsk_treeseq_t {
274
- & mut self . inner
266
+ self . inner . as_mut_ptr ( )
275
267
}
276
268
277
269
/// Dump the tree sequence to file.
@@ -290,11 +282,7 @@ impl TreeSequence {
290
282
let c_str = std:: ffi:: CString :: new ( filename) . map_err ( |_| {
291
283
TskitError :: LibraryError ( "call to ffi::Cstring::new failed" . to_string ( ) )
292
284
} ) ?;
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 ( ) )
298
286
}
299
287
300
288
/// Load from a file.
@@ -401,7 +389,7 @@ impl TreeSequence {
401
389
402
390
/// Get the number of trees.
403
391
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 ( )
405
393
}
406
394
407
395
/// Calculate the average Kendall-Colijn (`K-C`) distance between
@@ -416,17 +404,12 @@ impl TreeSequence {
416
404
/// * `lambda` specifies the relative weight of topology and branch length.
417
405
/// See [`TreeInterface::kc_distance`] for more details.
418
406
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)
425
408
}
426
409
427
410
// FIXME: document
428
411
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 ( )
430
413
}
431
414
432
415
/// Simplify tables and return a new tree sequence.
@@ -448,42 +431,29 @@ impl TreeSequence {
448
431
options : O ,
449
432
idmap : bool ,
450
433
) -> 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 ( ) ;
454
434
let mut output_node_map: Vec < NodeId > = vec ! [ ] ;
455
435
if idmap {
456
436
output_node_map. resize ( usize:: try_from ( self . nodes ( ) . num_rows ( ) ) ?, NodeId :: NULL ) ;
457
437
}
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 ( ) )
471
440
} ;
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
+ ) )
487
457
}
488
458
489
459
#[ cfg( feature = "provenance" ) ]
@@ -532,11 +502,11 @@ impl TreeSequence {
532
502
let timestamp = humantime:: format_rfc3339 ( std:: time:: SystemTime :: now ( ) ) . to_string ( ) ;
533
503
let rv = unsafe {
534
504
ll_bindings:: tsk_provenance_table_add_row (
535
- & mut ( * self . inner . tables ) . provenances ,
505
+ & mut ( * self . inner . as_ref ( ) . tables ) . provenances ,
536
506
timestamp. as_ptr ( ) as * mut i8 ,
537
- timestamp. len ( ) as tsk_size_t ,
507
+ timestamp. len ( ) as ll_bindings :: tsk_size_t ,
538
508
record. as_ptr ( ) as * mut i8 ,
539
- record. len ( ) as tsk_size_t ,
509
+ record. len ( ) as ll_bindings :: tsk_size_t ,
540
510
)
541
511
} ;
542
512
handle_tsk_return_value ! ( rv, crate :: ProvenanceId :: from( rv) )
@@ -739,6 +709,7 @@ pub(crate) mod test_trees {
739
709
740
710
#[ test]
741
711
fn test_iterate_samples_two_trees ( ) {
712
+ use super :: ll_bindings:: tsk_size_t;
742
713
let treeseq = treeseq_from_small_table_collection_two_trees ( ) ;
743
714
assert_eq ! ( treeseq. num_trees( ) , 2 ) ;
744
715
let mut tree_iter = treeseq. tree_iterator ( TreeFlags :: SAMPLE_LISTS ) . unwrap ( ) ;
0 commit comments