@@ -4,32 +4,46 @@ use crate::SyntaxKind;
4
4
5
5
/// A bit-set of `SyntaxKind`s
6
6
#[ derive( Clone , Copy ) ]
7
- pub ( crate ) struct TokenSet ( u128 ) ;
7
+ pub ( crate ) struct TokenSet ( [ u64 ; 3 ] ) ;
8
+
9
+ const LAST_TOKEN_KIND_DISCRIMINANT : usize = SyntaxKind :: SHEBANG as usize ;
8
10
9
11
impl TokenSet {
10
- pub ( crate ) const EMPTY : TokenSet = TokenSet ( 0 ) ;
12
+ pub ( crate ) const EMPTY : TokenSet = TokenSet ( [ 0 ; 3 ] ) ;
11
13
12
14
pub ( crate ) const fn new ( kinds : & [ SyntaxKind ] ) -> TokenSet {
13
- let mut res = 0u128 ;
15
+ let mut res = [ 0 ; 3 ] ;
14
16
let mut i = 0 ;
15
17
while i < kinds. len ( ) {
16
- res |= mask ( kinds[ i] ) ;
18
+ let kind = kinds[ i] ;
19
+ debug_assert ! (
20
+ kind as usize <= LAST_TOKEN_KIND_DISCRIMINANT ,
21
+ "Expected a token `SyntaxKind`"
22
+ ) ;
23
+ let idx = kind as usize / 64 ;
24
+ res[ idx] |= mask ( kind) ;
17
25
i += 1 ;
18
26
}
19
27
TokenSet ( res)
20
28
}
21
29
22
30
pub ( crate ) const fn union ( self , other : TokenSet ) -> TokenSet {
23
- TokenSet ( self . 0 | other. 0 )
31
+ TokenSet ( [ self . 0 [ 0 ] | other. 0 [ 0 ] , self . 0 [ 1 ] | other . 0 [ 1 ] , self . 0 [ 2 ] | other . 0 [ 2 ] ] )
24
32
}
25
33
26
34
pub ( crate ) const fn contains ( & self , kind : SyntaxKind ) -> bool {
27
- self . 0 & mask ( kind) != 0
35
+ debug_assert ! (
36
+ kind as usize <= LAST_TOKEN_KIND_DISCRIMINANT ,
37
+ "Expected a token `SyntaxKind`"
38
+ ) ;
39
+ let idx = kind as usize / 64 ;
40
+ self . 0 [ idx] & mask ( kind) != 0
28
41
}
29
42
}
30
43
31
- const fn mask ( kind : SyntaxKind ) -> u128 {
32
- 1u128 << ( kind as usize )
44
+ const fn mask ( kind : SyntaxKind ) -> u64 {
45
+ debug_assert ! ( kind as usize <= LAST_TOKEN_KIND_DISCRIMINANT , "Expected a token `SyntaxKind`" ) ;
46
+ 1 << ( kind as usize % 64 )
33
47
}
34
48
35
49
#[ test]
0 commit comments