#![forbid(unsafe_code)]
#![cfg_attr(all(not(test), not(feature="std")), no_std)]
#![deny(
warnings,
missing_docs,
unsafe_code,
unused_import_braces,
unused_qualifications,
trivial_casts,
trivial_numeric_casts
)]
extern crate alloc;
use alloc::{
string::{String, ToString},
};
#[inline(always)]
pub const fn copy_from_slice<T: Copy>(dst: &mut [T], src: &[T]) -> Result<usize, ()> {
let src_len = src.len();
let dst_len = dst.len();
if dst_len < src_len {
return Err(());
}
let mut i = 0;
while i < src_len {
dst[i] = src[i];
i += 1;
}
Ok(i)
}
macro_rules! unwrap {
($val:expr) => {
match $val {
Ok(val) => val,
_ => {
panic!("try to unwrap a Result::Err");
}
}
}
}
const DEC_CTX: fastnum2::decimal::Context = {
let mut ctx = fastnum2::decimal::Context::default();
ctx.set_notation(fastnum2::decimal::Notation::FullScale);
ctx
};
#[cfg(not(feature="lite"))]
pub use fastnum2::D256 as Dec;
#[cfg(feature="lite")]
pub type Dec = fastnum2::decimal::D64;
#[macro_export]
macro_rules! dec {
($val:expr) => {
{
const N: $crate::Dec = $crate::Dec::parse_str(stringify!($val), $crate::DEC_CTX);
N
}
}
}
#[cfg(all(doc, feature="cli"))]
pub mod cli;
pub mod entest;
pub use entest::{Entest, EntestResult};
pub mod chisqr;
pub use chisqr::ChiSquareCalculation;
pub mod mc;
pub use mc::MonteCarloCalculation;
pub mod mean;
pub use mean::MeanCalculation;
pub mod sc;
pub use sc::SerialCorrelationCoefficientCalculation;
pub mod shannon;
pub use shannon::ShannonCalculation;
#[cfg(test)]
mod tests;
#[inline(always)]
pub const fn error_ratio(correct: Dec, actual: Dec) -> Dec {
actual.sub(correct).abs().div(correct.abs())
}
pub trait EntropyTest {
fn update(&mut self, bytes: &[u8]);
fn finalize(&self) -> Dec;
}
pub trait EntropyTestExt: Sized + Default {
fn update<B: AsRef<[u8]>>(&mut self, bytes: B) -> &mut Self;
fn finalize(&self) -> Dec;
#[inline(always)]
fn test<B: AsRef<[u8]>>(bytes: B) -> Dec {
let mut this = Self::default();
EntropyTestExt::update(&mut this, bytes);
EntropyTestExt::finalize(&this)
}
}
impl<T: EntropyTest + Default> EntropyTestExt for T {
#[inline(always)]
fn update<B: AsRef<[u8]>>(&mut self, bytes: B) -> &mut Self {
let bytes = bytes.as_ref();
EntropyTest::update(self, bytes);
self
}
#[inline(always)]
fn finalize(&self) -> Dec {
EntropyTest::finalize(self)
}
}
#[allow(deprecated)]
impl<T: EntropyTester + Clone> EntropyTest for T {
#[inline(always)]
fn update(&mut self, bytes: &[u8]) {
EntropyTester::update(self, bytes)
}
#[inline(always)]
fn finalize(&self) -> Dec {
let mut this = self.clone();
EntropyTester::finalize(&mut this).into()
}
}
#[deprecated(note="please use `EntropyTest` instead.")]
pub trait EntropyTester {
fn update<B: AsRef<[u8]>>(&mut self, stream: B);
fn finalize(&mut self) -> f64;
}
#[deprecated(note="please use `EntropyTest` instead.")]
pub trait DynEntropyTester {
fn update(&mut self, stream: &[u8]);
fn finalize(&mut self) -> f64;
}
#[allow(deprecated)]
impl<T: EntropyTester> DynEntropyTester for T {
#[inline(always)]
fn update(&mut self, stream: &[u8]) {
EntropyTester::update(self, stream)
}
#[inline(always)]
fn finalize(&mut self) -> f64 {
EntropyTester::finalize(self)
}
}