@@ -51,43 +51,48 @@ const logger = console
51
51
normalizeRanges ( idContinueLarge )
52
52
53
53
logger . log ( "Generating code..." )
54
- const { set : setStart , ranges : rangesStart } = makeLargePattern (
55
- idStartLarge ,
56
- )
57
-
58
- const { set : setContinue , ranges : rangesContinue } = makeLargePattern (
59
- idContinueLarge ,
60
- )
61
-
62
54
let code = `${ banner }
63
55
64
- let largeIdStartPatternSymbols: Set<number> | null = null
65
- let largeIdStartPatternRanges: [number, number][] | null = null
66
-
67
- let largeIdContinuePatternSymbols: Set<number> | null = null
68
- let largeIdContinuePatternRanges: [number, number][] | null = null
56
+ // Each two-element represents a range.
57
+ // Even indices are minimum values and odd indices are maximum values.
58
+ let largeIdStartRanges: number[] | undefined = undefined
59
+ let largeIdContinueRanges: number[] | undefined = undefined
69
60
70
61
export function isIdStart(cp: number): boolean {
71
- ${ makeSmallCondtion ( idStartSmall ) }
62
+ ${ makeSmallCondition ( idStartSmall ) }
72
63
return isLargeIdStart(cp)
73
64
}
74
65
export function isIdContinue(cp: number): boolean {
75
- ${ makeSmallCondtion ( idContinueSmall ) }
66
+ ${ makeSmallCondition ( idContinueSmall ) }
76
67
return isLargeIdStart(cp) || isLargeIdContinue(cp)
77
68
}
78
69
function isLargeIdStart(cp: number): boolean {
79
- if (largeIdStartPatternSymbols === null) {
80
- largeIdStartPatternSymbols = ${ setStart } ;
81
- largeIdStartPatternRanges = ${ rangesStart } ;
82
- }
83
- return largeIdStartPatternSymbols.has(cp) || largeIdStartPatternRanges!.some(([r1, r2]) => r1 <= cp && cp <= r2);
70
+ return isInRange(cp, largeIdStartRanges || (largeIdStartRanges = initLargeIdStartRanges()))
84
71
}
85
72
function isLargeIdContinue(cp: number): boolean {
86
- if (largeIdContinuePatternSymbols === null) {
87
- largeIdContinuePatternSymbols = ${ setContinue } ;
88
- largeIdContinuePatternRanges = ${ rangesContinue } ;
73
+ return isInRange(cp, largeIdContinueRanges || (largeIdContinueRanges = initLargeIdContinueRanges()))
74
+ }
75
+ function initLargeIdStartRanges(): number[] {
76
+ ${ makeInitLargeIdRanges ( idStartLarge ) }
77
+ }
78
+ function initLargeIdContinueRanges(): number[] {
79
+ ${ makeInitLargeIdRanges ( idContinueLarge ) }
80
+ }
81
+ function isInRange(cp: number, ranges: number[]): boolean {
82
+ let l = 0, r = ranges.length / 2 | 0, i = 0, min = 0, max = 0
83
+ while (l < r) {
84
+ i = (l + r) / 2 | 0
85
+ min = ranges[2 * i]
86
+ max = ranges[2 * i + 1]
87
+ if (cp < min) {
88
+ r = i
89
+ } else if (cp > max) {
90
+ l = i + 1
91
+ } else {
92
+ return true
93
+ }
89
94
}
90
- return largeIdContinuePatternSymbols.has(cp) || largeIdContinuePatternRanges!.some(([r1, r2]) => r1 <= cp && cp <= r2);
95
+ return false
91
96
}`
92
97
93
98
logger . log ( "Formatting code..." )
@@ -145,7 +150,7 @@ function normalizeRanges(ranges: [number, number][]): void {
145
150
}
146
151
}
147
152
148
- function makeSmallCondtion ( ranges : [ number , number ] [ ] ) : string {
153
+ function makeSmallCondition ( ranges : [ number , number ] [ ] ) : string {
149
154
const conditions : string [ ] = [ ]
150
155
for ( const [ min , max ] of ranges ) {
151
156
if ( min === max ) {
@@ -158,24 +163,13 @@ function makeSmallCondtion(ranges: [number, number][]): string {
158
163
return conditions . join ( "\n" )
159
164
}
160
165
161
- function makeLargePattern ( ranges : [ number , number ] [ ] ) {
162
- const symbols : string [ ] = [ ]
163
- const symbolRanges : string [ ] = [ ]
164
-
166
+ function makeInitLargeIdRanges ( ranges : [ number , number ] [ ] ) : string {
167
+ const lines : string [ ] = [ "return [" ]
165
168
for ( const [ min , max ] of ranges ) {
166
- if ( min === max ) {
167
- symbols . push ( `0x${ min . toString ( 16 ) } ` )
168
- } else if ( min + 1 === max ) {
169
- symbols . push ( `0x${ min . toString ( 16 ) } ` , `0x${ max . toString ( 16 ) } ` )
170
- } else {
171
- symbolRanges . push ( `[0x${ min . toString ( 16 ) } , 0x${ max . toString ( 16 ) } ]` )
172
- }
173
- }
174
-
175
- return {
176
- set : `new Set([${ symbols . join ( ) } ])` ,
177
- ranges : `[${ symbolRanges . join ( ) } ]` ,
169
+ lines . push ( `0x${ min . toString ( 16 ) } , 0x${ max . toString ( 16 ) } ,` )
178
170
}
171
+ lines . push ( "]" )
172
+ return lines . join ( "\n" )
179
173
}
180
174
181
175
function save ( content : string ) : Promise < void > {
0 commit comments