use crate::{Bitmask, Length, Offset, enums::error::MinarrowError};
pub trait MaskedArray {
type T: Default + PartialEq + Clone + Copy;
type Container;
type LogicalType: Default;
type CopyType: Default;
fn len(&self) -> usize;
#[inline]
fn is_empty(&self) -> bool {
self.len() == 0
}
fn data(&self) -> &Self::Container;
fn data_mut(&mut self) -> &mut Self::Container;
fn get(&self, idx: usize) -> Option<Self::CopyType>;
fn set(&mut self, idx: usize, value: Self::LogicalType);
unsafe fn get_unchecked(&self, idx: usize) -> Option<Self::CopyType>;
unsafe fn set_unchecked(&mut self, idx: usize, value: Self::LogicalType);
fn tuple_ref(&self, offset: usize, len: usize) -> (&Self, Offset, Length) {
(&self, offset, len)
}
fn iter(&self) -> impl Iterator<Item = Self::CopyType> + '_;
fn iter_opt(&self) -> impl Iterator<Item = Option<Self::CopyType>> + '_;
fn iter_range(&self, offset: usize, len: usize) -> impl Iterator<Item = Self::CopyType> + '_;
fn iter_opt_range(
&self,
offset: usize,
len: usize,
) -> impl Iterator<Item = Option<Self::CopyType>> + '_;
fn push(&mut self, value: Self::LogicalType);
unsafe fn push_unchecked(&mut self, value: Self::LogicalType);
fn slice_clone(&self, offset: usize, len: usize) -> Self;
fn resize(&mut self, n: usize, value: Self::LogicalType);
fn null_mask(&self) -> Option<&Bitmask>;
#[inline]
fn is_null(&self, idx: usize) -> bool {
match &self.null_mask() {
Some(mask) => !mask.get(idx),
None => false,
}
}
fn is_nullable(&self) -> bool {
self.null_mask().is_some()
}
fn null_count(&self) -> usize {
match self.null_mask().as_ref() {
Some(mask) => mask.count_zeros(),
None => 0,
}
}
#[inline]
fn push_null(&mut self) {
self.push(Self::LogicalType::default());
let i = self.len() - 1;
match self.null_mask_mut() {
Some(m) => m.set(i, false),
None => {
let mut m = Bitmask::new_set_all(self.len(), true);
m.set(i, false);
self.set_null_mask(Some(m));
}
}
}
fn null_mask_mut(&mut self) -> Option<&mut Bitmask>;
fn set_null_mask(&mut self, mask: Option<Bitmask>);
#[inline(always)]
unsafe fn push_null_unchecked(&mut self) {
let idx = self.len();
unsafe { self.set_unchecked(idx, Self::LogicalType::default()) };
if let Some(mask) = self.null_mask_mut() {
unsafe { mask.set_unchecked(idx, false) };
} else {
let mut m = Bitmask::new_set_all(idx, true);
unsafe { m.set_unchecked(idx, false) };
self.set_null_mask(Some(m));
}
}
#[inline]
fn set_null(&mut self, idx: usize) {
if let Some(nmask) = &mut self.null_mask_mut() {
if nmask.len() <= idx {
nmask.resize(idx + 1, true);
}
nmask.set(idx, false);
} else {
let mut m = Bitmask::new_set_all(self.len(), true);
m.set(idx, false);
self.set_null_mask(Some(m));
}
}
#[inline(always)]
unsafe fn set_null_unchecked(&mut self, idx: usize) {
if let Some(mask) = self.null_mask_mut() {
mask.set(idx, false);
} else {
let mut m = Bitmask::new_set_all(self.len(), true);
m.set(idx, false);
self.set_null_mask(Some(m));
}
}
#[inline]
fn push_nulls(&mut self, n: usize) {
let start = self.len();
let end = start + n;
self.resize(end, Self::LogicalType::default());
if let Some(mask) = self.null_mask_mut() {
mask.resize(end, false);
} else {
let mut m = Bitmask::new_set_all(end, true);
for i in start..end {
m.set(i, false);
}
self.set_null_mask(Some(m));
}
}
#[inline(always)]
unsafe fn push_nulls_unchecked(&mut self, n: usize) {
let start = self.len();
let end = start + n;
self.resize(end, Self::LogicalType::default());
if let Some(mask) = self.null_mask_mut() {
mask.resize(end, true);
for i in 0..n {
unsafe { mask.set_unchecked(start + i, false) };
}
} else {
let mut m = Bitmask::new_set_all(end, true);
for i in start..end {
unsafe { m.set_unchecked(i, false) };
}
self.set_null_mask(Some(m));
}
}
fn append_array(&mut self, other: &Self);
fn append_range(
&mut self,
other: &Self,
offset: usize,
len: usize,
) -> Result<(), MinarrowError>;
fn insert_rows(&mut self, index: usize, other: &Self) -> Result<(), MinarrowError>;
fn split(self, index: usize) -> Result<(Self, Self), MinarrowError>
where
Self: Sized;
fn extend_from_iter_with_capacity<I>(&mut self, iter: I, additional_capacity: usize)
where
I: Iterator<Item = Self::LogicalType>;
fn extend_from_slice(&mut self, slice: &[Self::LogicalType]);
fn fill(value: Self::LogicalType, count: usize) -> Self;
}