@@ -51,43 +51,48 @@ const logger = console
5151 normalizeRanges ( idContinueLarge )
5252
5353 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-
6254 let code = `${ banner }
6355
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
6960
7061export function isIdStart(cp: number): boolean {
71- ${ makeSmallCondtion ( idStartSmall ) }
62+ ${ makeSmallCondition ( idStartSmall ) }
7263 return isLargeIdStart(cp)
7364}
7465export function isIdContinue(cp: number): boolean {
75- ${ makeSmallCondtion ( idContinueSmall ) }
66+ ${ makeSmallCondition ( idContinueSmall ) }
7667 return isLargeIdStart(cp) || isLargeIdContinue(cp)
7768}
7869function 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()))
8471}
8572function 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+ }
8994 }
90- return largeIdContinuePatternSymbols.has(cp) || largeIdContinuePatternRanges!.some(([r1, r2]) => r1 <= cp && cp <= r2);
95+ return false
9196}`
9297
9398 logger . log ( "Formatting code..." )
@@ -145,7 +150,7 @@ function normalizeRanges(ranges: [number, number][]): void {
145150 }
146151}
147152
148- function makeSmallCondtion ( ranges : [ number , number ] [ ] ) : string {
153+ function makeSmallCondition ( ranges : [ number , number ] [ ] ) : string {
149154 const conditions : string [ ] = [ ]
150155 for ( const [ min , max ] of ranges ) {
151156 if ( min === max ) {
@@ -158,24 +163,13 @@ function makeSmallCondtion(ranges: [number, number][]): string {
158163 return conditions . join ( "\n" )
159164}
160165
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 [" ]
165168 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 ) } ,` )
178170 }
171+ lines . push ( "]" )
172+ return lines . join ( "\n" )
179173}
180174
181175function save ( content : string ) : Promise < void > {
0 commit comments