@@ -71,54 +71,159 @@ impl Tree {
71
71
handle_tsk_return_value ! ( rv, tree)
72
72
}
73
73
74
- pub fn parent_array ( & self ) -> crate :: ffi:: TskIdArray {
75
- crate :: ffi:: TskIdArray :: new ( self . inner . parent , self . inner . num_nodes )
74
+ /// ```compile_fail
75
+ /// use streaming_iterator::StreamingIterator;
76
+ /// let tables = tskit::TableCollection::new(1.).unwrap();
77
+ /// let treeseq =
78
+ /// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
79
+ /// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
80
+ /// while let Some(tree) = tree_iter.next() {
81
+ /// let p = tree.parent_array();
82
+ /// drop(tree_iter);
83
+ /// for _ in p {}
84
+ /// }
85
+ /// ```
86
+ pub fn parent_array ( & self ) -> & [ tsk_id_t ] {
87
+ tree_array_slice ! ( self , parent, self . inner. num_nodes)
76
88
}
77
89
78
- pub fn samples_array ( & self ) -> Result < crate :: ffi:: TskIdArray , TskitError > {
90
+ /// ```compile_fail
91
+ /// use streaming_iterator::StreamingIterator;
92
+ /// let tables = tskit::TableCollection::new(1.).unwrap();
93
+ /// let treeseq =
94
+ /// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
95
+ /// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::SAMPLE_LISTS).unwrap();
96
+ /// while let Some(tree) = tree_iter.next() {
97
+ /// let p = tree.samples_array();
98
+ /// drop(tree_iter);
99
+ /// for _ in p {}
100
+ /// }
101
+ /// ```
102
+ pub fn samples_array ( & self ) -> Result < & [ tsk_id_t ] , TskitError > {
79
103
let num_samples =
80
104
unsafe { ll_bindings:: tsk_treeseq_get_num_samples ( ( * self . as_ptr ( ) ) . tree_sequence ) } ;
81
- err_if_not_tracking_samples ! (
82
- self . flags,
83
- crate :: ffi:: TskIdArray :: new( self . inner. samples, num_samples)
84
- )
105
+ err_if_not_tracking_samples ! ( self . flags, tree_array_slice!( self , samples, num_samples) )
85
106
}
86
107
87
- pub fn next_sample_array ( & self ) -> Result < crate :: ffi:: TskIdArray , TskitError > {
108
+ /// ```compile_fail
109
+ /// use streaming_iterator::StreamingIterator;
110
+ /// let tables = tskit::TableCollection::new(1.).unwrap();
111
+ /// let treeseq =
112
+ /// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
113
+ /// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::SAMPLE_LISTS).unwrap();
114
+ /// while let Some(tree) = tree_iter.next() {
115
+ /// let p = tree.next_sample_array();
116
+ /// drop(tree_iter);
117
+ /// for _ in p {}
118
+ /// }
119
+ /// ```
120
+ pub fn next_sample_array ( & self ) -> Result < & [ tsk_id_t ] , TskitError > {
88
121
err_if_not_tracking_samples ! (
89
122
self . flags,
90
- crate :: ffi :: TskIdArray :: new ( self . inner . next_sample, self . inner. num_nodes)
123
+ tree_array_slice! ( self , next_sample, self . inner. num_nodes)
91
124
)
92
125
}
93
126
94
- pub fn left_sample_array ( & self ) -> Result < crate :: ffi:: TskIdArray , TskitError > {
127
+ /// ```compile_fail
128
+ /// use streaming_iterator::StreamingIterator;
129
+ /// let tables = tskit::TableCollection::new(1.).unwrap();
130
+ /// let treeseq =
131
+ /// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
132
+ /// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::SAMPLE_LISTS).unwrap();
133
+ /// while let Some(tree) = tree_iter.next() {
134
+ /// let p = tree.left_sample_array();
135
+ /// drop(tree_iter);
136
+ /// for _ in p {}
137
+ /// }
138
+ /// ```
139
+ pub fn left_sample_array ( & self ) -> Result < & [ tsk_id_t ] , TskitError > {
95
140
err_if_not_tracking_samples ! (
96
141
self . flags,
97
- crate :: ffi :: TskIdArray :: new ( self . inner . left_sample, self . inner. num_nodes)
142
+ tree_array_slice! ( self , left_sample, self . inner. num_nodes)
98
143
)
99
144
}
100
145
101
- pub fn right_sample_array ( & self ) -> Result < crate :: ffi:: TskIdArray , TskitError > {
146
+ /// ```compile_fail
147
+ /// use streaming_iterator::StreamingIterator;
148
+ /// let tables = tskit::TableCollection::new(1.).unwrap();
149
+ /// let treeseq =
150
+ /// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
151
+ /// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::SAMPLE_LISTS).unwrap();
152
+ /// while let Some(tree) = tree_iter.next() {
153
+ /// let p = tree.right_sample_array();
154
+ /// drop(tree_iter);
155
+ /// for _ in p {}
156
+ /// }
157
+ /// ```
158
+ pub fn right_sample_array ( & self ) -> Result < & [ tsk_id_t ] , TskitError > {
102
159
err_if_not_tracking_samples ! (
103
160
self . flags,
104
- crate :: ffi :: TskIdArray :: new ( self . inner . right_sample, self . inner. num_nodes)
161
+ tree_array_slice! ( self , right_sample, self . inner. num_nodes)
105
162
)
106
163
}
107
164
108
- pub fn left_sib_array ( & self ) -> crate :: ffi:: TskIdArray {
109
- crate :: ffi:: TskIdArray :: new ( self . inner . left_sib , self . inner . num_nodes )
165
+ /// ```compile_fail
166
+ /// use streaming_iterator::StreamingIterator;
167
+ /// let tables = tskit::TableCollection::new(1.).unwrap();
168
+ /// let treeseq =
169
+ /// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
170
+ /// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
171
+ /// while let Some(tree) = tree_iter.next() {
172
+ /// let p = tree.left_sib_array();
173
+ /// drop(tree_iter);
174
+ /// for _ in p {}
175
+ /// }
176
+ /// ```
177
+ pub fn left_sib_array ( & self ) -> & [ tsk_id_t ] {
178
+ tree_array_slice ! ( self , left_sib, self . inner. num_nodes)
110
179
}
111
180
112
- pub fn right_sib_array ( & self ) -> crate :: ffi:: TskIdArray {
113
- crate :: ffi:: TskIdArray :: new ( self . inner . right_sib , self . inner . num_nodes )
181
+ /// ```compile_fail
182
+ /// use streaming_iterator::StreamingIterator;
183
+ /// let tables = tskit::TableCollection::new(1.).unwrap();
184
+ /// let treeseq =
185
+ /// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
186
+ /// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
187
+ /// while let Some(tree) = tree_iter.next() {
188
+ /// let p = tree.right_sib_array();
189
+ /// drop(tree_iter);
190
+ /// for _ in p {}
191
+ /// }
192
+ /// ```
193
+ pub fn right_sib_array ( & self ) -> & [ tsk_id_t ] {
194
+ tree_array_slice ! ( self , right_sib, self . inner. num_nodes)
114
195
}
115
196
116
- pub fn left_child_array ( & self ) -> crate :: ffi:: TskIdArray {
117
- crate :: ffi:: TskIdArray :: new ( self . inner . left_child , self . inner . num_nodes )
197
+ /// ```compile_fail
198
+ /// use streaming_iterator::StreamingIterator;
199
+ /// let tables = tskit::TableCollection::new(1.).unwrap();
200
+ /// let treeseq =
201
+ /// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
202
+ /// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
203
+ /// while let Some(tree) = tree_iter.next() {
204
+ /// let p = tree.left_child_array();
205
+ /// drop(tree_iter);
206
+ /// for _ in p {}
207
+ /// }
208
+ /// ```
209
+ pub fn left_child_array ( & self ) -> & [ tsk_id_t ] {
210
+ tree_array_slice ! ( self , left_child, self . inner. num_nodes)
118
211
}
119
212
120
- pub fn right_child_array ( & self ) -> crate :: ffi:: TskIdArray {
121
- crate :: ffi:: TskIdArray :: new ( self . inner . right_child , self . inner . num_nodes )
213
+ /// ```compile_fail
214
+ /// use streaming_iterator::StreamingIterator;
215
+ /// let tables = tskit::TableCollection::new(1.).unwrap();
216
+ /// let treeseq =
217
+ /// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
218
+ /// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
219
+ /// while let Some(tree) = tree_iter.next() {
220
+ /// let p = tree.right_child_array();
221
+ /// drop(tree_iter);
222
+ /// for _ in p {}
223
+ /// }
224
+ /// ```
225
+ pub fn right_child_array ( & self ) -> & [ tsk_id_t ] {
226
+ tree_array_slice ! ( self , right_child, self . inner. num_nodes)
122
227
}
123
228
124
229
fn left_sample ( & self , u : tsk_id_t ) -> Result < tsk_id_t , TskitError > {
@@ -1147,4 +1252,23 @@ pub(crate) mod test_trees {
1147
1252
stops_rev. reverse ( ) ;
1148
1253
assert ! ( stops_fwd == stops_rev) ;
1149
1254
}
1255
+
1256
+ // FIXME: remove later
1257
+ #[ test]
1258
+ fn test_array_lifetime ( ) {
1259
+ let treeseq = treeseq_from_small_table_collection_two_trees ( ) ;
1260
+ let mut tree_iter = treeseq. tree_iterator ( TreeFlags :: default ( ) ) . unwrap ( ) ;
1261
+ if let Some ( tree) = tree_iter. next ( ) {
1262
+ let pa = tree. parent_array ( ) ;
1263
+ let mut pc = vec ! [ ] ;
1264
+ for i in pa. iter ( ) {
1265
+ pc. push ( * i) ;
1266
+ }
1267
+ for ( i, p) in pc. iter ( ) . enumerate ( ) {
1268
+ assert_eq ! ( pa[ i] , * p) ;
1269
+ }
1270
+ } else {
1271
+ panic ! ( "Expected a tree." ) ;
1272
+ }
1273
+ }
1150
1274
}
0 commit comments