1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use crate::bindings as ll_bindings;
use crate::metadata;
use crate::TskitError;
use crate::{tsk_id_t, tsk_size_t};
#[derive(Eq)]
pub struct PopulationTableRow {
pub id: tsk_id_t,
pub metadata: Option<Vec<u8>>,
}
impl PartialEq for PopulationTableRow {
fn eq(&self, other: &Self) -> bool {
self.id == other.id && self.metadata == other.metadata
}
}
fn make_population_table_row(
table: &PopulationTable,
pos: tsk_id_t,
decode_metadata: bool,
) -> Option<PopulationTableRow> {
if pos < table.num_rows() as tsk_id_t {
let rv = PopulationTableRow {
id: pos,
metadata: match decode_metadata {
true => match metadata_to_vector!(table, pos).unwrap() {
Some(x) => Some(x),
None => None,
},
false => None,
},
};
Some(rv)
} else {
None
}
}
pub type PopulationTableRefIterator<'a> =
crate::table_iterator::TableIterator<&'a PopulationTable<'a>>;
pub type PopulationTableIterator<'a> = crate::table_iterator::TableIterator<PopulationTable<'a>>;
impl<'a> Iterator for PopulationTableRefIterator<'a> {
type Item = PopulationTableRow;
fn next(&mut self) -> Option<Self::Item> {
let rv = make_population_table_row(&self.table, self.pos, self.decode_metadata);
self.pos += 1;
rv
}
}
impl<'a> Iterator for PopulationTableIterator<'a> {
type Item = PopulationTableRow;
fn next(&mut self) -> Option<Self::Item> {
let rv = make_population_table_row(&self.table, self.pos, self.decode_metadata);
self.pos += 1;
rv
}
}
pub struct PopulationTable<'a> {
table_: &'a ll_bindings::tsk_population_table_t,
}
impl<'a> PopulationTable<'a> {
pub(crate) fn new_from_table(mutations: &'a ll_bindings::tsk_population_table_t) -> Self {
PopulationTable { table_: mutations }
}
pub fn num_rows(&'a self) -> tsk_size_t {
self.table_.num_rows
}
pub fn metadata<T: metadata::MetadataRoundtrip>(
&'a self,
row: tsk_id_t,
) -> Result<Option<T>, TskitError> {
let buffer = metadata_to_vector!(self, row)?;
decode_metadata_row!(T, buffer)
}
pub fn iter(&self, decode_metadata: bool) -> PopulationTableRefIterator {
crate::table_iterator::make_table_iterator::<&PopulationTable<'a>>(&self, decode_metadata)
}
pub fn row(
&self,
r: tsk_id_t,
decode_metadata: bool,
) -> Result<PopulationTableRow, TskitError> {
table_row_access!(r, decode_metadata, self, make_population_table_row)
}
}