Skip to content

Commit ec0adc3

Browse files
authored
streamline API for creating table row objects (#126)
Closes #117
1 parent edd36fa commit ec0adc3

13 files changed

+103
-235
lines changed

src/_macros.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,8 @@ macro_rules! decode_metadata_row {
156156
}
157157

158158
macro_rules! table_row_decode_metadata {
159-
($decode_metadata: ident, $table: ident, $pos: ident) => {
160-
match $decode_metadata {
161-
true => metadata_to_vector!($table, $pos).unwrap().map(|x| x),
162-
false => None,
163-
}
159+
($table: ident, $pos: ident) => {
160+
metadata_to_vector!($table, $pos).unwrap().map(|x| x)
164161
};
165162
}
166163

@@ -191,11 +188,11 @@ macro_rules! err_if_not_tracking_samples {
191188
// Here, we convert the None type to an Error,
192189
// as it applies $row is out of range.
193190
macro_rules! table_row_access {
194-
($row: expr, $decode_metadata: expr, $table: expr, $row_fn: ident) => {
191+
($row: expr, $table: expr, $row_fn: ident) => {
195192
if $row < 0 {
196193
Err(TskitError::IndexError)
197194
} else {
198-
match $row_fn($table, $row, $decode_metadata) {
195+
match $row_fn($table, $row) {
199196
Some(x) => Ok(x),
200197
None => Err(TskitError::IndexError),
201198
}

src/edge_table.rs

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,15 @@ impl PartialEq for EdgeTableRow {
2323
}
2424
}
2525

26-
fn make_edge_table_row(
27-
table: &EdgeTable,
28-
pos: tsk_id_t,
29-
decode_metadata: bool,
30-
) -> Option<EdgeTableRow> {
26+
fn make_edge_table_row(table: &EdgeTable, pos: tsk_id_t) -> Option<EdgeTableRow> {
3127
if pos < table.num_rows() as tsk_id_t {
3228
let rv = EdgeTableRow {
3329
id: pos,
3430
left: table.left(pos).unwrap(),
3531
right: table.right(pos).unwrap(),
3632
parent: table.parent(pos).unwrap(),
3733
child: table.child(pos).unwrap(),
38-
metadata: table_row_decode_metadata!(decode_metadata, table, pos),
34+
metadata: table_row_decode_metadata!(table, pos),
3935
};
4036
Some(rv)
4137
} else {
@@ -50,7 +46,7 @@ impl<'a> Iterator for EdgeTableRefIterator<'a> {
5046
type Item = EdgeTableRow;
5147

5248
fn next(&mut self) -> Option<Self::Item> {
53-
let rv = make_edge_table_row(self.table, self.pos, self.decode_metadata);
49+
let rv = make_edge_table_row(self.table, self.pos);
5450
self.pos += 1;
5551
rv
5652
}
@@ -60,7 +56,7 @@ impl<'a> Iterator for EdgeTableIterator<'a> {
6056
type Item = EdgeTableRow;
6157

6258
fn next(&mut self) -> Option<Self::Item> {
63-
let rv = make_edge_table_row(&self.table, self.pos, self.decode_metadata);
59+
let rv = make_edge_table_row(&self.table, self.pos);
6460
self.pos += 1;
6561
rv
6662
}
@@ -136,31 +132,20 @@ impl<'a> EdgeTable<'a> {
136132
/// Return an iterator over rows of the table.
137133
/// The value of the iterator is [`EdgeTableRow`].
138134
///
139-
/// # Parameters
140-
///
141-
/// * `decode_metadata`: if `true`, then a *copy* of row metadata
142-
/// will be provided in [`EdgeTableRow::metadata`].
143-
/// The meta data are *not* decoded.
144-
/// Rows with no metadata will contain the value `None`.
145-
///
146-
pub fn iter(&self, decode_metadata: bool) -> EdgeTableRefIterator {
147-
crate::table_iterator::make_table_iterator::<&EdgeTable<'a>>(&self, decode_metadata)
135+
pub fn iter(&self) -> EdgeTableRefIterator {
136+
crate::table_iterator::make_table_iterator::<&EdgeTable<'a>>(&self)
148137
}
149138

150139
/// Return row `r` of the table.
151140
///
152141
/// # Parameters
153142
///
154143
/// * `r`: the row id.
155-
/// * `decode_metadata`: if `true`, then a *copy* of row metadata
156-
/// will be provided in [`EdgeTableRow::metadata`].
157-
/// The meta data are *not* decoded.
158-
/// Rows with no metadata will contain the value `None`.
159144
///
160145
/// # Errors
161146
///
162147
/// [`TskitError::IndexError`] if `r` is out of range.
163-
pub fn row(&self, r: tsk_id_t, decode_metadata: bool) -> Result<EdgeTableRow, TskitError> {
164-
table_row_access!(r, decode_metadata, self, make_edge_table_row)
148+
pub fn row(&self, r: tsk_id_t) -> Result<EdgeTableRow, TskitError> {
149+
table_row_access!(r, self, make_edge_table_row)
165150
}
166151
}

src/individual_table.rs

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,14 @@ pub struct IndividualTable<'a> {
4747
table_: &'a ll_bindings::tsk_individual_table_t,
4848
}
4949

50-
fn make_individual_table_row(
51-
table: &IndividualTable,
52-
pos: tsk_id_t,
53-
decode_metadata: bool,
54-
) -> Option<IndividualTableRow> {
50+
fn make_individual_table_row(table: &IndividualTable, pos: tsk_id_t) -> Option<IndividualTableRow> {
5551
if pos < table.num_rows() as tsk_id_t {
5652
let rv = IndividualTableRow {
5753
id: pos,
5854
flags: table.flags(pos).unwrap(),
5955
location: table.location(pos).unwrap(),
6056
parents: table.parents(pos).unwrap(),
61-
metadata: table_row_decode_metadata!(decode_metadata, table, pos),
57+
metadata: table_row_decode_metadata!(table, pos),
6258
};
6359
Some(rv)
6460
} else {
@@ -139,35 +135,20 @@ impl<'a> IndividualTable<'a> {
139135
/// Return an iterator over rows of the table.
140136
/// The value of the iterator is [`IndividualTableRow`].
141137
///
142-
/// # Parameters
143-
///
144-
/// * `decode_metadata`: if `true`, then a *copy* of row metadata
145-
/// will be provided in [`IndividualTableRow::metadata`].
146-
/// The meta data are *not* decoded.
147-
/// Rows with no metadata will contain the value `None`.
148-
///
149-
pub fn iter(&self, decode_metadata: bool) -> IndividualTableRefIterator {
150-
crate::table_iterator::make_table_iterator::<&IndividualTable<'a>>(&self, decode_metadata)
138+
pub fn iter(&self) -> IndividualTableRefIterator {
139+
crate::table_iterator::make_table_iterator::<&IndividualTable<'a>>(&self)
151140
}
152141

153142
/// Return row `r` of the table.
154143
///
155144
/// # Parameters
156145
///
157146
/// * `r`: the row id.
158-
/// * `decode_metadata`: if `true`, then a *copy* of row metadata
159-
/// will be provided in [`IndividualTableRow::metadata`].
160-
/// The meta data are *not* decoded.
161-
/// Rows with no metadata will contain the value `None`.
162147
///
163148
/// # Errors
164149
///
165150
/// [`TskitError::IndexError`] if `r` is out of range.
166-
pub fn row(
167-
&self,
168-
r: tsk_id_t,
169-
decode_metadata: bool,
170-
) -> Result<IndividualTableRow, TskitError> {
171-
table_row_access!(r, decode_metadata, self, make_individual_table_row)
151+
pub fn row(&self, r: tsk_id_t) -> Result<IndividualTableRow, TskitError> {
152+
table_row_access!(r, self, make_individual_table_row)
172153
}
173154
}

src/migration_table.rs

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,7 @@ impl PartialEq for MigrationTableRow {
2727
}
2828
}
2929

30-
fn make_migration_table_row(
31-
table: &MigrationTable,
32-
pos: tsk_id_t,
33-
decode_metadata: bool,
34-
) -> Option<MigrationTableRow> {
30+
fn make_migration_table_row(table: &MigrationTable, pos: tsk_id_t) -> Option<MigrationTableRow> {
3531
if pos < table.num_rows() as tsk_id_t {
3632
Some(MigrationTableRow {
3733
id: pos,
@@ -41,7 +37,7 @@ fn make_migration_table_row(
4137
source: table.source(pos).unwrap(),
4238
dest: table.dest(pos).unwrap(),
4339
time: table.time(pos).unwrap(),
44-
metadata: table_row_decode_metadata!(decode_metadata, table, pos),
40+
metadata: table_row_decode_metadata!(table, pos),
4541
})
4642
} else {
4743
None
@@ -56,7 +52,7 @@ impl<'a> Iterator for MigrationTableRefIterator<'a> {
5652
type Item = MigrationTableRow;
5753

5854
fn next(&mut self) -> Option<Self::Item> {
59-
let rv = make_migration_table_row(self.table, self.pos, self.decode_metadata);
55+
let rv = make_migration_table_row(self.table, self.pos);
6056
self.pos += 1;
6157
rv
6258
}
@@ -66,7 +62,7 @@ impl<'a> Iterator for MigrationTableIterator<'a> {
6662
type Item = crate::migration_table::MigrationTableRow;
6763

6864
fn next(&mut self) -> Option<Self::Item> {
69-
let rv = make_migration_table_row(&self.table, self.pos, self.decode_metadata);
65+
let rv = make_migration_table_row(&self.table, self.pos);
7066
self.pos += 1;
7167
rv
7268
}
@@ -160,32 +156,20 @@ impl<'a> MigrationTable<'a> {
160156

161157
/// Return an iterator over rows of the table.
162158
/// The value of the iterator is [`MigrationTableRow`].
163-
///
164-
/// # Parameters
165-
///
166-
/// * `decode_metadata`: if `true`, then a *copy* of row metadata
167-
/// will be provided in [`MigrationTableRow::metadata`].
168-
/// The meta data are *not* decoded.
169-
/// Rows with no metadata will contain the value `None`.
170-
///
171-
pub fn iter(&self, decode_metadata: bool) -> MigrationTableRefIterator {
172-
crate::table_iterator::make_table_iterator::<&MigrationTable<'a>>(&self, decode_metadata)
159+
pub fn iter(&self) -> MigrationTableRefIterator {
160+
crate::table_iterator::make_table_iterator::<&MigrationTable<'a>>(&self)
173161
}
174162

175163
/// Return row `r` of the table.
176164
///
177165
/// # Parameters
178166
///
179167
/// * `r`: the row id.
180-
/// * `decode_metadata`: if `true`, then a *copy* of row metadata
181-
/// will be provided in [`MigrationTableRow::metadata`].
182-
/// The meta data are *not* decoded.
183-
/// Rows with no metadata will contain the value `None`.
184168
///
185169
/// # Errors
186170
///
187171
/// [`TskitError::IndexError`] if `r` is out of range.
188-
pub fn row(&self, r: tsk_id_t, decode_metadata: bool) -> Result<MigrationTableRow, TskitError> {
189-
table_row_access!(r, decode_metadata, self, make_migration_table_row)
172+
pub fn row(&self, r: tsk_id_t) -> Result<MigrationTableRow, TskitError> {
173+
table_row_access!(r, self, make_migration_table_row)
190174
}
191175
}

src/mutation_table.rs

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,7 @@ impl PartialEq for MutationTableRow {
2525
}
2626
}
2727

28-
fn make_mutation_table_row(
29-
table: &MutationTable,
30-
pos: tsk_id_t,
31-
decode_metadata: bool,
32-
) -> Option<MutationTableRow> {
28+
fn make_mutation_table_row(table: &MutationTable, pos: tsk_id_t) -> Option<MutationTableRow> {
3329
if pos < table.num_rows() as tsk_id_t {
3430
let rv = MutationTableRow {
3531
id: pos,
@@ -38,7 +34,7 @@ fn make_mutation_table_row(
3834
parent: table.parent(pos).unwrap(),
3935
time: table.time(pos).unwrap(),
4036
derived_state: table.derived_state(pos).unwrap(),
41-
metadata: table_row_decode_metadata!(decode_metadata, table, pos),
37+
metadata: table_row_decode_metadata!(table, pos),
4238
};
4339
Some(rv)
4440
} else {
@@ -52,7 +48,7 @@ impl<'a> Iterator for MutationTableRefIterator<'a> {
5248
type Item = MutationTableRow;
5349

5450
fn next(&mut self) -> Option<Self::Item> {
55-
let rv = make_mutation_table_row(&self.table, self.pos, self.decode_metadata);
51+
let rv = make_mutation_table_row(&self.table, self.pos);
5652
self.pos += 1;
5753
rv
5854
}
@@ -62,7 +58,7 @@ impl<'a> Iterator for MutationTableIterator<'a> {
6258
type Item = MutationTableRow;
6359

6460
fn next(&mut self) -> Option<Self::Item> {
65-
let rv = make_mutation_table_row(&self.table, self.pos, self.decode_metadata);
61+
let rv = make_mutation_table_row(&self.table, self.pos);
6662
self.pos += 1;
6763
rv
6864
}
@@ -157,32 +153,20 @@ impl<'a> MutationTable<'a> {
157153

158154
/// Return an iterator over rows of the table.
159155
/// The value of the iterator is [`MutationTableRow`].
160-
///
161-
/// # Parameters
162-
///
163-
/// * `decode_metadata`: if `true`, then a *copy* of row metadata
164-
/// will be provided in [`MutationTableRow::metadata`].
165-
/// The meta data are *not* decoded.
166-
/// Rows with no metadata will contain the value `None`.
167-
///
168-
pub fn iter(&self, decode_metadata: bool) -> MutationTableRefIterator {
169-
crate::table_iterator::make_table_iterator::<&MutationTable<'a>>(&self, decode_metadata)
156+
pub fn iter(&self) -> MutationTableRefIterator {
157+
crate::table_iterator::make_table_iterator::<&MutationTable<'a>>(&self)
170158
}
171159

172160
/// Return row `r` of the table.
173161
///
174162
/// # Parameters
175163
///
176164
/// * `r`: the row id.
177-
/// * `decode_metadata`: if `true`, then a *copy* of row metadata
178-
/// will be provided in [`MutationTableRow::metadata`].
179-
/// The meta data are *not* decoded.
180-
/// Rows with no metadata will contain the value `None`.
181165
///
182166
/// # Errors
183167
///
184168
/// [`TskitError::IndexError`] if `r` is out of range.
185-
pub fn row(&self, r: tsk_id_t, decode_metadata: bool) -> Result<MutationTableRow, TskitError> {
186-
table_row_access!(r, decode_metadata, self, make_mutation_table_row)
169+
pub fn row(&self, r: tsk_id_t) -> Result<MutationTableRow, TskitError> {
170+
table_row_access!(r, self, make_mutation_table_row)
187171
}
188172
}

0 commit comments

Comments
 (0)