@@ -18,33 +18,33 @@ const PATTERN_ID_INVALID: u32 = std::u32::MAX;
18
18
const FAIL_MAX : usize = 0x00ffffff ;
19
19
20
20
struct SparseTrie {
21
- nodes : Vec < Vec < ( u8 , usize ) > > ,
22
- pattern_id : Vec < usize > ,
21
+ states : Vec < Vec < ( u8 , usize ) > > ,
22
+ pattern_ids : Vec < usize > ,
23
23
len : usize ,
24
24
}
25
25
26
26
impl SparseTrie {
27
27
fn new ( ) -> Self {
28
28
Self {
29
- nodes : vec ! [ vec![ ] ] ,
30
- pattern_id : vec ! [ std:: usize :: MAX ] ,
29
+ states : vec ! [ vec![ ] ] ,
30
+ pattern_ids : vec ! [ std:: usize :: MAX ] ,
31
31
len : 0 ,
32
32
}
33
33
}
34
34
35
35
#[ inline( always) ]
36
36
fn add ( & mut self , pattern : & [ u8 ] ) -> Result < ( ) , DaachorseError > {
37
- let mut node_id = 0 ;
37
+ let mut state_id = 0 ;
38
38
for & c in pattern {
39
- node_id = self . get ( node_id , c) . unwrap_or_else ( || {
40
- let next_node_id = self . nodes . len ( ) ;
41
- self . nodes . push ( vec ! [ ] ) ;
42
- self . nodes [ node_id ] . push ( ( c, next_node_id ) ) ;
43
- self . pattern_id . push ( std:: usize:: MAX ) ;
44
- next_node_id
39
+ state_id = self . get ( state_id , c) . unwrap_or_else ( || {
40
+ let next_state_id = self . states . len ( ) ;
41
+ self . states . push ( vec ! [ ] ) ;
42
+ self . states [ state_id ] . push ( ( c, next_state_id ) ) ;
43
+ self . pattern_ids . push ( std:: usize:: MAX ) ;
44
+ next_state_id
45
45
} ) ;
46
46
}
47
- let pattern_id = self . pattern_id . get_mut ( node_id ) . unwrap ( ) ;
47
+ let pattern_id = self . pattern_ids . get_mut ( state_id ) . unwrap ( ) ;
48
48
if * pattern_id != std:: usize:: MAX {
49
49
let e = DuplicatePatternError {
50
50
pattern : pattern. to_vec ( ) ,
@@ -63,10 +63,10 @@ impl SparseTrie {
63
63
}
64
64
65
65
#[ inline( always) ]
66
- fn get ( & self , node_id : usize , c : u8 ) -> Option < usize > {
67
- for trans in & self . nodes [ node_id ] {
68
- if c == trans . 0 {
69
- return Some ( trans . 1 ) ;
66
+ fn get ( & self , state_id : usize , c : u8 ) -> Option < usize > {
67
+ for & ( cc , child_id ) in & self . states [ state_id ] {
68
+ if c == cc {
69
+ return Some ( child_id ) ;
70
70
}
71
71
}
72
72
None
@@ -243,34 +243,34 @@ impl DoubleArrayAhoCorasickBuilder {
243
243
}
244
244
245
245
fn build_double_array ( & mut self , sparse_trie : & SparseTrie ) -> Result < ( ) , DaachorseError > {
246
- let mut node_id_map = vec ! [ std:: usize :: MAX ; sparse_trie. nodes . len( ) ] ;
247
- node_id_map [ 0 ] = 0 ;
246
+ let mut state_id_map = vec ! [ std:: usize :: MAX ; sparse_trie. states . len( ) ] ;
247
+ state_id_map [ 0 ] = 0 ;
248
248
249
249
self . init_array ( ) ;
250
250
251
- for ( i, node ) in sparse_trie. nodes . iter ( ) . enumerate ( ) {
252
- let idx = node_id_map [ i] ;
251
+ for ( i, edges ) in sparse_trie. states . iter ( ) . enumerate ( ) {
252
+ let idx = state_id_map [ i] ;
253
253
{
254
- let pattern_id = sparse_trie. pattern_id [ i] ;
254
+ let pattern_id = sparse_trie. pattern_ids [ i] ;
255
255
if pattern_id != std:: usize:: MAX {
256
256
self . extras [ idx] . pattern_id = pattern_id as u32 ;
257
257
}
258
258
}
259
259
260
- if node . is_empty ( ) {
260
+ if edges . is_empty ( ) {
261
261
continue ;
262
262
}
263
263
264
- let base = self . find_base ( node ) ;
264
+ let base = self . find_base ( edges ) ;
265
265
if base >= self . states . len ( ) {
266
266
self . extend_array ( ) ?;
267
267
}
268
268
269
- for & ( c, child_id) in node {
269
+ for & ( c, child_id) in edges {
270
270
let child_idx = base ^ c as usize ;
271
271
self . fix_state ( child_idx) ;
272
272
self . states [ child_idx] . set_check ( c) ;
273
- node_id_map [ child_id] = child_idx;
273
+ state_id_map [ child_id] = child_idx;
274
274
}
275
275
self . states [ idx] . set_base ( base as u32 ) ;
276
276
self . extras [ base] . used_base = true ;
@@ -329,15 +329,15 @@ impl DoubleArrayAhoCorasickBuilder {
329
329
}
330
330
331
331
#[ inline( always) ]
332
- fn find_base ( & self , node : & [ ( u8 , usize ) ] ) -> usize {
332
+ fn find_base ( & self , edges : & [ ( u8 , usize ) ] ) -> usize {
333
333
if self . head_idx == std:: usize:: MAX {
334
334
return self . states . len ( ) ;
335
335
}
336
336
let mut idx = self . head_idx ;
337
337
loop {
338
338
debug_assert ! ( !self . extras[ idx] . used_index) ;
339
- let base = idx ^ node [ 0 ] . 0 as usize ;
340
- if self . check_valid_base ( base, node ) {
339
+ let base = idx ^ edges [ 0 ] . 0 as usize ;
340
+ if self . check_valid_base ( base, edges ) {
341
341
return base;
342
342
}
343
343
idx = self . extras [ idx] . next ;
@@ -348,11 +348,11 @@ impl DoubleArrayAhoCorasickBuilder {
348
348
self . states . len ( )
349
349
}
350
350
351
- fn check_valid_base ( & self , base : usize , node : & [ ( u8 , usize ) ] ) -> bool {
351
+ fn check_valid_base ( & self , base : usize , edges : & [ ( u8 , usize ) ] ) -> bool {
352
352
if self . extras [ base] . used_base {
353
353
return false ;
354
354
}
355
- for & ( c, _) in node {
355
+ for & ( c, _) in edges {
356
356
let idx = base ^ c as usize ;
357
357
if self . extras [ idx] . used_index {
358
358
return false ;
@@ -437,9 +437,9 @@ impl DoubleArrayAhoCorasickBuilder {
437
437
438
438
fn add_fails ( & mut self , sparse_trie : & SparseTrie ) -> Result < ( ) , DaachorseError > {
439
439
self . states [ 0 ] . set_fail ( 0 ) ;
440
- self . visits . reserve ( sparse_trie. nodes . len ( ) ) ;
440
+ self . visits . reserve ( sparse_trie. states . len ( ) ) ;
441
441
442
- for & ( c, st_child_idx) in & sparse_trie. nodes [ 0 ] {
442
+ for & ( c, st_child_idx) in & sparse_trie. states [ 0 ] {
443
443
let da_child_idx = self . get_child_index ( 0 , c) . unwrap ( ) ;
444
444
self . states [ da_child_idx] . set_fail ( 0 ) ;
445
445
self . visits . push ( StatePair {
@@ -451,14 +451,14 @@ impl DoubleArrayAhoCorasickBuilder {
451
451
let mut vi = 0 ;
452
452
while vi < self . visits . len ( ) {
453
453
let StatePair {
454
- da_idx : da_node_idx ,
455
- st_idx : st_node_idx ,
454
+ da_idx : da_state_idx ,
455
+ st_idx : st_state_idx ,
456
456
} = self . visits [ vi] ;
457
457
vi += 1 ;
458
458
459
- for & ( c, st_child_idx) in & sparse_trie. nodes [ st_node_idx ] {
460
- let da_child_idx = self . get_child_index ( da_node_idx , c) . unwrap ( ) ;
461
- let mut fail_idx = self . states [ da_node_idx ] . fail ( ) as usize ;
459
+ for & ( c, st_child_idx) in & sparse_trie. states [ st_state_idx ] {
460
+ let da_child_idx = self . get_child_index ( da_state_idx , c) . unwrap ( ) ;
461
+ let mut fail_idx = self . states [ da_state_idx ] . fail ( ) as usize ;
462
462
let new_fail_idx = loop {
463
463
if let Some ( child_fail_idx) = self . get_child_index ( fail_idx, c) {
464
464
break child_fail_idx;
@@ -500,25 +500,25 @@ impl DoubleArrayAhoCorasickBuilder {
500
500
} ;
501
501
502
502
for sp in self . visits . iter ( ) . rev ( ) {
503
- let mut da_node_idx = sp. da_idx ;
503
+ let mut da_state_idx = sp. da_idx ;
504
504
505
505
let Extra {
506
506
pattern_id,
507
507
processed,
508
508
..
509
- } = self . extras [ da_node_idx ] ;
509
+ } = self . extras [ da_state_idx ] ;
510
510
511
511
if pattern_id == PATTERN_ID_INVALID {
512
512
continue ;
513
513
}
514
514
if processed {
515
- debug_assert ! ( self . states[ da_node_idx ] . output_pos( ) . is_some( ) ) ;
515
+ debug_assert ! ( self . states[ da_state_idx ] . output_pos( ) . is_some( ) ) ;
516
516
continue ;
517
517
}
518
- debug_assert ! ( self . states[ da_node_idx ] . output_pos( ) . is_none( ) ) ;
518
+ debug_assert ! ( self . states[ da_state_idx ] . output_pos( ) . is_none( ) ) ;
519
519
520
- self . extras [ da_node_idx ] . processed = true ;
521
- self . states [ da_node_idx ] . set_output_pos ( self . outputs . len ( ) as u32 ) ;
520
+ self . extras [ da_state_idx ] . processed = true ;
521
+ self . states [ da_state_idx ] . set_output_pos ( self . outputs . len ( ) as u32 ) ;
522
522
self . outputs . push ( Output :: new (
523
523
pattern_id,
524
524
self . pattern_lens [ pattern_id as usize ] as u32 ,
@@ -528,23 +528,23 @@ impl DoubleArrayAhoCorasickBuilder {
528
528
error_checker ( & self . outputs ) ?;
529
529
530
530
loop {
531
- da_node_idx = self . states [ da_node_idx ] . fail ( ) as usize ;
532
- if da_node_idx == 0 {
531
+ da_state_idx = self . states [ da_state_idx ] . fail ( ) as usize ;
532
+ if da_state_idx == 0 {
533
533
break ;
534
534
}
535
535
536
536
let Extra {
537
537
pattern_id,
538
538
processed,
539
539
..
540
- } = self . extras [ da_node_idx ] ;
540
+ } = self . extras [ da_state_idx ] ;
541
541
542
542
if pattern_id == PATTERN_ID_INVALID {
543
543
continue ;
544
544
}
545
545
546
546
if processed {
547
- let mut clone_pos = self . states [ da_node_idx ] . output_pos ( ) . unwrap ( ) as usize ;
547
+ let mut clone_pos = self . states [ da_state_idx ] . output_pos ( ) . unwrap ( ) as usize ;
548
548
debug_assert ! ( !self . outputs[ clone_pos] . is_begin( ) ) ;
549
549
while !self . outputs [ clone_pos] . is_begin ( ) {
550
550
self . outputs . push ( self . outputs [ clone_pos] ) ;
@@ -554,8 +554,8 @@ impl DoubleArrayAhoCorasickBuilder {
554
554
break ;
555
555
}
556
556
557
- self . extras [ da_node_idx ] . processed = true ;
558
- self . states [ da_node_idx ] . set_output_pos ( self . outputs . len ( ) as u32 ) ;
557
+ self . extras [ da_state_idx ] . processed = true ;
558
+ self . states [ da_state_idx ] . set_output_pos ( self . outputs . len ( ) as u32 ) ;
559
559
self . outputs . push ( Output :: new (
560
560
pattern_id,
561
561
self . pattern_lens [ pattern_id as usize ] as u32 ,
@@ -574,24 +574,24 @@ impl DoubleArrayAhoCorasickBuilder {
574
574
575
575
fn set_dummy_outputs ( & mut self ) {
576
576
for sp in self . visits . iter ( ) {
577
- let da_node_idx = sp. da_idx ;
577
+ let da_state_idx = sp. da_idx ;
578
578
579
579
let Extra {
580
580
pattern_id,
581
581
processed,
582
582
..
583
- } = self . extras [ da_node_idx ] ;
583
+ } = self . extras [ da_state_idx ] ;
584
584
585
585
if processed {
586
- debug_assert ! ( self . states[ da_node_idx ] . output_pos( ) . is_some( ) ) ;
586
+ debug_assert ! ( self . states[ da_state_idx ] . output_pos( ) . is_some( ) ) ;
587
587
continue ;
588
588
}
589
- debug_assert ! ( self . states[ da_node_idx ] . output_pos( ) . is_none( ) ) ;
589
+ debug_assert ! ( self . states[ da_state_idx ] . output_pos( ) . is_none( ) ) ;
590
590
debug_assert_eq ! ( pattern_id, PATTERN_ID_INVALID ) ;
591
591
592
- let fail_idx = self . states [ da_node_idx ] . fail ( ) as usize ;
592
+ let fail_idx = self . states [ da_state_idx ] . fail ( ) as usize ;
593
593
if let Some ( output_pos) = self . states [ fail_idx] . output_pos ( ) {
594
- self . states [ da_node_idx ] . set_output_pos ( output_pos) ;
594
+ self . states [ da_state_idx ] . set_output_pos ( output_pos) ;
595
595
}
596
596
}
597
597
}
0 commit comments