Skip to content

Commit 4ee76e9

Browse files
authored
refactor: add new macro to build owned tables (#282)
1 parent d017330 commit 4ee76e9

File tree

5 files changed

+131
-130
lines changed

5 files changed

+131
-130
lines changed

src/_macros.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,23 @@ macro_rules! provenance_table_add_row {
10081008
};
10091009
}
10101010

1011+
macro_rules! build_owned_table_type {
1012+
($(#[$attr:meta])* => $name: ident, $deref_type: ident, $tskname: ident, $tskinit: ident, $tskfree: ident) => {
1013+
$(#[$attr])*
1014+
pub struct $name {
1015+
table: mbox::MBox<$crate::bindings::$tskname>,
1016+
}
1017+
1018+
build_owned_tables!(
1019+
$name,
1020+
$deref_type,
1021+
$crate::bindings::$tskname,
1022+
$tskinit,
1023+
$tskfree
1024+
);
1025+
};
1026+
}
1027+
10111028
#[cfg(test)]
10121029
mod test {
10131030
use crate::error::TskitError;

src/edge_table.rs

Lines changed: 50 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -170,62 +170,58 @@ impl<'a> EdgeTable<'a> {
170170
}
171171
}
172172

173-
/// A standalone edge table that owns its data.
174-
///
175-
/// # Examples
176-
///
177-
/// ```
178-
/// use tskit::OwnedEdgeTable;
179-
///
180-
/// let mut edges = OwnedEdgeTable::default();
181-
/// let rowid = edges.add_row(1., 2., 0, 1).unwrap();
182-
/// assert_eq!(rowid, 0);
183-
/// assert_eq!(edges.num_rows(), 1);
184-
/// ```
185-
///
186-
/// An example with metadata.
187-
/// This requires the cargo feature `"derive"` for `tskit`.
188-
///
189-
/// ```
190-
/// # #[cfg(any(feature="doc", feature="derive"))] {
191-
/// use tskit::OwnedEdgeTable;
192-
///
193-
/// #[derive(serde::Serialize,
194-
/// serde::Deserialize,
195-
/// tskit::metadata::EdgeMetadata)]
196-
/// #[serializer("serde_json")]
197-
/// struct EdgeMetadata {
198-
/// value: i32,
199-
/// }
200-
///
201-
/// let metadata = EdgeMetadata{value: 42};
202-
///
203-
/// let mut edges = OwnedEdgeTable::default();
204-
///
205-
/// let rowid = edges.add_row_with_metadata(0., 1., 5, 10, &metadata).unwrap();
206-
/// assert_eq!(rowid, 0);
207-
///
208-
/// if let Some(decoded) = edges.metadata::<EdgeMetadata>(rowid).unwrap() {
209-
/// assert_eq!(decoded.value, 42);
210-
/// } else {
211-
/// panic!("hmm...we expected some metadata!");
212-
/// }
213-
///
214-
/// # }
215-
/// ```
216-
pub struct OwnedEdgeTable {
217-
table: mbox::MBox<ll_bindings::tsk_edge_table_t>,
218-
}
173+
build_owned_table_type!(
174+
/// A standalone edge table that owns its data.
175+
///
176+
/// # Examples
177+
///
178+
/// ```
179+
/// use tskit::OwnedEdgeTable;
180+
///
181+
/// let mut edges = OwnedEdgeTable::default();
182+
/// let rowid = edges.add_row(1., 2., 0, 1).unwrap();
183+
/// assert_eq!(rowid, 0);
184+
/// assert_eq!(edges.num_rows(), 1);
185+
/// ```
186+
///
187+
/// An example with metadata.
188+
/// This requires the cargo feature `"derive"` for `tskit`.
189+
///
190+
/// ```
191+
/// # #[cfg(any(feature="doc", feature="derive"))] {
192+
/// use tskit::OwnedEdgeTable;
193+
///
194+
/// #[derive(serde::Serialize,
195+
/// serde::Deserialize,
196+
/// tskit::metadata::EdgeMetadata)]
197+
/// #[serializer("serde_json")]
198+
/// struct EdgeMetadata {
199+
/// value: i32,
200+
/// }
201+
///
202+
/// let metadata = EdgeMetadata{value: 42};
203+
///
204+
/// let mut edges = OwnedEdgeTable::default();
205+
///
206+
/// let rowid = edges.add_row_with_metadata(0., 1., 5, 10, &metadata).unwrap();
207+
/// assert_eq!(rowid, 0);
208+
///
209+
/// if let Some(decoded) = edges.metadata::<EdgeMetadata>(rowid).unwrap() {
210+
/// assert_eq!(decoded.value, 42);
211+
/// } else {
212+
/// panic!("hmm...we expected some metadata!");
213+
/// }
214+
///
215+
/// # }
216+
/// ```
217+
=> OwnedEdgeTable,
218+
EdgeTable,
219+
tsk_edge_table_t,
220+
tsk_edge_table_init,
221+
tsk_edge_table_free
222+
);
219223

220224
impl OwnedEdgeTable {
221225
edge_table_add_row!(=> add_row, self, *self.table);
222226
edge_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
223227
}
224-
225-
build_owned_tables!(
226-
OwnedEdgeTable,
227-
EdgeTable,
228-
ll_bindings::tsk_edge_table_t,
229-
tsk_edge_table_init,
230-
tsk_edge_table_free
231-
);

src/mutation_table.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ impl<'a> MutationTable<'a> {
198198
}
199199
}
200200

201+
build_owned_table_type!(
201202
/// A standalone mutation table that owns its data.
202203
///
203204
/// # Examples
@@ -241,19 +242,14 @@ impl<'a> MutationTable<'a> {
241242
///
242243
/// # }
243244
/// ```
244-
pub struct OwnedMutationTable {
245-
table: mbox::MBox<ll_bindings::tsk_mutation_table_t>,
246-
}
245+
=> OwnedMutationTable,
246+
MutationTable,
247+
tsk_mutation_table_t,
248+
tsk_mutation_table_init,
249+
tsk_mutation_table_free
250+
);
247251

248252
impl OwnedMutationTable {
249253
mutation_table_add_row!(=> add_row, self, *self.table);
250254
mutation_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
251255
}
252-
253-
build_owned_tables!(
254-
OwnedMutationTable,
255-
MutationTable,
256-
ll_bindings::tsk_mutation_table_t,
257-
tsk_mutation_table_init,
258-
tsk_mutation_table_free
259-
);

src/node_table.rs

Lines changed: 50 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -245,66 +245,62 @@ impl<'a> NodeTable<'a> {
245245
}
246246
}
247247

248-
/// A standalone node table that owns its data.
249-
///
250-
/// # Examples
251-
///
252-
/// ```
253-
/// use tskit::OwnedNodeTable;
254-
///
255-
/// let mut nodes = OwnedNodeTable::default();
256-
/// let rowid = nodes.add_row(0, 1.1, -1, -1).unwrap();
257-
/// assert_eq!(rowid, 0);
258-
/// assert_eq!(nodes.num_rows(), 1);
259-
/// ```
260-
///
261-
/// An example with metadata.
262-
/// This requires the cargo feature `"derive"` for `tskit`.
263-
///
264-
/// ```
265-
/// # #[cfg(any(feature="doc", feature="derive"))] {
266-
/// use tskit::OwnedNodeTable;
267-
///
268-
/// #[derive(serde::Serialize,
269-
/// serde::Deserialize,
270-
/// tskit::metadata::NodeMetadata)]
271-
/// #[serializer("serde_json")]
272-
/// struct NodeMetadata {
273-
/// value: i32,
274-
/// }
275-
///
276-
/// let metadata = NodeMetadata{value: 42};
277-
///
278-
/// let mut nodes = OwnedNodeTable::default();
279-
///
280-
/// let rowid = nodes.add_row_with_metadata(0, 1., -1, -1, &metadata).unwrap();
281-
/// assert_eq!(rowid, 0);
282-
///
283-
/// if let Some(decoded) = nodes.metadata::<NodeMetadata>(rowid).unwrap() {
284-
/// assert_eq!(decoded.value, 42);
285-
/// } else {
286-
/// panic!("hmm...we expected some metadata!");
287-
/// }
288-
///
289-
/// # }
290-
/// ```
291-
pub struct OwnedNodeTable {
292-
table: mbox::MBox<ll_bindings::tsk_node_table_t>,
293-
}
248+
build_owned_table_type!(
249+
/// A standalone node table that owns its data.
250+
///
251+
/// # Examples
252+
///
253+
/// ```
254+
/// use tskit::OwnedNodeTable;
255+
///
256+
/// let mut nodes = OwnedNodeTable::default();
257+
/// let rowid = nodes.add_row(0, 1.1, -1, -1).unwrap();
258+
/// assert_eq!(rowid, 0);
259+
/// assert_eq!(nodes.num_rows(), 1);
260+
/// ```
261+
///
262+
/// An example with metadata.
263+
/// This requires the cargo feature `"derive"` for `tskit`.
264+
///
265+
/// ```
266+
/// # #[cfg(any(feature="doc", feature="derive"))] {
267+
/// use tskit::OwnedNodeTable;
268+
///
269+
/// #[derive(serde::Serialize,
270+
/// serde::Deserialize,
271+
/// tskit::metadata::NodeMetadata)]
272+
/// #[serializer("serde_json")]
273+
/// struct NodeMetadata {
274+
/// value: i32,
275+
/// }
276+
///
277+
/// let metadata = NodeMetadata{value: 42};
278+
///
279+
/// let mut nodes = OwnedNodeTable::default();
280+
///
281+
/// let rowid = nodes.add_row_with_metadata(0, 1., -1, -1, &metadata).unwrap();
282+
/// assert_eq!(rowid, 0);
283+
///
284+
/// if let Some(decoded) = nodes.metadata::<NodeMetadata>(rowid).unwrap() {
285+
/// assert_eq!(decoded.value, 42);
286+
/// } else {
287+
/// panic!("hmm...we expected some metadata!");
288+
/// }
289+
///
290+
/// # }
291+
/// ```
292+
=> OwnedNodeTable,
293+
NodeTable,
294+
tsk_node_table_t,
295+
tsk_node_table_init,
296+
tsk_node_table_free
297+
);
294298

295299
impl OwnedNodeTable {
296300
node_table_add_row!(=> add_row, self, table);
297301
node_table_add_row_with_metadata!(=> add_row_with_metadata, self, table);
298302
}
299303

300-
build_owned_tables!(
301-
OwnedNodeTable,
302-
NodeTable,
303-
ll_bindings::tsk_node_table_t,
304-
tsk_node_table_init,
305-
tsk_node_table_free
306-
);
307-
308304
#[cfg(test)]
309305
mod test_owned_node_table {
310306
use super::*;

src/population_table.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ impl<'a> PopulationTable<'a> {
117117
}
118118
}
119119

120+
build_owned_table_type!(
120121
/// A standalone population table that owns its data.
121122
///
122123
/// # Examples
@@ -160,19 +161,14 @@ impl<'a> PopulationTable<'a> {
160161
///
161162
/// # }
162163
/// ```
163-
pub struct OwnedPopulationTable {
164-
table: mbox::MBox<ll_bindings::tsk_population_table_t>,
165-
}
164+
=> OwnedPopulationTable,
165+
PopulationTable,
166+
tsk_population_table_t,
167+
tsk_population_table_init,
168+
tsk_population_table_free
169+
);
166170

167171
impl OwnedPopulationTable {
168172
population_table_add_row!(=> add_row, self, *self.table);
169173
population_table_add_row_with_metadata!(=> add_row_with_metadata, self, *self.table);
170174
}
171-
172-
build_owned_tables!(
173-
OwnedPopulationTable,
174-
PopulationTable,
175-
ll_bindings::tsk_population_table_t,
176-
tsk_population_table_init,
177-
tsk_population_table_free
178-
);

0 commit comments

Comments
 (0)