@@ -5,6 +5,7 @@ use crate::Position;
5
5
use crate :: SiteId ;
6
6
use crate :: SizeType ;
7
7
use crate :: TskitError ;
8
+ use ll_bindings:: { tsk_site_table_free, tsk_site_table_init} ;
8
9
9
10
/// Row of a [`SiteTable`]
10
11
pub struct SiteTableRow {
@@ -152,3 +153,59 @@ impl<'a> SiteTable<'a> {
152
153
table_row_access ! ( r. into( ) . 0 , self , make_site_table_row)
153
154
}
154
155
}
156
+
157
+ build_owned_table_type ! (
158
+ /// A standalone site table that owns its data.
159
+ ///
160
+ /// # Examples
161
+ ///
162
+ /// ```
163
+ /// use tskit::OwnedSiteTable;
164
+ ///
165
+ /// let mut sites = OwnedSiteTable::default();
166
+ /// let rowid = sites.add_row(1., None).unwrap();
167
+ /// assert_eq!(rowid, 0);
168
+ /// assert_eq!(sites.num_rows(), 1);
169
+ /// ```
170
+ ///
171
+ /// An example with metadata.
172
+ /// This requires the cargo feature `"derive"` for `tskit`.
173
+ ///
174
+ /// ```
175
+ /// # #[cfg(any(feature="doc", feature="derive"))] {
176
+ /// use tskit::OwnedSiteTable;
177
+ ///
178
+ /// #[derive(serde::Serialize,
179
+ /// serde::Deserialize,
180
+ /// tskit::metadata::SiteMetadata)]
181
+ /// #[serializer("serde_json")]
182
+ /// struct SiteMetadata {
183
+ /// value: i32,
184
+ /// }
185
+ ///
186
+ /// let metadata = SiteMetadata{value: 42};
187
+ ///
188
+ /// let mut sites = OwnedSiteTable::default();
189
+ ///
190
+ /// let rowid = sites.add_row_with_metadata(0., None, &metadata).unwrap();
191
+ /// assert_eq!(rowid, 0);
192
+ ///
193
+ /// if let Some(decoded) = sites.metadata::<SiteMetadata>(rowid).unwrap() {
194
+ /// assert_eq!(decoded.value, 42);
195
+ /// } else {
196
+ /// panic!("hmm...we expected some metadata!");
197
+ /// }
198
+ ///
199
+ /// # }
200
+ /// ```
201
+ => OwnedSiteTable ,
202
+ SiteTable ,
203
+ tsk_site_table_t,
204
+ tsk_site_table_init,
205
+ tsk_site_table_free
206
+ ) ;
207
+
208
+ impl OwnedSiteTable {
209
+ site_table_add_row ! ( => add_row, self , * self . table) ;
210
+ site_table_add_row_with_metadata ! ( => add_row_with_metadata, self , * self . table) ;
211
+ }
0 commit comments