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,
}
}