Skip to content

Commit dddf310

Browse files
committed
replace HashMap with a stack allocated table
1 parent 52cdacb commit dddf310

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/buffer/mod.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,17 +1280,20 @@ impl TextBuffer {
12801280

12811281
let mut start = offset;
12821282
let pattern = search.pattern.as_bytes();
1283+
let pattern_len = pattern.len();
12831284

12841285
let skip_table = {
1285-
let mut table = HashMap::new();
1286-
let pattern_len = pattern.len();
1286+
let mut table: [usize; 128] = [pattern.len(); 128];
12871287

12881288
for i in 0..pattern_len.saturating_sub(1) {
12891289
let c = pattern[i];
1290+
if c > 128 {
1291+
continue;
1292+
}
12901293
let skip_distance = pattern_len - i - 1;
12911294

1292-
table.insert(c.to_ascii_lowercase(), skip_distance);
1293-
table.insert(c.to_ascii_uppercase(), skip_distance);
1295+
table[c.to_ascii_lowercase() as usize] = skip_distance;
1296+
table[c.to_ascii_uppercase() as usize] = skip_distance;
12941297
}
12951298

12961299
table
@@ -1299,7 +1302,6 @@ impl TextBuffer {
12991302
let mut hit = None;
13001303

13011304
let buffer_len = self.buffer.len();
1302-
let pattern_len = pattern.len();
13031305

13041306
while start <= buffer_len {
13051307
let chunk = self.read_forward(start);
@@ -1314,7 +1316,8 @@ impl TextBuffer {
13141316
break;
13151317
}
13161318

1317-
skip = skip + skip_table.get(&chunk[skip + pattern_len - 1]).copied().unwrap_or(1);
1319+
skip +=
1320+
skip_table.get(chunk[skip + pattern_len - 1] as usize).unwrap_or(&pattern_len);
13181321
}
13191322

13201323
start += chunk.len();

0 commit comments

Comments
 (0)