mod fixed_size_primitive;
pub use fixed_size_primitive::*;
mod boolean;
pub use boolean::*;
mod variable_size_binary;
pub use variable_size_binary::*;
mod string;
pub use string::*;
mod variable_size_list;
pub use variable_size_list::*;
mod fixed_size_list;
pub use fixed_size_list::*;
mod r#struct;
pub use r#struct::*;
mod union;
pub use union::*;
mod null;
pub use null::*;
mod dictionary;
pub use dictionary::*;
pub trait ArrayType {
type Array: Array;
}
pub trait Array {
type Validity: ArrayData;
fn validity(&self) -> &Self::Validity;
fn len(&self) -> usize {
self.validity().len()
}
fn is_empty(&self) -> bool {
self.len() == 0
}
fn null_count(&self) -> usize {
self.validity().null_count()
}
fn any_null(&self) -> bool {
self.null_count() > 0
}
fn all_null(&self) -> bool {
self.null_count() == self.len()
}
fn is_null(&self, index: usize) -> bool {
self.validity().is_null(index)
}
fn valid_count(&self) -> usize {
self.len() - self.null_count()
}
fn any_valid(&self) -> bool {
self.valid_count() > 0
}
fn all_valid(&self) -> bool {
self.valid_count() == self.len()
}
fn is_valid(&self, index: usize) -> bool {
!self.is_null(index)
}
}
pub trait ArrayIndex<T> {
type Output;
fn index(&self, index: T) -> Self::Output;
}
pub trait NestedArray {
type Child: Array;
fn child(&self) -> &Self::Child;
}
pub trait ArrayData {
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn is_null(&self, index: usize) -> bool {
!self.is_valid(index)
}
fn null_count(&self) -> usize {
self.len() - self.valid_count()
}
fn is_valid(&self, index: usize) -> bool;
fn valid_count(&self) -> usize;
}
impl<T> ArrayData for T
where
T: Array,
{
fn len(&self) -> usize {
Array::len(self)
}
fn is_null(&self, index: usize) -> bool {
Array::is_null(self, index)
}
fn null_count(&self) -> usize {
Array::null_count(self)
}
fn is_valid(&self, index: usize) -> bool {
Array::is_valid(self, index)
}
fn valid_count(&self) -> usize {
Array::valid_count(self)
}
}