@@ -9,14 +9,17 @@ pub(crate) fn generate_case_mapping(data: &UnicodeData) -> (String, [usize; 2])
99 let ( lower_tables, lower_size) = generate_tables ( "LOWER" , & data. to_lower ) ;
1010 let ( upper_tables, upper_size) = generate_tables ( "UPPER" , & data. to_upper ) ;
1111 let file = format ! (
12- "{HEADER}
12+ "
1313 {lower_tables}
1414 {upper_tables}"
1515 ) ;
1616 ( file, [ lower_size, upper_size] )
1717}
1818
19- fn generate_tables ( case : & str , data : & BTreeMap < u32 , [ u32 ; 3 ] > ) -> ( String , usize ) {
19+ fn generate_tables ( prop : & str , data : & BTreeMap < u32 , [ u32 ; 3 ] > ) -> ( String , usize ) {
20+ let prop_lower = prop. to_lowercase ( ) ;
21+ let prop_upper = prop. to_uppercase ( ) ;
22+
2023 let mut mappings = Vec :: with_capacity ( data. len ( ) ) ;
2124 let mut multis = Vec :: new ( ) ;
2225
@@ -45,8 +48,16 @@ fn generate_tables(case: &str, data: &BTreeMap<u32, [u32; 3]>) -> (String, usize
4548 let size = size_of_val ( mappings. as_slice ( ) ) + size_of_val ( multis. as_slice ( ) ) ;
4649 let file = format ! (
4750 "
48- #[rustfmt::skip]\n static {case}CASE_TABLE: &[(char, u32); {mappings_len}] = &[{mappings}];
49- #[rustfmt::skip]\n static {case}CASE_TABLE_MULTI: &[[char; 3]; {multis_len}] = &[{multis}];" ,
51+ pub fn to_{prop_lower}(c: char) -> [char; 3] {{
52+ super::case_conversion(
53+ c,
54+ |c| c.to_ascii_{prop_lower}case(),
55+ {prop_upper}CASE_TABLE,
56+ {prop_upper}CASE_TABLE_MULTI,
57+ )
58+ }}
59+ #[rustfmt::skip]\n static {prop_upper}CASE_TABLE: &[(char, u32); {mappings_len}] = &[{mappings}];
60+ #[rustfmt::skip]\n static {prop_upper}CASE_TABLE_MULTI: &[[char; 3]; {multis_len}] = &[{multis}];" ,
5061 mappings = fmt_list( & mappings) ,
5162 mappings_len = mappings. len( ) ,
5263 multis = fmt_list( & multis) ,
@@ -55,41 +66,3 @@ fn generate_tables(case: &str, data: &BTreeMap<u32, [u32; 3]>) -> (String, usize
5566
5667 ( file, size)
5768}
58-
59- static HEADER : & str = r"
60- const INDEX_MASK: u32 = 1 << 22;
61-
62- pub fn to_lower(c: char) -> [char; 3] {
63- if c.is_ascii() {
64- [(c as u8).to_ascii_lowercase() as char, '\0', '\0']
65- } else {
66- LOWERCASE_TABLE
67- .binary_search_by(|&(key, _)| key.cmp(&c))
68- .map(|i| {
69- let u = LOWERCASE_TABLE[i].1;
70- char::from_u32(u).map(|c| [c, '\0', '\0']).unwrap_or_else(|| {
71- // SAFETY: Index comes from statically generated table
72- unsafe { *LOWERCASE_TABLE_MULTI.get_unchecked((u & (INDEX_MASK - 1)) as usize) }
73- })
74- })
75- .unwrap_or([c, '\0', '\0'])
76- }
77- }
78-
79- pub fn to_upper(c: char) -> [char; 3] {
80- if c.is_ascii() {
81- [(c as u8).to_ascii_uppercase() as char, '\0', '\0']
82- } else {
83- UPPERCASE_TABLE
84- .binary_search_by(|&(key, _)| key.cmp(&c))
85- .map(|i| {
86- let u = UPPERCASE_TABLE[i].1;
87- char::from_u32(u).map(|c| [c, '\0', '\0']).unwrap_or_else(|| {
88- // SAFETY: Index comes from statically generated table
89- unsafe { *UPPERCASE_TABLE_MULTI.get_unchecked((u & (INDEX_MASK - 1)) as usize) }
90- })
91- })
92- .unwrap_or([c, '\0', '\0'])
93- }
94- }
95- " ;
0 commit comments