@@ -88,6 +88,21 @@ impl<'a> NodeTable<'a> {
88
88
///
89
89
/// * `Some(time)` if `row` is valid.
90
90
/// * `None` otherwise.
91
+ ///
92
+ /// # Examples
93
+ ///
94
+ /// ```
95
+ /// # use tskit::prelude::*;
96
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
97
+ /// # tables.add_node(0, 10.0, -1, -1).unwrap();
98
+ /// if let Some(time) = tables.nodes().time(0) {
99
+ /// // then node id 0 is a valid row id
100
+ /// # assert_eq!(time, 10.0);
101
+ /// }
102
+ /// # else {
103
+ /// # panic!("expected 0 to be a valid row id")
104
+ /// # }
105
+ /// ```
91
106
pub fn time < N : Into < NodeId > + Copy > ( & ' a self , row : N ) -> Option < Time > {
92
107
unsafe_tsk_column_access ! ( row. into( ) . 0 , 0 , self . num_rows( ) , self . table_. time, Time )
93
108
}
@@ -98,12 +113,86 @@ impl<'a> NodeTable<'a> {
98
113
///
99
114
/// * `Some(flags)` if `row` is valid.
100
115
/// * `None` otherwise.
116
+ ///
117
+ /// # Examples
118
+ ///
119
+ /// ```
120
+ /// # use tskit::prelude::*;
121
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
122
+ /// # tables.add_node(tskit::NodeFlags::IS_SAMPLE, 10.0, -1, -1).unwrap();
123
+ /// if let Some(flags) = tables.nodes().flags(0) {
124
+ /// // then node id 0 is a valid row id
125
+ /// # assert!(flags.is_sample());
126
+ /// }
127
+ /// # else {
128
+ /// # panic!("expected 0 to be a valid row id")
129
+ /// # }
130
+ /// ```
101
131
pub fn flags < N : Into < NodeId > + Copy > ( & ' a self , row : N ) -> Option < NodeFlags > {
102
132
unsafe_tsk_column_access_and_map_into ! ( row. into( ) . 0 , 0 , self . num_rows( ) , self . table_. flags)
103
133
}
104
134
105
135
/// Mutable access to node flags.
106
136
///
137
+ /// # Examples
138
+ ///
139
+ /// For a [`crate::TableCollection`], accessing the table creates a temporary
140
+ /// that will be dropped, causing this code to not compile:
141
+ ///
142
+ /// ```compile_fail
143
+ /// # use tskit::prelude::*;
144
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
145
+ /// # tables.add_node(tskit::NodeFlags::IS_SAMPLE, 10.0, -1, -1).unwrap();
146
+ /// let flags = tables.nodes().flags_array_mut();
147
+ /// println!("{}", flags.len()); // ERROR: the temporary node table is dropped by now
148
+ /// ```
149
+ ///
150
+ /// Treating the returned slice as an iterable succeeds:
151
+ ///
152
+ /// ```
153
+ /// # use tskit::prelude::*;
154
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
155
+ /// # tables.add_node(tskit::NodeFlags::IS_SAMPLE, 10.0, -1, -1).unwrap();
156
+ /// for flag in tables.nodes().flags_array_mut() {
157
+ /// # assert!(flag.is_sample());
158
+ /// }
159
+ /// ```
160
+ ///
161
+ /// The returned slice is *mutable*, allowing one to do things like
162
+ /// clear the sample status of all nodes:
163
+ ///
164
+ /// A copy of the flags can be obtained by collecting results into `Vec`:
165
+ ///
166
+ /// ```
167
+ /// # use tskit::prelude::*;
168
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
169
+ /// # tables.add_node(tskit::NodeFlags::IS_SAMPLE, 10.0, -1, -1).unwrap();
170
+ /// for flag in tables.nodes().flags_array_mut() {
171
+ /// flag.remove(tskit::NodeFlags::IS_SAMPLE);
172
+ /// }
173
+ /// assert!(!tables.nodes().flags_array_mut().iter().any(|f| f.is_sample()));
174
+ /// ```
175
+ ///
176
+ /// ```
177
+ /// # use tskit::prelude::*;
178
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
179
+ /// # tables.add_node(tskit::NodeFlags::IS_SAMPLE, 10.0, -1, -1).unwrap();
180
+ /// let flags = tables.nodes().flags_array_mut().to_vec();
181
+ /// # assert!(flags.iter().all(|f| f.is_sample()));
182
+ /// ```
183
+ ///
184
+ /// ## Standalone tables
185
+ ///
186
+ /// The ownership semantics differ when tables are not part of a
187
+ /// table collection:
188
+ ///
189
+ /// ```
190
+ /// // let mut nodes = tskit::OwnedNodeTable::default();
191
+ /// // assert!(nodes.add_row(tskit::NodeFlags::IS_SAMPLE, 10., -1, -1).is_ok());
192
+ /// // let flags = nodes.flags_array_mut();
193
+ /// // assert!(flags.iter().all(|f| f.is_sample()));
194
+ /// ```
195
+ ///
107
196
/// # Note
108
197
///
109
198
/// Internally, we rely on a conversion of u64 to usize.
@@ -120,6 +209,31 @@ impl<'a> NodeTable<'a> {
120
209
121
210
/// Mutable access to node times.
122
211
///
212
+ /// # Examples
213
+ ///
214
+ /// For a [`crate::TableCollection`], accessing the table creates a temporary
215
+ /// that will be dropped, causing this code to not compile:
216
+ ///
217
+ /// ```compile_fail
218
+ /// # use tskit::prelude::*;
219
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
220
+ /// # tables.add_node(tskit::NodeFlags::IS_SAMPLE, 10.0, -1, -1).unwrap();
221
+ /// let time = tables.nodes().time_array_mut();
222
+ /// println!("{}", time.len()); // ERROR: the temporary node table is dropped by now
223
+ /// ```
224
+ ///
225
+ /// Treating the returned slice as an iterable succeeds:
226
+ ///
227
+ /// ```
228
+ /// # use tskit::prelude::*;
229
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
230
+ /// # tables.add_node(tskit::NodeFlags::IS_SAMPLE, 10.0, -1, -1).unwrap();
231
+ /// for time in tables.nodes().time_array_mut() {
232
+ /// *time = 55.0.into(); // change each node's time value
233
+ /// }
234
+ /// assert!(tables.nodes().time_array_mut().iter().all(|t| t == &55.0));
235
+ /// ```
236
+ ///
123
237
/// # Note
124
238
///
125
239
/// Internally, we rely on a conversion of u64 to usize.
@@ -136,6 +250,21 @@ impl<'a> NodeTable<'a> {
136
250
137
251
/// Return the ``population`` value from row ``row`` of the table.
138
252
///
253
+ /// # Examples
254
+ ///
255
+ /// ```
256
+ /// # use tskit::prelude::*;
257
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
258
+ /// # tables.add_node(0, 10.0, -1, -1).unwrap();
259
+ /// if let Some(pop) = tables.nodes().population(0) {
260
+ /// // then node id 0 is a valid row id
261
+ /// # assert!(pop.is_null());
262
+ /// }
263
+ /// # else {
264
+ /// # panic!("expected 0 to be a valid row id")
265
+ /// # }
266
+ /// ```
267
+ ///
139
268
/// # Returns
140
269
///
141
270
/// * `Some(population)` if `row` is valid.
@@ -152,6 +281,10 @@ impl<'a> NodeTable<'a> {
152
281
153
282
/// Return the ``population`` value from row ``row`` of the table.
154
283
///
284
+ /// # Examples
285
+ ///
286
+ /// See [`NodeTable::population`] for examples.
287
+ ///
155
288
/// # Returns
156
289
///
157
290
/// * `Some(population)` if `row` is valid.
@@ -162,6 +295,21 @@ impl<'a> NodeTable<'a> {
162
295
163
296
/// Return the ``individual`` value from row ``row`` of the table.
164
297
///
298
+ /// # Examples
299
+ ///
300
+ /// ```
301
+ /// # use tskit::prelude::*;
302
+ /// # let mut tables = tskit::TableCollection::new(10.).unwrap();
303
+ /// # tables.add_node(0, 10.0, -1, -1).unwrap();
304
+ /// if let Some(individual) = tables.nodes().individual(0) {
305
+ /// // then node id 0 is a valid row id
306
+ /// # assert!(individual.is_null());
307
+ /// }
308
+ /// # else {
309
+ /// # panic!("expected 0 to be a valid row id")
310
+ /// # }
311
+ /// ```
312
+ ///
165
313
/// # Returns
166
314
///
167
315
/// * `Some(individual)` if `row` is valid.
0 commit comments