Prefer FxHashMap over HashMap in more places

accurate_ancestors_with_fallback
Wilfred Hughes 2022-05-14 11:46:35 +07:00
parent bfb2a5035c
commit 6a0858af11
2 changed files with 30 additions and 24 deletions

@ -1,9 +1,9 @@
//! Calculate which nearby lines should also be displayed.
use std::cmp::Ordering;
use std::collections::{HashMap, HashSet};
use std::collections::HashSet;
use rustc_hash::FxHashSet;
use rustc_hash::{FxHashMap, FxHashSet};
use crate::{
lines::LineNumber,
@ -331,9 +331,8 @@ fn match_preceding_blanks(
res
}
// TODO: use FxHashMap here.
pub fn opposite_positions(mps: &[MatchedPos]) -> HashMap<LineNumber, HashSet<LineNumber>> {
let mut res: HashMap<LineNumber, HashSet<LineNumber>> = HashMap::new();
pub fn opposite_positions(mps: &[MatchedPos]) -> FxHashMap<LineNumber, HashSet<LineNumber>> {
let mut res: FxHashMap<LineNumber, HashSet<LineNumber>> = FxHashMap::default();
for mp in mps {
match &mp.kind {
@ -381,7 +380,7 @@ pub fn opposite_positions(mps: &[MatchedPos]) -> HashMap<LineNumber, HashSet<Lin
/// ```
fn before_with_opposites(
before_lines: &[LineNumber],
opposite_lines: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_lines: &FxHashMap<LineNumber, HashSet<LineNumber>>,
) -> Vec<(Option<LineNumber>, Option<LineNumber>)> {
let mut lines = before_lines.to_vec();
lines.reverse();
@ -477,7 +476,7 @@ pub fn flip_tuples<Tx: Copy, Ty: Copy>(items: &[(Tx, Ty)]) -> Vec<(Ty, Tx)> {
/// 122 91 (closest match)
fn after_with_opposites(
after_lines: &[LineNumber],
opposite_lines: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_lines: &FxHashMap<LineNumber, HashSet<LineNumber>>,
prev_max_opposite: Option<LineNumber>,
max_opposite: LineNumber,
) -> Vec<(Option<LineNumber>, Option<LineNumber>)> {
@ -523,8 +522,8 @@ fn after_with_opposites(
pub fn calculate_before_context(
lines: &[(Option<LineNumber>, Option<LineNumber>)],
opposite_to_lhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_lhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
) -> Vec<(Option<LineNumber>, Option<LineNumber>)> {
match lines.first() {
Some(first_line) => match *first_line {
@ -544,8 +543,8 @@ pub fn calculate_before_context(
pub fn calculate_after_context(
lines: &[(Option<LineNumber>, Option<LineNumber>)],
opposite_to_lhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_lhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
max_lhs_src_line: LineNumber,
max_rhs_src_line: LineNumber,
) -> Vec<(Option<LineNumber>, Option<LineNumber>)> {
@ -593,8 +592,8 @@ pub fn calculate_after_context(
pub fn add_context(
lines: &[(Option<LineNumber>, Option<LineNumber>)],
opposite_to_lhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_lhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
max_lhs_src_line: LineNumber,
max_rhs_src_line: LineNumber,
) -> Vec<(Option<LineNumber>, Option<LineNumber>)> {
@ -741,10 +740,10 @@ mod tests {
fn test_calculate_before_context() {
let lines = vec![(Some(1.into()), Some(1.into()))];
let mut opposite_to_lhs = HashMap::new();
let mut opposite_to_lhs = FxHashMap::default();
opposite_to_lhs.insert(0.into(), HashSet::from_iter([0.into()]));
let mut opposite_to_rhs = HashMap::new();
let mut opposite_to_rhs = FxHashMap::default();
opposite_to_rhs.insert(0.into(), HashSet::from_iter([0.into()]));
let res = calculate_before_context(&lines, &opposite_to_lhs, &opposite_to_rhs);

@ -5,7 +5,9 @@
/// If we exceed this, the lines are stored in separate hunks.
const MAX_DISTANCE: usize = 4;
use std::collections::{HashMap, HashSet};
use std::collections::HashSet;
use rustc_hash::FxHashMap;
use crate::{
constants::Side,
@ -130,8 +132,8 @@ fn extract_lines(hunk: &Hunk) -> Vec<(Option<LineNumber>, Option<LineNumber>)> {
pub fn merge_adjacent(
hunks: &[Hunk],
opposite_to_lhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_lhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
max_lhs_src_line: LineNumber,
max_rhs_src_line: LineNumber,
) -> Vec<Hunk> {
@ -360,8 +362,8 @@ fn novel_section_in_order(
rhs_novel_mps: &[&MatchedPos],
lhs_prev_matched_line: Option<LineNumber>,
rhs_prev_matched_line: Option<LineNumber>,
opposite_to_lhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_lhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
) -> Vec<(Side, MatchedPos)> {
let mut res: Vec<(Side, MatchedPos)> = vec![];
@ -435,8 +437,8 @@ fn novel_section_in_order(
fn sorted_novel_positions(
lhs_mps: &[MatchedPos],
rhs_mps: &[MatchedPos],
opposite_to_lhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &HashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_lhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
opposite_to_rhs: &FxHashMap<LineNumber, HashSet<LineNumber>>,
) -> Vec<(Side, MatchedPos)> {
let mut lhs_mps: Vec<MatchedPos> = lhs_mps.to_vec();
lhs_mps.sort_unstable_by_key(|mp| mp.pos);
@ -503,7 +505,7 @@ fn sorted_novel_positions(
fn next_opposite(
line: LineNumber,
opposites: &HashMap<LineNumber, HashSet<LineNumber>>,
opposites: &FxHashMap<LineNumber, HashSet<LineNumber>>,
prev_opposite: Option<LineNumber>,
) -> Option<LineNumber> {
opposites.get(&line).and_then(|lines_set| {
@ -691,7 +693,12 @@ mod tests {
};
let lhs_mps = vec![novel_mp.clone(), matched_mp.clone()];
let res = sorted_novel_positions(&lhs_mps, &[matched_mp], &HashMap::new(), &HashMap::new());
let res = sorted_novel_positions(
&lhs_mps,
&[matched_mp],
&FxHashMap::default(),
&FxHashMap::default(),
);
assert_eq!(res, vec![(Side::Left, novel_mp)]);
}