|
1 | 1 | use crate::bindings as ll_bindings; |
2 | 2 | use crate::metadata; |
| 3 | +use crate::metadata::NodeMetadata; |
3 | 4 | use crate::sys; |
4 | 5 | use crate::NodeFlags; |
5 | 6 | use crate::SizeType; |
6 | 7 | use crate::Time; |
7 | 8 | use crate::{tsk_id_t, TskitError}; |
8 | 9 | use crate::{IndividualId, NodeId, PopulationId}; |
9 | 10 |
|
| 11 | +pub(crate) fn add_row_details( |
| 12 | + flags: ll_bindings::tsk_flags_t, |
| 13 | + time: f64, |
| 14 | + population: ll_bindings::tsk_id_t, |
| 15 | + individual: ll_bindings::tsk_id_t, |
| 16 | + metadata: *const std::os::raw::c_char, |
| 17 | + metadata_length: ll_bindings::tsk_size_t, |
| 18 | + table: *mut ll_bindings::tsk_node_table_t, |
| 19 | +) -> Result<NodeId, TskitError> { |
| 20 | + let rv = unsafe { |
| 21 | + ll_bindings::tsk_node_table_add_row( |
| 22 | + table, |
| 23 | + flags, |
| 24 | + time, |
| 25 | + population, |
| 26 | + individual, |
| 27 | + metadata, |
| 28 | + metadata_length, |
| 29 | + ) |
| 30 | + }; |
| 31 | + handle_tsk_return_value!(rv, rv.into()) |
| 32 | +} |
| 33 | + |
| 34 | +pub(crate) fn add_row<F, T, P, I>( |
| 35 | + flags: F, |
| 36 | + time: T, |
| 37 | + population: P, |
| 38 | + individual: I, |
| 39 | + table: *mut ll_bindings::tsk_node_table_t, |
| 40 | +) -> Result<NodeId, TskitError> |
| 41 | +where |
| 42 | + F: Into<NodeFlags>, |
| 43 | + T: Into<Time>, |
| 44 | + P: Into<PopulationId>, |
| 45 | + I: Into<IndividualId>, |
| 46 | +{ |
| 47 | + add_row_details( |
| 48 | + flags.into().bits(), |
| 49 | + time.into().into(), |
| 50 | + population.into().into(), |
| 51 | + individual.into().into(), |
| 52 | + std::ptr::null(), |
| 53 | + 0, |
| 54 | + table, |
| 55 | + ) |
| 56 | +} |
| 57 | + |
| 58 | +pub(crate) fn add_row_with_metadata<F, T, P, I, N>( |
| 59 | + flags: F, |
| 60 | + time: T, |
| 61 | + population: P, |
| 62 | + individual: I, |
| 63 | + metadata: &N, |
| 64 | + table: *mut ll_bindings::tsk_node_table_t, |
| 65 | +) -> Result<NodeId, TskitError> |
| 66 | +where |
| 67 | + F: Into<NodeFlags>, |
| 68 | + T: Into<Time>, |
| 69 | + P: Into<PopulationId>, |
| 70 | + I: Into<IndividualId>, |
| 71 | + N: NodeMetadata, |
| 72 | +{ |
| 73 | + let md = crate::metadata::EncodedMetadata::new(metadata)?; |
| 74 | + let mdlen = md.len()?; |
| 75 | + add_row_details( |
| 76 | + flags.into().bits(), |
| 77 | + time.into().into(), |
| 78 | + population.into().into(), |
| 79 | + individual.into().into(), |
| 80 | + md.as_ptr(), |
| 81 | + mdlen.into(), |
| 82 | + table, |
| 83 | + ) |
| 84 | +} |
| 85 | + |
10 | 86 | /// Row of a [`NodeTable`] |
11 | 87 | #[derive(Debug)] |
12 | 88 | pub struct NodeTableRow { |
@@ -584,8 +660,46 @@ build_owned_table_type!( |
584 | 660 | ); |
585 | 661 |
|
586 | 662 | impl OwningNodeTable { |
587 | | - node_table_add_row!(=> add_row, self, self.as_mut_ptr()); |
588 | | - node_table_add_row_with_metadata!(=> add_row_with_metadata, self, self.as_mut_ptr()); |
| 663 | + pub fn add_row<F, T, P, I>( |
| 664 | + &mut self, |
| 665 | + flags: F, |
| 666 | + time: T, |
| 667 | + population: P, |
| 668 | + individual: I, |
| 669 | + ) -> Result<NodeId, TskitError> |
| 670 | + where |
| 671 | + F: Into<NodeFlags>, |
| 672 | + T: Into<Time>, |
| 673 | + P: Into<PopulationId>, |
| 674 | + I: Into<IndividualId>, |
| 675 | + { |
| 676 | + add_row(flags, time, population, individual, self.as_mut_ptr()) |
| 677 | + } |
| 678 | + |
| 679 | + pub fn add_row_with_metadata<F, T, P, I, N>( |
| 680 | + &mut self, |
| 681 | + flags: F, |
| 682 | + time: T, |
| 683 | + population: P, |
| 684 | + individual: I, |
| 685 | + metadata: &N, |
| 686 | + ) -> Result<NodeId, TskitError> |
| 687 | + where |
| 688 | + F: Into<NodeFlags>, |
| 689 | + T: Into<Time>, |
| 690 | + P: Into<PopulationId>, |
| 691 | + I: Into<IndividualId>, |
| 692 | + N: NodeMetadata, |
| 693 | + { |
| 694 | + add_row_with_metadata( |
| 695 | + flags, |
| 696 | + time, |
| 697 | + population, |
| 698 | + individual, |
| 699 | + metadata, |
| 700 | + self.as_mut_ptr(), |
| 701 | + ) |
| 702 | + } |
589 | 703 | } |
590 | 704 |
|
591 | 705 | #[cfg(test)] |
|
0 commit comments