use super::*;
use std::borrow::Borrow;
#[cfg(feature = "serde_support")]
use serde::{Deserialize, Serialize};
mod binning_int_fast;
pub use binning_int_fast::*;
mod binning_int_multi;
pub use binning_int_multi::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
pub enum Bin<T> {
SingleValued(T),
InclusiveInclusive(T, T),
InclusiveExclusive(T, T),
ExclusiveInclusive(T, T),
ExclusiveExclusive(T, T),
}
pub trait Binning<T> {
fn get_bin_index<V: Borrow<T>>(&self, val: V) -> Option<usize>;
fn get_bin_len(&self) -> usize;
fn bin_iter(&self) -> Box<dyn Iterator<Item = Bin<T>>>;
fn is_inside<V: Borrow<T>>(&self, val: V) -> bool;
fn not_inside<V: Borrow<T>>(&self, val: V) -> bool;
fn first_border(&self) -> T;
fn last_border(&self) -> T;
fn last_border_is_inclusive(&self) -> bool;
fn distance<V: Borrow<T>>(&self, val: V) -> f64;
fn to_generic_hist(self) -> GenericHist<Self, T>
where
Self: Sized,
{
GenericHist::new(self)
}
fn to_generic_atomic_hist(self) -> AtomicGenericHist<Self, T>
where
Self: Sized,
{
AtomicGenericHist::new(self)
}
}
pub trait BinDisplay {
type BinEntry;
fn display_bin_iter(&'_ self) -> Box<dyn Iterator<Item = Self::BinEntry> + '_>;
fn write_bin<W: std::io::Write>(entry: &Self::BinEntry, writer: W) -> std::io::Result<()>;
fn write_header<W: std::io::Write>(&self, writer: W) -> std::io::Result<()>;
}