Skip to content

Commit 0389328

Browse files
authored
refactor: add low level owning tables to sys (#433)
1 parent 8c08334 commit 0389328

11 files changed

+213
-116
lines changed

src/_macros.rs

Lines changed: 20 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -375,24 +375,16 @@ macro_rules! handle_metadata_return {
375375
}
376376

377377
macro_rules! build_owned_tables {
378-
($name: ty, $deref: ident, $llname: ty, $init: ident, $free: ident, $clear: expr) => {
378+
($name: ty, $deref: ident, $lltype: ty, $tsktable: ty) => {
379379
impl $name {
380380
fn new() -> Self {
381-
let temp = unsafe { libc::malloc(std::mem::size_of::<$llname>()) as *mut $llname };
382-
let nonnull = match std::ptr::NonNull::<$llname>::new(temp) {
383-
Some(x) => x,
384-
None => panic!("out of memory"),
385-
};
386-
let mut table = unsafe { mbox::MBox::from_non_null_raw(nonnull) };
387-
let rv = unsafe { $init(&mut (*table), 0) };
388-
assert_eq!(rv, 0);
381+
let table = <$lltype>::new();
389382
Self { table }
390383
}
391384

392385
/// Clear the table.
393386
pub fn clear(&mut self) -> $crate::TskReturnValue {
394-
let rv = unsafe { $clear(self.as_mut_ptr()) };
395-
handle_tsk_return_value!(rv)
387+
self.table.clear().map_err(|e| e.into())
396388
}
397389
}
398390

@@ -420,22 +412,13 @@ macro_rules! build_owned_tables {
420412
}
421413
}
422414

423-
impl Drop for $name {
424-
fn drop(&mut self) {
425-
let rv = unsafe { $free(&mut (*self.table)) };
426-
if rv != 0 {
427-
panic!("error when calling {}: {}", stringify!(free), rv);
428-
}
429-
}
430-
}
431-
432415
impl $name {
433-
pub fn as_ptr(&self) -> *const $llname {
434-
&*self.table
416+
pub fn as_ptr(&self) -> *const $tsktable {
417+
self.table.as_ptr()
435418
}
436419

437-
pub fn as_mut_ptr(&mut self) -> *mut $llname {
438-
&mut *self.table as *mut $llname
420+
pub fn as_mut_ptr(&mut self) -> *mut $tsktable {
421+
self.table.as_mut_ptr()
439422
}
440423
}
441424
};
@@ -451,7 +434,7 @@ macro_rules! node_table_add_row_details {
451434
$table: expr) => {{
452435
let rv = unsafe {
453436
$crate::bindings::tsk_node_table_add_row(
454-
&mut $table,
437+
$table,
455438
$flags.into().bits(),
456439
$time.into().into(),
457440
$population.into().into(),
@@ -532,7 +515,7 @@ macro_rules! edge_table_add_row_details {
532515
$table: expr) => {{
533516
let rv = unsafe {
534517
$crate::bindings::tsk_edge_table_add_row(
535-
&mut $table,
518+
$table,
536519
$left.into().into(),
537520
$right.into().into(),
538521
$parent.into().into(),
@@ -605,7 +588,7 @@ macro_rules! edge_table_add_row_with_metadata {
605588
macro_rules! population_table_add_row_details {
606589
($metadata: expr, $metadata_len: expr, $table: expr) => {{
607590
let rv = unsafe {
608-
$crate::bindings::tsk_population_table_add_row(&mut $table, $metadata, $metadata_len)
591+
$crate::bindings::tsk_population_table_add_row($table, $metadata, $metadata_len)
609592
};
610593
handle_tsk_return_value!(rv, rv.into())
611594
}};
@@ -640,7 +623,7 @@ macro_rules! individual_table_add_row_details {
640623
$table: expr) => {{
641624
let rv = unsafe {
642625
$crate::bindings::tsk_individual_table_add_row(
643-
&mut $table,
626+
$table,
644627
$flags.into().bits(),
645628
$location.get_slice().as_ptr().cast::<f64>(),
646629
$location.get_slice().len() as $crate::bindings::tsk_size_t,
@@ -715,7 +698,7 @@ macro_rules! mutation_table_add_row_details {
715698
let dstate = process_state_input!($derived_state);
716699
let rv = unsafe {
717700
$crate::bindings::tsk_mutation_table_add_row(
718-
&mut $table,
701+
$table,
719702
$site.into().into(),
720703
$node.into().into(),
721704
$parent.into().into(),
@@ -796,7 +779,7 @@ macro_rules! site_table_add_row_details {
796779
let astate = process_state_input!($ancestral_state);
797780
let rv = unsafe {
798781
$crate::bindings::tsk_site_table_add_row(
799-
&mut $table,
782+
$table,
800783
$position.into().into(),
801784
astate.0,
802785
astate.1,
@@ -853,7 +836,7 @@ macro_rules! migration_table_add_row_details {
853836
$table: expr) => {{
854837
let rv = unsafe {
855838
$crate::bindings::tsk_migration_table_add_row(
856-
&mut $table,
839+
$table,
857840
$span.0.into().into(),
858841
$span.1.into().into(),
859842
$node.into().into(),
@@ -928,7 +911,7 @@ macro_rules! provenance_table_add_row {
928911
let timestamp = humantime::format_rfc3339(std::time::SystemTime::now()).to_string();
929912
let rv = unsafe {
930913
$crate::bindings::tsk_provenance_table_add_row(
931-
&mut $table,
914+
$table,
932915
timestamp.as_ptr() as *mut i8,
933916
timestamp.len() as tsk_size_t,
934917
record.as_ptr() as *mut i8,
@@ -943,22 +926,18 @@ macro_rules! provenance_table_add_row {
943926
macro_rules! build_owned_table_type {
944927
($(#[$attr:meta])* => $name: ident,
945928
$deref_type: ident,
946-
$tskname: ident,
947-
$tskinit: ident,
948-
$tskfree: ident,
949-
$tskclear: expr) => {
929+
$lltype: ty,
930+
$tsktable: ty) => {
950931
$(#[$attr])*
951932
pub struct $name {
952-
table: mbox::MBox<$crate::bindings::$tskname>,
933+
table: $lltype
953934
}
954935

955936
build_owned_tables!(
956937
$name,
957938
$deref_type,
958-
$crate::bindings::$tskname,
959-
$tskinit,
960-
$tskfree,
961-
$tskclear
939+
$lltype,
940+
$tsktable
962941
);
963942
};
964943
}

src/edge_table.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use crate::sys;
44
use crate::Position;
55
use crate::{tsk_id_t, TskitError};
66
use crate::{EdgeId, NodeId};
7-
use ll_bindings::{tsk_edge_table_free, tsk_edge_table_init};
87

98
/// Row of an [`EdgeTable`]
109
#[derive(Debug)]
@@ -360,13 +359,11 @@ build_owned_table_type!(
360359
/// ```
361360
=> OwningEdgeTable,
362361
EdgeTable,
363-
tsk_edge_table_t,
364-
tsk_edge_table_init,
365-
tsk_edge_table_free,
366-
crate::bindings::tsk_edge_table_clear
362+
crate::sys::LLOwningEdgeTable,
363+
crate::bindings::tsk_edge_table_t
367364
);
368365

369366
impl OwningEdgeTable {
370-
edge_table_add_row!(=> add_row, self, *self.table);
371-
edge_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
367+
edge_table_add_row!(=> add_row, self, self.as_mut_ptr());
368+
edge_table_add_row_with_metadata!(=> add_row_with_metadata, self, self.as_mut_ptr());
372369
}

src/individual_table.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use crate::IndividualFlags;
55
use crate::IndividualId;
66
use crate::Location;
77
use crate::{tsk_id_t, TskitError};
8-
use ll_bindings::{tsk_individual_table_free, tsk_individual_table_init};
98

109
/// Row of a [`IndividualTable`]
1110
#[derive(Debug)]
@@ -488,13 +487,11 @@ build_owned_table_type!(
488487
/// ```
489488
=> OwningIndividualTable,
490489
IndividualTable,
491-
tsk_individual_table_t,
492-
tsk_individual_table_init,
493-
tsk_individual_table_free,
494-
crate::bindings::tsk_individual_table_clear
490+
crate::sys::LLOwningIndividualTable,
491+
crate::bindings::tsk_individual_table_t
495492
);
496493

497494
impl OwningIndividualTable {
498-
individual_table_add_row!(=> add_row, self, *self.table);
499-
individual_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
495+
individual_table_add_row!(=> add_row, self, self.as_mut_ptr());
496+
individual_table_add_row_with_metadata!(=> add_row_with_metadata, self, self.as_mut_ptr());
500497
}

src/migration_table.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use crate::SizeType;
66
use crate::Time;
77
use crate::{tsk_id_t, TskitError};
88
use crate::{MigrationId, NodeId, PopulationId};
9-
use ll_bindings::{tsk_migration_table_free, tsk_migration_table_init};
109

1110
/// Row of a [`MigrationTable`]
1211
#[derive(Debug)]
@@ -419,13 +418,11 @@ build_owned_table_type!(
419418
/// ```
420419
=> OwningMigrationTable,
421420
MigrationTable,
422-
tsk_migration_table_t,
423-
tsk_migration_table_init,
424-
tsk_migration_table_free,
425-
ll_bindings::tsk_migration_table_clear
421+
crate::sys::LLOwningMigrationTable,
422+
crate::bindings::tsk_migration_table_t
426423
);
427424

428425
impl OwningMigrationTable {
429-
migration_table_add_row!(=> add_row, self, *self.table);
430-
migration_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
426+
migration_table_add_row!(=> add_row, self, self.as_mut_ptr());
427+
migration_table_add_row_with_metadata!(=> add_row_with_metadata, self, self.as_mut_ptr());
431428
}

src/mutation_table.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use crate::SizeType;
55
use crate::Time;
66
use crate::{tsk_id_t, TskitError};
77
use crate::{MutationId, NodeId, SiteId};
8-
use ll_bindings::{tsk_mutation_table_free, tsk_mutation_table_init};
98

109
/// Row of a [`MutationTable`]
1110
#[derive(Debug)]
@@ -394,13 +393,11 @@ build_owned_table_type!(
394393
/// ```
395394
=> OwningMutationTable,
396395
MutationTable,
397-
tsk_mutation_table_t,
398-
tsk_mutation_table_init,
399-
tsk_mutation_table_free,
400-
ll_bindings::tsk_mutation_table_clear
396+
crate::sys::LLOwningMutationTable,
397+
crate::bindings::tsk_mutation_table_t
401398
);
402399

403400
impl OwningMutationTable {
404-
mutation_table_add_row!(=> add_row, self, *self.table);
405-
mutation_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
401+
mutation_table_add_row!(=> add_row, self, self.as_mut_ptr());
402+
mutation_table_add_row_with_metadata!(=> add_row_with_metadata, self, self.as_mut_ptr());
406403
}

src/node_table.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use crate::SizeType;
66
use crate::Time;
77
use crate::{tsk_id_t, TskitError};
88
use crate::{IndividualId, NodeId, PopulationId};
9-
use ll_bindings::{tsk_node_table_free, tsk_node_table_init};
109

1110
/// Row of a [`NodeTable`]
1211
#[derive(Debug)]
@@ -583,15 +582,13 @@ build_owned_table_type!(
583582
/// ```
584583
=> OwningNodeTable,
585584
NodeTable,
586-
tsk_node_table_t,
587-
tsk_node_table_init,
588-
tsk_node_table_free,
589-
ll_bindings::tsk_node_table_clear
585+
crate::sys::LLOwningNodeTable,
586+
crate::bindings::tsk_node_table_t
590587
);
591588

592589
impl OwningNodeTable {
593-
node_table_add_row!(=> add_row, self, (*self.table));
594-
node_table_add_row_with_metadata!(=> add_row_with_metadata, self, (*self.table));
590+
node_table_add_row!(=> add_row, self, self.as_mut_ptr());
591+
node_table_add_row_with_metadata!(=> add_row_with_metadata, self, self.as_mut_ptr());
595592
}
596593

597594
#[cfg(test)]

src/population_table.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use crate::tsk_id_t;
55
use crate::PopulationId;
66
use crate::SizeType;
77
use crate::TskitError;
8-
use ll_bindings::{tsk_population_table_free, tsk_population_table_init};
98

109
/// Row of a [`PopulationTable`]
1110
#[derive(Eq, Debug)]
@@ -258,13 +257,11 @@ build_owned_table_type!(
258257
/// ```
259258
=> OwningPopulationTable,
260259
PopulationTable,
261-
tsk_population_table_t,
262-
tsk_population_table_init,
263-
tsk_population_table_free,
264-
ll_bindings::tsk_population_table_clear
260+
crate::sys::LLOwningPopulationTable,
261+
crate::bindings::tsk_population_table_t
265262
);
266263

267264
impl OwningPopulationTable {
268-
population_table_add_row!(=> add_row, self, *self.table);
269-
population_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
265+
population_table_add_row!(=> add_row, self, self.as_mut_ptr());
266+
population_table_add_row_with_metadata!(=> add_row_with_metadata, self, self.as_mut_ptr());
270267
}

src/provenance.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use crate::bindings as ll_bindings;
1414
use crate::sys;
1515
use crate::SizeType;
1616
use crate::{tsk_id_t, tsk_size_t, ProvenanceId};
17-
use ll_bindings::{tsk_provenance_table_free, tsk_provenance_table_init};
1817

1918
#[derive(Eq, Debug)]
2019
/// Row of a [`ProvenanceTable`].
@@ -287,14 +286,12 @@ build_owned_table_type!(
287286
/// ```
288287
=> OwningProvenanceTable,
289288
ProvenanceTable,
290-
tsk_provenance_table_t,
291-
tsk_provenance_table_init,
292-
tsk_provenance_table_free,
293-
ll_bindings::tsk_provenance_table_clear
289+
crate::sys::LLOwningProvenanceTable,
290+
crate::bindings::tsk_provenance_table_t
294291
);
295292

296293
impl OwningProvenanceTable {
297-
provenance_table_add_row!(=> add_row, self, *self.table);
294+
provenance_table_add_row!(=> add_row, self, self.as_mut_ptr());
298295
}
299296

300297
#[cfg(test)]

src/site_table.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use crate::Position;
66
use crate::SiteId;
77
use crate::SizeType;
88
use crate::TskitError;
9-
use ll_bindings::{tsk_site_table_free, tsk_site_table_init};
109

1110
/// Row of a [`SiteTable`]
1211
#[derive(Debug)]
@@ -309,13 +308,11 @@ build_owned_table_type!(
309308
/// ```
310309
=> OwningSiteTable,
311310
SiteTable,
312-
tsk_site_table_t,
313-
tsk_site_table_init,
314-
tsk_site_table_free,
315-
ll_bindings::tsk_site_table_clear
311+
crate::sys::LLOwningSiteTable,
312+
crate::bindings::tsk_site_table_t
316313
);
317314

318315
impl OwningSiteTable {
319-
site_table_add_row!(=> add_row, self, *self.table);
320-
site_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
316+
site_table_add_row!(=> add_row, self, self.as_mut_ptr());
317+
site_table_add_row_with_metadata!(=> add_row_with_metadata, self, self.as_mut_ptr());
321318
}

0 commit comments

Comments
 (0)