@@ -4,49 +4,6 @@ extern crate unicode_normalization;
4
4
5
5
include ! ( concat!( env!( "OUT_DIR" ) , "/case_folding_data.rs" ) ) ;
6
6
7
- pub fn default_case_fold_char ( c : char ) -> CaseFoldingResult {
8
- match CASE_FOLDING_TABLE . binary_search_by ( |& ( x, _) | x. cmp ( & c) ) {
9
- Err ( _) => CaseFoldingResult :: Unchanged ,
10
- Ok ( i) => CaseFoldingResult :: ReplacedWith ( CASE_FOLDING_TABLE [ i] . 1 ) ,
11
- }
12
- }
13
-
14
- #[ derive( Copy , Clone ) ]
15
- pub enum CaseFoldingResult {
16
- /// A `char` case folds to itself
17
- Unchanged ,
18
- /// A `char` case folds to a sequence of one (most common),
19
- /// two, or three `char`s.
20
- ReplacedWith ( & ' static [ char ] ) ,
21
- }
22
-
23
- pub struct CaseFold < I > {
24
- chars : I ,
25
9E7A
- queue : & ' static [ char ] ,
26
- }
27
-
28
- impl < I > Iterator for CaseFold < I > where I : Iterator < Item = char > {
29
- type Item = char ;
30
-
31
- fn next ( & mut self ) -> Option < char > {
32
- if let Some ( & c) = self . queue . first ( ) {
33
- self . queue = & self . queue [ 1 ..] ;
34
- return Some ( c) ;
35
- }
36
- self . chars . next ( ) . map ( |c| match default_case_fold_char ( c) {
37
- CaseFoldingResult :: Unchanged => c,
38
- CaseFoldingResult :: ReplacedWith ( replacement) => {
39
- self . queue = & replacement[ 1 ..] ;
40
- replacement[ 0 ]
41
- }
42
- } )
43
- }
44
-
45
- fn size_hint ( & self ) -> ( usize , Option < usize > ) {
46
- let ( low, high) = self . chars . size_hint ( ) ;
47
- ( low, high. and_then ( |h| h. checked_mul ( 3 ) ) )
48
- }
49
- }
50
7
51
8
pub trait Caseless {
52
9
fn default_case_fold ( self ) -> CaseFold < Self > ;
@@ -59,7 +16,7 @@ impl<I: Iterator<Item=char>> Caseless for I {
59
16
fn default_case_fold ( self ) -> CaseFold < I > {
60
17
CaseFold {
61
18
chars : self ,
62
- queue : & [ ] ,
19
+ queue : [ '\0' , '\0' ] ,
63
20
}
64
21
}
65
22
@@ -115,3 +72,43 @@ fn iter_eq<L: Iterator, R: Iterator>(mut a: L, mut b: R) -> bool where L::Item:
115
72
}
116
73
}
117
74
}
75
+
76
+ pub struct CaseFold < I > {
77
+ chars : I ,
78
+ queue : [ char ; 2 ] ,
79
+ }
80
+
81
+ impl < I > Iterator for CaseFold < I > where I : Iterator < Item = char > {
82
+ type Item = char ;
83
+
84
+ fn next ( & mut self ) -> Option < char > {
85
+ let c = self . queue [ 0 ] ;
86
+ if c != '\0' {
87
+ self . queue [ 0 ] = self . queue [ 1 ] ;
88
+ return Some ( c)
89
+ }
90
+ self . chars . next ( ) . map ( |c| {
91
+ match CASE_FOLDING_TABLE . binary_search_by ( |& ( x, _) | x. cmp ( & c) ) {
92
+ Err ( _) => c,
93
+ Ok ( i) => {
94
+ let folded = CASE_FOLDING_TABLE [ i] . 1 ;
95
+ self . queue = [ folded[ 1 ] , folded[ 2 ] ] ;
96
+ folded[ 0 ]
97
+ }
98
+ }
99
+ } )
100
+ }
101
+
102
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
103
+ let queue_len = if self . queue [ 0 ] == '\0' {
104
+ 0
105
+ } else if self . queue [ 1 ] == '\0' {
106
+ 1
107
+ } else {
108
+ 2
109
+ } ;
110
+ let ( low, high) = self . chars . size_hint ( ) ;
111
+ ( low. saturating_add ( queue_len) ,
112
+ high. and_then ( |h| h. checked_mul ( 3 ) ) . and_then ( |h| h. checked_add ( queue_len) ) )
113
+ }
114
+ }
0 commit comments