use crate::error::ZlobError;
use crate::ffi;
use std::slice;
pub struct ZlobIndicies {
inner: ffi::zlob_indices_t,
}
impl std::fmt::Debug for ZlobIndicies {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ZlobIndicies")
.field("len", &self.len())
.field("indices", &self.as_slice())
.finish()
}
}
impl Drop for ZlobIndicies {
fn drop(&mut self) {
unsafe { ffi::zlob_indices_free(&mut self.inner) };
}
}
impl ZlobIndicies {
pub(crate) fn from_ffi(code: i32, out: ffi::zlob_indices_t) -> Result<Self, ZlobError> {
let me = ZlobIndicies { inner: out };
match ZlobError::from_code(code) {
Ok(_) => Ok(me),
Err(err) => Err(err),
}
}
#[inline]
pub fn len(&self) -> usize {
self.inner.count
}
#[inline]
pub fn is_empty(&self) -> bool {
self.inner.count == 0
}
#[inline]
pub fn as_slice(&self) -> &[usize] {
if self.inner.count == 0 || self.inner.indices.is_null() {
&[]
} else {
unsafe { slice::from_raw_parts(self.inner.indices, self.inner.count) }
}
}
#[inline]
pub fn to_iter(&self) -> std::iter::Copied<slice::Iter<'_, usize>> {
self.as_slice().iter().copied()
}
}
unsafe impl Send for ZlobIndicies {}
unsafe impl Sync for ZlobIndicies {}