@@ -137,29 +137,86 @@ impl<'a> streaming_iterator::StreamingIterator for EdgeTableRowView<'a> {
137
137
}
138
138
}
139
139
140
- /// An immutable view of an edge table.
140
+ /// An edge table.
141
141
///
142
- /// These are not created directly but are accessed
143
- /// by types implementing [`std::ops::Deref`] to
144
- /// [`crate::table_views::TableViews`]
142
+ /// # Examples
143
+ ///
144
+ /// ## Standalone tables
145
+ ///
146
+ /// ```
147
+ /// use tskit::EdgeTable;
148
+ ///
149
+ /// let mut edges = EdgeTable::default();
150
+ /// let rowid = edges.add_row(1., 2., 0, 1).unwrap();
151
+ /// assert_eq!(rowid, 0);
152
+ /// assert_eq!(edges.num_rows(), 1);
153
+ ///
154
+ /// edges.clear().unwrap();
155
+ /// assert_eq!(edges.num_rows(), 0);
156
+ /// ```
157
+ ///
158
+ /// An example with metadata.
159
+ /// This requires the cargo feature `"derive"` for `tskit`.
160
+ ///
161
+ /// ```
162
+ /// # #[cfg(any(feature="doc", feature="derive"))] {
163
+ /// use tskit::EdgeTable;
164
+ ///
165
+ /// #[derive(serde::Serialize,
166
+ /// serde::Deserialize,
167
+ /// tskit::metadata::EdgeMetadata)]
168
+ /// #[serializer("serde_json")]
169
+ /// struct EdgeMetadata {
170
+ /// value: i32,
171
+ /// }
172
+ ///
173
+ /// let metadata = EdgeMetadata{value: 42};
174
+ ///
175
+ /// let mut edges = EdgeTable::default();
176
+ ///
177
+ /// let rowid = edges.add_row_with_metadata(0., 1., 5, 10, &metadata).unwrap();
178
+ /// assert_eq!(rowid, 0);
179
+ ///
180
+ /// match edges.metadata::<EdgeMetadata>(rowid) {
181
+ /// // rowid is in range, decoding succeeded
182
+ /// Some(Ok(decoded)) => assert_eq!(decoded.value, 42),
183
+ /// // rowid is in range, decoding failed
184
+ /// Some(Err(e)) => panic!("error decoding metadata: {:?}", e),
185
+ /// None => panic!("row id out of range")
186
+ /// }
187
+ /// # }
188
+ /// ```
145
189
#[ repr( transparent) ]
146
190
#[ derive( Debug ) ]
147
191
pub struct EdgeTable {
148
- table_ : sys:: LLEdgeTableRef ,
192
+ table_ : sys:: LLEdgeTable ,
149
193
}
150
194
151
195
impl EdgeTable {
196
+ pub ( crate ) fn as_ptr ( & self ) -> * const ll_bindings:: tsk_edge_table_t {
197
+ self . table_ . as_ptr ( )
198
+ }
199
+
200
+ pub ( crate ) fn as_mut_ptr ( & mut self ) -> * mut ll_bindings:: tsk_edge_table_t {
201
+ self . table_ . as_mut_ptr ( )
202
+ }
203
+
152
204
pub ( crate ) fn new_from_table (
153
205
edges : * mut ll_bindings:: tsk_edge_table_t ,
154
206
) -> Result < Self , TskitError > {
155
- let table_ = sys:: LLEdgeTableRef :: new_from_table ( edges) ?;
207
+ let table_ = sys:: LLEdgeTable :: new_non_owning ( edges) ?;
156
208
Ok ( EdgeTable { table_ } )
157
209
}
158
210
159
211
pub ( crate ) fn as_ref ( & self ) -> & ll_bindings:: tsk_edge_table_t {
160
212
self . table_ . as_ref ( )
161
213
}
162
214
215
+ pub fn new ( ) -> Result < Self , TskitError > {
216
+ let table_ = sys:: LLEdgeTable :: new_owning ( 0 ) ?;
217
+ Ok ( Self { table_ } )
218
+ }
219
+
163
220
/// Return the number of rows
164
221
pub fn num_rows ( & self ) -> crate :: SizeType {
165
222
self . as_ref ( ) . num_rows . into ( )
@@ -283,6 +340,13 @@ impl EdgeTable {
283
340
Some ( view)
284
341
}
285
342
343
+ pub fn clear ( & mut self ) -> Result < ( ) , TskitError > {
344
+ self . table_ . clear ( ) . map_err ( |e| e. into ( ) )
345
+ }
346
+
347
+ edge_table_add_row ! ( => add_row, self , self . as_mut_ptr( ) ) ;
348
+ edge_table_add_row_with_metadata ! ( => add_row_with_metadata, self , self . as_mut_ptr( ) ) ;
349
+
286
350
build_table_column_slice_getter ! (
287
351
/// Get the left column as a slice
288
352
=> left, left_slice, Position ) ;
@@ -309,61 +373,10 @@ impl EdgeTable {
309
373
=> child, child_slice_raw, ll_bindings:: tsk_id_t) ;
310
374
}
311
375
312
- build_owned_table_type ! (
313
- /// A standalone edge table that owns its data.
314
- ///
315
- /// # Examples
316
- ///
317
- /// ```
318
- /// use tskit::OwningEdgeTable;
319
- ///
320
- /// let mut edges = OwningEdgeTable::default();
321
- /// let rowid = edges.add_row(1., 2., 0, 1).unwrap();
322
- /// assert_eq!(rowid, 0);
323
- /// assert_eq!(edges.num_rows(), 1);
324
- ///
325
- /// edges.clear().unwrap();
326
- /// assert_eq!(edges.num_rows(), 0);
327
- /// ```
328
- ///
329
- /// An example with metadata.
330
- /// This requires the cargo feature `"derive"` for `tskit`.
331
- ///
332
- /// ```
333
- /// # #[cfg(any(feature="doc", feature="derive"))] {
334
- /// use tskit::OwningEdgeTable;
335
- ///
336
- /// #[derive(serde::Serialize,
337
- /// serde::Deserialize,
338
- /// tskit::metadata::EdgeMetadata)]
339
- /// #[serializer("serde_json")]
340
- /// struct EdgeMetadata {
341
- /// value: i32,
342
- /// }
343
- ///
344
- /// let metadata = EdgeMetadata{value: 42};
345
- ///
346
- /// let mut edges = OwningEdgeTable::default();
347
- ///
348
- /// let rowid = edges.add_row_with_metadata(0., 1., 5, 10, &metadata).unwrap();
349
- /// assert_eq!(rowid, 0);
350
- ///
351
- /// match edges.metadata::<EdgeMetadata>(rowid) {
352
- /// // rowid is in range, decoding succeeded
353
- /// Some(Ok(decoded)) => assert_eq!(decoded.value, 42),
354
- /// // rowid is in range, decoding failed
355
- /// Some(Err(e)) => panic!("error decoding metadata: {:?}", e),
356
- /// None => panic!("row id out of range")
357
- /// }
358
- /// # }
359
- /// ```
360
- => OwningEdgeTable ,
361
- EdgeTable ,
362
- crate :: sys:: LLOwningEdgeTable ,
363
- crate :: bindings:: tsk_edge_table_t
364
- ) ;
365
-
366
- impl OwningEdgeTable {
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( ) ) ;
376
+ impl Default for EdgeTable {
377
+ fn default ( ) -> Self {
378
+ Self :: new ( ) . unwrap ( )
379
+ }
369
380
}
381
+
382
+ pub type OwningEdgeTable = EdgeTable ;
0 commit comments