@@ -169,9 +169,15 @@ fn get_data_from_edge_table() {
169
169
#[ test]
170
170
fn test_adding_node_table_row_with_defaults ( ) {
171
171
let mut tables = tskit:: TableCollection :: new ( 10. ) . unwrap ( ) ;
172
+ // ANCHOR: node_defaults
172
173
let defaults = tskit:: NodeDefaults :: default ( ) ;
174
+ // ANCHOR_END: node_defaults
175
+ // ANCHOR: add_node_defaults
173
176
let node = tables. add_node_with_defaults ( 0.0 , & defaults) . unwrap ( ) ;
177
+ // ANCHOR_END: add_node_defaults
174
178
assert_eq ! ( node, 0 ) ;
179
+
180
+ // ANCHOR: add_node_defaults_sample
175
181
let node = tables
176
182
. add_node_with_defaults (
177
183
0.0 ,
@@ -184,6 +190,7 @@ fn test_adding_node_table_row_with_defaults() {
184
190
} ,
185
191
)
186
192
. unwrap ( ) ;
193
+ // ANCHOR_END: add_node_defaults_sample
187
194
assert ! ( tables. nodes( ) . flags( node) . unwrap( ) . is_sample( ) ) ;
188
195
}
189
196
@@ -215,15 +222,17 @@ macro_rules! impl_node_metadata_traits {
215
222
}
216
223
217
224
mod node_metadata {
218
- #[ derive( serde:: Serialize , serde:: Deserialize ) ]
225
+ #[ derive( Debug , serde:: Serialize , serde:: Deserialize , Eq , PartialEq ) ]
226
+ // ANCHOR: node_metadata
219
227
pub struct NodeMetadata {
220
228
pub value : i32 ,
221
229
}
230
+ // ANCHOR_END: node_metadata
222
231
impl_node_metadata_traits ! ( ) ;
223
232
}
224
233
225
234
mod node_metadata_clone {
226
- #[ derive( Clone , serde:: Serialize , serde:: Deserialize ) ]
235
+ #[ derive( Debug , Eq , PartialEq , Clone , serde:: Serialize , serde:: Deserialize ) ]
227
236
pub struct NodeMetadata {
228
237
pub value : i32 ,
229
238
}
@@ -234,10 +243,18 @@ mod node_metadata_clone {
234
243
fn test_adding_node_table_row_with_defaults_and_metadata ( ) {
235
244
use node_metadata:: NodeMetadata ;
236
245
let mut tables = tskit:: TableCollection :: new ( 10.0 ) . unwrap ( ) ;
246
+ // ANCHOR: node_defaults_with_metadata
247
+
248
+ // Create a type alias for brevity
237
249
type DefaultsWithMetadata = tskit:: NodeDefaultsWithMetadata < NodeMetadata > ;
250
+ // Default metadata is None
238
251
let defaults = DefaultsWithMetadata :: default ( ) ;
239
- let _ = tables. add_node_with_defaults ( 0.0 , & defaults) . unwrap ( ) ;
240
- let _ = tables
252
+
253
+ // A row with no metadata
254
+ let n0 = tables. add_node_with_defaults ( 0.0 , & defaults) . unwrap ( ) ;
255
+
256
+ // A row with metadata
257
+ let n1 = tables
241
258
. add_node_with_defaults (
242
259
0.0 ,
243
260
& DefaultsWithMetadata {
@@ -247,32 +264,54 @@ fn test_adding_node_table_row_with_defaults_and_metadata() {
247
264
} ,
248
265
)
249
266
. unwrap ( ) ;
250
- let _ = tables
267
+
268
+ // Another row with metadata, different from the last.
269
+ let n2 = tables
251
270
. add_node_with_defaults (
252
271
0.0 ,
253
272
& DefaultsWithMetadata {
254
- population : 3 . into ( ) ,
255
- metadata : Some ( NodeMetadata { value : 42 } ) ,
273
+ population : 1 . into ( ) ,
274
+ metadata : Some ( NodeMetadata { value : 1234 } ) ,
256
275
..defaults
257
276
} ,
258
277
)
259
278
. unwrap ( ) ;
279
+ // ANCHOR_END: node_defaults_with_metadata
280
+ assert ! ( tables. nodes( ) . metadata:: <NodeMetadata >( n0) . is_none( ) ) ;
281
+ assert_eq ! (
282
+ tables
283
+ . nodes( )
284
+ . metadata:: <NodeMetadata >( n1)
285
+ . unwrap( )
286
+ . unwrap( ) ,
287
+ NodeMetadata { value: 42 }
288
+ ) ;
289
+ assert_eq ! (
290
+ tables
291
+ . nodes( )
292
+ . metadata:: <NodeMetadata >( n2)
293
+ . unwrap( )
294
+ . unwrap( ) ,
295
+ NodeMetadata { value: 1234 }
296
+ ) ;
260
297
}
261
298
262
299
#[ test]
263
300
fn test_adding_node_table_row_with_defaults_and_metadata_requiring_clone ( ) {
264
301
use node_metadata_clone:: NodeMetadata ;
265
302
let mut tables = tskit:: TableCollection :: new ( 10.0 ) . unwrap ( ) ;
266
303
type DefaultsWithMetadata = tskit:: NodeDefaultsWithMetadata < NodeMetadata > ;
304
+
305
+ // ANCHOR: node_defaults_with_some_metadata_default
267
306
// What if there is default metadata for all rows?
268
307
let defaults = DefaultsWithMetadata {
269
308
metadata : Some ( NodeMetadata { value : 42 } ) ,
270
309
..Default :: default ( )
271
310
} ;
311
+ // ANCHOR_END: node_defaults_with_some_metadata_default
272
312
273
- // We can scoop all non-metadata fields even though
274
- // type is not Copy/Clone
275
- let _ = tables
313
+ // ANCHOR: node_defaults_with_some_metadata_default_add_first_row
314
+ let n0 = tables
276
315
. add_node_with_defaults (
277
316
0.0 ,
278
317
& DefaultsWithMetadata {
@@ -281,11 +320,21 @@ fn test_adding_node_table_row_with_defaults_and_metadata_requiring_clone() {
281
320
} ,
282
321
)
283
322
. unwrap ( ) ;
323
+ // ANCHOR_END: node_defaults_with_some_metadata_default_add_first_row
324
+ assert_eq ! (
325
+ tables
326
+ . nodes( )
327
+ . metadata:: <NodeMetadata >( n0)
328
+ . unwrap( )
329
+ . unwrap( ) ,
330
+ NodeMetadata { value: 2 * 42 }
331
+ ) ;
284
332
285
333
// But now, we start to cause a problem:
286
334
// If we don't clone here, our metadata type moves,
287
335
// so our defaults are moved.
288
- let _ = tables
336
+ // ANCHOR: node_defaults_with_some_metadata_default_add_second_row
337
+ let n1 = tables
289
338
. add_node_with_defaults (
290
339
0.0 ,
291
340
& DefaultsWithMetadata {
@@ -294,10 +343,20 @@ fn test_adding_node_table_row_with_defaults_and_metadata_requiring_clone() {
294
343
} ,
295
344
)
296
345
. unwrap ( ) ;
346
+ // ANCHOR_END: node_defaults_with_some_metadata_default_add_second_row
347
+ assert_eq ! (
348
+ tables
349
+ . nodes( )
350
+ . metadata:: <NodeMetadata >( n1)
351
+ . unwrap( )
352
+ . unwrap( ) ,
353
+ NodeMetadata { value: 42 }
354
+ ) ;
297
355
298
356
// Now, we have a use-after-move error
299
357
// if we hadn't cloned in the last step.
300
- let _ = tables
358
+ // ANCHOR: node_defaults_with_some_metadata_default_add_third_row
359
+ let n2 = tables
301
360
. add_node_with_defaults (
302
361
0.0 ,
303
362
& DefaultsWithMetadata {
@@ -306,4 +365,13 @@ fn test_adding_node_table_row_with_defaults_and_metadata_requiring_clone() {
306
365
} ,
307
366
)
308
367
. unwrap ( ) ;
368
+ // ANCHOR_END: node_defaults_with_some_metadata_default_add_third_row
369
+ assert_eq ! (
370
+ tables
371
+ . nodes( )
372
+ . metadata:: <NodeMetadata >( n2)
373
+ . unwrap( )
374
+ . unwrap( ) ,
375
+ NodeMetadata { value: 42 }
376
+ ) ;
309
377
}
0 commit comments