pub type EliasFano = sbits::EliasFano;
pub fn elias_fano_from_sorted_ids(ids: &[u32], universe_size: u32) -> EliasFano {
let ids64: Vec<u64> = ids.iter().map(|&x| x as u64).collect();
EliasFano::new(&ids64, universe_size as u64)
}
#[cfg(test)]
mod tests {
use super::*;
use proptest::prelude::*;
#[test]
fn elias_fano_empty_is_empty() {
let ef = elias_fano_from_sorted_ids(&[], 0);
assert_eq!(ef.len(), 0);
assert!(ef.is_empty());
}
#[test]
fn elias_fano_roundtrip_get_matches_input() {
let ids = vec![1u32, 5, 10, 20, 50, 100];
let ef = elias_fano_from_sorted_ids(&ids, 1_000);
assert_eq!(ef.len(), ids.len());
for (i, &id) in ids.iter().enumerate() {
assert_eq!(ef.get(i).unwrap(), id as u64);
}
}
proptest! {
#[test]
fn elias_fano_property_get_matches_input(mut ids in prop::collection::vec(0u32..1_000_000u32, 0..500)) {
ids.sort_unstable();
ids.dedup();
let ef = elias_fano_from_sorted_ids(&ids, 1_000_000);
prop_assert_eq!(ef.len(), ids.len());
for (i, &id) in ids.iter().enumerate() {
prop_assert_eq!(ef.get(i).unwrap(), id as u64);
}
}
}
}