in guppy-summaries/src/diff.rs [184:233]
fn combine_insert_remove(changed: &mut BTreeMap<&'a SummaryId, SummaryDiffStatus<'a>>) {
let mut combine_statuses = HashMap::with_capacity(changed.len());
for (summary_id, status) in &*changed {
let entry = combine_statuses
.entry(summary_id.name.as_str())
.or_insert_with(|| CombineStatus::None);
match status {
SummaryDiffStatus::Added { .. } => entry.record_added(summary_id),
SummaryDiffStatus::Removed { .. } => entry.record_removed(summary_id),
SummaryDiffStatus::Modified { .. } => entry.record_changed(),
}
}
for status in combine_statuses.values() {
if let CombineStatus::Combine { added, removed } = status {
let removed_status = changed
.remove(removed)
.expect("removed ID should be present");
let old_info = match removed_status {
SummaryDiffStatus::Removed { old_info } => old_info,
other => panic!("expected Removed, found {:?}", other),
};
let added_status = changed.get_mut(added).expect("added ID should be present");
let new_info = match &*added_status {
SummaryDiffStatus::Added { info } => *info,
other => panic!("expected Added, found {:?}", other),
};
let old_version = if added.version != removed.version {
Some(&removed.version)
} else {
None
};
let old_source = if added.source != removed.source {
Some(&removed.source)
} else {
None
};
// Don't need the old value of added_status any more since we've already extracted the value out of it.
let _ = mem::replace(
added_status,
SummaryDiffStatus::make_changed(old_version, old_source, old_info, new_info),
);
}
}
}