use crate::metadata;
use crate::sys;
use crate::PopulationId;
use crate::SizeType;
use crate::TskitError;
use sys::bindings as ll_bindings;
#[repr(transparent)]
#[derive(Debug, Default)]
pub struct PopulationTable {
table_: sys::PopulationTable,
}
impl PopulationTable {
pub(crate) unsafe fn new_from_table(
populations: *mut ll_bindings::tsk_population_table_t,
) -> Result<Self, TskitError> {
let ptr = std::ptr::NonNull::new(populations).unwrap();
let table_ = unsafe { sys::PopulationTable::new_borrowed(ptr) };
Ok(PopulationTable { table_ })
}
pub(crate) fn as_ref(&self) -> &ll_bindings::tsk_population_table_t {
self.table_.as_ref()
}
pub fn num_rows(&self) -> SizeType {
self.as_ref().num_rows.into()
}
pub fn metadata<T: metadata::PopulationMetadata>(
&self,
row: impl Into<PopulationId>,
) -> Option<Result<T, TskitError>> {
let buffer = self.table_.raw_metadata(row)?;
Some(decode_metadata_row!(T, buffer).map_err(TskitError::from))
}
pub fn iter(&self) -> impl Iterator<Item = crate::Population<'_>> {
self.table_.iter()
}
pub fn row<P: Into<PopulationId> + Copy>(&self, r: P) -> Option<crate::Population<'_>> {
self.table_.row(r.into())
}
pub fn add_row(&mut self) -> Result<PopulationId, TskitError> {
Ok(self.table_.add_row()?.into())
}
pub fn add_row_with_metadata<M: crate::metadata::PopulationMetadata>(
&mut self,
metadata: &M,
) -> Result<PopulationId, TskitError> {
let md = crate::metadata::EncodedMetadata::new(metadata)?;
Ok(self.table_.add_row_with_metadata(md.as_slice())?.into())
}
pub fn clear(&mut self) -> Result<i32, TskitError> {
handle_tsk_return_value!(self.table_.clear())
}
}