]>
Commit | Line | Data |
---|---|---|
0a29b90c FG |
1 | use crate::intern::Token; |
2 | ||
3 | pub fn common_prefix(file1: &[Token], file2: &[Token]) -> u32 { | |
4 | let mut off = 0; | |
5 | for (token1, token2) in file1.iter().zip(file2) { | |
6 | if token1 != token2 { | |
7 | break; | |
8 | } | |
9 | off += 1; | |
10 | } | |
11 | off | |
12 | } | |
13 | ||
14 | pub fn common_postfix(file1: &[Token], file2: &[Token]) -> u32 { | |
15 | let mut off = 0; | |
16 | for (token1, token2) in file1.iter().rev().zip(file2.iter().rev()) { | |
17 | if token1 != token2 { | |
18 | break; | |
19 | } | |
20 | off += 1; | |
21 | } | |
22 | off | |
23 | } | |
24 | ||
25 | pub fn common_edges(file1: &[Token], file2: &[Token]) -> (u32, u32) { | |
26 | let prefix = common_prefix(file1, file2); | |
27 | let postfix = common_postfix(&file1[prefix as usize..], &file2[prefix as usize..]); | |
28 | (prefix, postfix) | |
29 | } | |
30 | ||
31 | pub fn strip_common_prefix(file1: &mut &[Token], file2: &mut &[Token]) -> u32 { | |
32 | let off = common_prefix(file1, file2); | |
33 | *file1 = &file1[off as usize..]; | |
34 | *file2 = &file2[off as usize..]; | |
35 | off | |
36 | } | |
37 | ||
38 | pub fn strip_common_postfix(file1: &mut &[Token], file2: &mut &[Token]) -> u32 { | |
39 | let off = common_postfix(file1, file2); | |
40 | *file1 = &file1[..file1.len() - off as usize]; | |
41 | *file2 = &file2[..file2.len() - off as usize]; | |
42 | off | |
43 | } | |
44 | ||
45 | pub fn sqrt(val: usize) -> u32 { | |
46 | let nbits = (usize::BITS as u32 - val.leading_zeros()) / 2; | |
47 | 1 << nbits | |
48 | } |