fn count()

in rust-create-cascade/src/main.rs [367:409]


fn count(
    revoked_serials_and_reasons: Option<RevokedSerialAndReasonIterator>,
    known_serials: KnownSerialIterator,
) -> BlockStats {
    let mut known_revoked_serial_set = HashSet::new();
    let mut reasons = ReasonCodeHistogram::default();

    let mut approx_counts = HashMap::<u64, (usize, usize)>::new();

    let revoked_serial_to_reason_map: HashMap<Serial, Reason> = revoked_serials_and_reasons
        .map(|iter| iter.into())
        .unwrap_or_default();

    for (date, serial) in known_serials {
        let (approx_ok_count, approx_revoked_count) = approx_counts.entry(date).or_insert((0, 0));
        if let Some(reason) = revoked_serial_to_reason_map.get(serial.as_str()) {
            known_revoked_serial_set.insert(serial);
            reasons.add(*reason);
            *approx_revoked_count += 1;
        } else {
            *approx_ok_count += 1;
        }
    }

    let mut approx_ok_count = 0;
    let mut split_by_issuer_and_expiry_lower_bound = 0.0;
    for (block_approx_ok_count, block_approx_revoked_count) in approx_counts.values() {
        approx_ok_count += block_approx_ok_count;
        split_by_issuer_and_expiry_lower_bound +=
            size_lower_bound_bytes(*block_approx_ok_count, *block_approx_revoked_count);
    }

    let exact_revoked_count = known_revoked_serial_set.len();
    let split_by_issuer_lower_bound = size_lower_bound_bytes(approx_ok_count, exact_revoked_count);

    BlockStats {
        exact_revoked_count,
        approx_ok_count,
        reasons,
        split_by_issuer_lower_bound,
        split_by_issuer_and_expiry_lower_bound,
    }
}