#![allow(clippy::module_name_repetitions)]
pub mod counting;
pub mod scalable;
pub mod standard;
pub use counting::{CountingBloomFilterBuilder, CountingFilterMetadata};
pub use scalable::{ScalableBloomFilterBuilder, ScalableFilterMetadata};
pub use standard::{FilterMetadata, StandardBloomFilterBuilder};
use crate::error::{BloomCraftError, Result};
mod validation {
use super::*;
#[inline]
pub fn validate_items(items: usize) -> Result<()> {
if items == 0 {
return Err(BloomCraftError::invalid_item_count(items));
}
Ok(())
}
#[inline]
pub fn validate_fp_rate(fp_rate: f64) -> Result<()> {
if fp_rate <= 0.0 || fp_rate >= 1.0 {
return Err(BloomCraftError::fp_rate_out_of_bounds(fp_rate));
}
Ok(())
}
#[inline]
pub fn validate_growth_factor(factor: f64) -> Result<()> {
if factor <= 1.0 {
return Err(BloomCraftError::invalid_parameters(format!(
"Growth factor {} must be > 1.0",
factor
)));
}
if factor > 10.0 {
return Err(BloomCraftError::invalid_parameters(format!(
"Growth factor {} exceeds reasonable limit (10.0)",
factor
)));
}
Ok(())
}
#[inline]
pub fn validate_tightening_ratio(ratio: f64) -> Result<()> {
if ratio <= 0.0 || ratio >= 1.0 {
return Err(BloomCraftError::invalid_parameters(format!(
"Tightening ratio {} must be in (0, 1)",
ratio
)));
}
Ok(())
}
#[inline]
pub fn validate_max_count(max_count: u16) -> Result<()> {
if max_count < 1 {
return Err(BloomCraftError::invalid_parameters(
"max_count must be >= 1".to_string(),
));
}
Ok(())
}
}
pub mod prelude {
pub use super::{
CountingBloomFilterBuilder, ScalableBloomFilterBuilder, StandardBloomFilterBuilder,
};
}
#[cfg(test)]
mod tests {
use super::validation::*;
#[test]
fn test_validate_items() {
assert!(validate_items(1).is_ok());
assert!(validate_items(1000).is_ok());
assert!(validate_items(0).is_err());
}
#[test]
fn test_validate_fp_rate() {
assert!(validate_fp_rate(0.01).is_ok());
assert!(validate_fp_rate(0.5).is_ok());
assert!(validate_fp_rate(0.0).is_err());
assert!(validate_fp_rate(1.0).is_err());
assert!(validate_fp_rate(-0.1).is_err());
assert!(validate_fp_rate(1.5).is_err());
}
#[test]
fn test_validate_growth_factor() {
assert!(validate_growth_factor(1.5).is_ok());
assert!(validate_growth_factor(2.0).is_ok());
assert!(validate_growth_factor(10.0).is_ok());
assert!(validate_growth_factor(1.0).is_err());
assert!(validate_growth_factor(0.5).is_err());
assert!(validate_growth_factor(11.0).is_err());
}
#[test]
fn test_validate_tightening_ratio() {
assert!(validate_tightening_ratio(0.5).is_ok());
assert!(validate_tightening_ratio(0.85).is_ok());
assert!(validate_tightening_ratio(0.0).is_err());
assert!(validate_tightening_ratio(1.0).is_err());
assert!(validate_tightening_ratio(-0.1).is_err());
assert!(validate_tightening_ratio(1.5).is_err());
}
#[test]
fn test_validate_max_count() {
assert!(validate_max_count(1).is_ok());
assert!(validate_max_count(15).is_ok());
assert!(validate_max_count(255).is_ok());
assert!(validate_max_count(0).is_err());
}
}