typed-ident 0.0.2

Type-safe identifier validation, inspection, and mutation.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
// =============================================================================
//                          DO NOT HAND EDIT THIS FILE!
// -----------------------------------------------------------------------------
// This file was generated by `typed-ident-generator generate`. Please use
// that utility to update this file (see generator/README.md for more info.)
// -----------------------------------------------------------------------------
//                               Unicode 18.0.0
// =============================================================================

// =============================================================================
// MODULES
// =============================================================================

// -----------------------------------------------------------------------------
#[cfg(test)]
#[cfg(not(miri))]
#[path = "generated.tests.rs"]
mod tests;

// =============================================================================
// CONSTANTS
// =============================================================================

// -----------------------------------------------------------------------------
#[cfg(feature = "unicode")]
pub const UNICODE_VERSION: (u32, u32, u32) = (18, 0, 0);

// =============================================================================
// FUNCTIONS
// =============================================================================

// -----------------------------------------------------------------------------
fn in_range(c: char, table: &[(char, char)]) -> bool {
    use core::cmp::Ordering::*;
    table
        .binary_search_by(|&(low, high)| {
            if low > c {
                Greater
            } else if high < c {
                Less
            } else {
                Equal
            }
        })
        .is_ok()
}

/// Returns `true` if the character provided is `Titlecase`.
///
/// Titlecase characters are digraph characters in which the same code point
/// starts uppercase, but ends lowercase semantically.
///
/// Greek Examples: ᾈ, ᾨ, ῌ, ᾚ
/// Non-Greek Examples: Dž, Lj, Nj, Dz
pub fn is_titlecase(c: char) -> bool {
    const TABLE: &[(char, char)] = &[
        ('\u{001C5}', '\u{001C5}'), ('\u{001C8}', '\u{001C8}'), ('\u{001CB}', '\u{001CB}'),
        ('\u{001F2}', '\u{001F2}'), ('\u{01F88}', '\u{01F8F}'), ('\u{01F98}', '\u{01F9F}'),
        ('\u{01FA8}', '\u{01FAF}'), ('\u{01FBC}', '\u{01FBC}'), ('\u{01FCC}', '\u{01FCC}'),
        ('\u{01FFC}', '\u{01FFC}'),
    ];
    if c < '\u{001C5}' {
        return false;
    }
    in_range(c, TABLE)
}

/// Returns `true` if the titlecase character provided is `Greek`.
///
/// This only has meaning if you already know that the character provided is
/// titlecase, it has no meaning if that is not the case.
///
/// Greek titlecase characters are important exceptions of the set of titlecase
/// characters, whereby the code point still semantically starts uppercase and
/// ends lowercase, but the code point visually appears entirely uppercase.
///
/// Greek Examples: ᾈ, ᾨ, ῌ, ᾚ
pub fn is_titlecase_greek_variant(tc: char) -> bool {
    tc >= '\u{01F88}'
}

/// Returns true if the character is any one of the following:
///
/// * EnclosingMark
/// * SpacingMark
/// * NonspacingMark
#[cfg(feature = "unicode")]
pub fn is_combining_mark(c: char) -> bool {
    const TABLE: &[(char, char)] = &[
        ('\u{00300}', '\u{0036F}'), ('\u{00483}', '\u{00489}'), ('\u{00591}', '\u{005BD}'),
        ('\u{005BF}', '\u{005BF}'), ('\u{005C1}', '\u{005C2}'), ('\u{005C4}', '\u{005C5}'),
        ('\u{005C7}', '\u{005C9}'), ('\u{00610}', '\u{0061A}'), ('\u{0064B}', '\u{0065F}'),
        ('\u{00670}', '\u{00670}'), ('\u{006D6}', '\u{006DC}'), ('\u{006DF}', '\u{006E4}'),
        ('\u{006E7}', '\u{006E8}'), ('\u{006EA}', '\u{006ED}'), ('\u{00711}', '\u{00711}'),
        ('\u{00730}', '\u{0074A}'), ('\u{007A6}', '\u{007B0}'), ('\u{007EB}', '\u{007F3}'),
        ('\u{007FD}', '\u{007FD}'), ('\u{00816}', '\u{00819}'), ('\u{0081B}', '\u{00823}'),
        ('\u{00825}', '\u{00827}'), ('\u{00829}', '\u{0082D}'), ('\u{00859}', '\u{0085B}'),
        ('\u{00897}', '\u{0089F}'), ('\u{008CA}', '\u{008E1}'), ('\u{008E3}', '\u{00903}'),
        ('\u{0093A}', '\u{0093C}'), ('\u{0093E}', '\u{0094F}'), ('\u{00951}', '\u{00957}'),
        ('\u{00962}', '\u{00963}'), ('\u{00981}', '\u{00983}'), ('\u{009BC}', '\u{009BC}'),
        ('\u{009BE}', '\u{009C4}'), ('\u{009C7}', '\u{009C8}'), ('\u{009CB}', '\u{009CD}'),
        ('\u{009D7}', '\u{009D7}'), ('\u{009E2}', '\u{009E3}'), ('\u{009FE}', '\u{009FE}'),
        ('\u{00A01}', '\u{00A03}'), ('\u{00A3C}', '\u{00A3C}'), ('\u{00A3E}', '\u{00A42}'),
        ('\u{00A47}', '\u{00A48}'), ('\u{00A4B}', '\u{00A4D}'), ('\u{00A51}', '\u{00A51}'),
        ('\u{00A70}', '\u{00A71}'), ('\u{00A75}', '\u{00A75}'), ('\u{00A81}', '\u{00A83}'),
        ('\u{00ABC}', '\u{00ABC}'), ('\u{00ABE}', '\u{00AC5}'), ('\u{00AC7}', '\u{00AC9}'),
        ('\u{00ACB}', '\u{00ACD}'), ('\u{00AE2}', '\u{00AE3}'), ('\u{00AFA}', '\u{00AFF}'),
        ('\u{00B01}', '\u{00B03}'), ('\u{00B3C}', '\u{00B3C}'), ('\u{00B3E}', '\u{00B44}'),
        ('\u{00B47}', '\u{00B48}'), ('\u{00B4B}', '\u{00B4D}'), ('\u{00B53}', '\u{00B57}'),
        ('\u{00B62}', '\u{00B63}'), ('\u{00B82}', '\u{00B82}'), ('\u{00BBE}', '\u{00BC2}'),
        ('\u{00BC6}', '\u{00BC8}'), ('\u{00BCA}', '\u{00BCD}'), ('\u{00BD7}', '\u{00BD7}'),
        ('\u{00C00}', '\u{00C04}'), ('\u{00C3C}', '\u{00C3C}'), ('\u{00C3E}', '\u{00C44}'),
        ('\u{00C46}', '\u{00C48}'), ('\u{00C4A}', '\u{00C4D}'), ('\u{00C55}', '\u{00C56}'),
        ('\u{00C62}', '\u{00C63}'), ('\u{00C81}', '\u{00C83}'), ('\u{00CBC}', '\u{00CBC}'),
        ('\u{00CBE}', '\u{00CC4}'), ('\u{00CC6}', '\u{00CC8}'), ('\u{00CCA}', '\u{00CCD}'),
        ('\u{00CD5}', '\u{00CD6}'), ('\u{00CE2}', '\u{00CE3}'), ('\u{00CF3}', '\u{00CF3}'),
        ('\u{00D00}', '\u{00D03}'), ('\u{00D3B}', '\u{00D3C}'), ('\u{00D3E}', '\u{00D44}'),
        ('\u{00D46}', '\u{00D48}'), ('\u{00D4A}', '\u{00D4D}'), ('\u{00D57}', '\u{00D57}'),
        ('\u{00D62}', '\u{00D63}'), ('\u{00D81}', '\u{00D83}'), ('\u{00DCA}', '\u{00DCA}'),
        ('\u{00DCF}', '\u{00DD4}'), ('\u{00DD6}', '\u{00DD6}'), ('\u{00DD8}', '\u{00DDF}'),
        ('\u{00DF2}', '\u{00DF3}'), ('\u{00E31}', '\u{00E31}'), ('\u{00E34}', '\u{00E3A}'),
        ('\u{00E47}', '\u{00E4E}'), ('\u{00EB1}', '\u{00EB1}'), ('\u{00EB4}', '\u{00EBC}'),
        ('\u{00EC8}', '\u{00ECE}'), ('\u{00F18}', '\u{00F19}'), ('\u{00F35}', '\u{00F35}'),
        ('\u{00F37}', '\u{00F37}'), ('\u{00F39}', '\u{00F39}'), ('\u{00F3E}', '\u{00F3F}'),
        ('\u{00F71}', '\u{00F84}'), ('\u{00F86}', '\u{00F87}'), ('\u{00F8D}', '\u{00F97}'),
        ('\u{00F99}', '\u{00FBC}'), ('\u{00FC6}', '\u{00FC6}'), ('\u{0102B}', '\u{0103E}'),
        ('\u{01056}', '\u{01059}'), ('\u{0105E}', '\u{01060}'), ('\u{01062}', '\u{01064}'),
        ('\u{01067}', '\u{0106D}'), ('\u{01071}', '\u{01074}'), ('\u{01082}', '\u{0108D}'),
        ('\u{0108F}', '\u{0108F}'), ('\u{0109A}', '\u{0109D}'), ('\u{0135D}', '\u{0135F}'),
        ('\u{01712}', '\u{01715}'), ('\u{01732}', '\u{01734}'), ('\u{01752}', '\u{01753}'),
        ('\u{01772}', '\u{01773}'), ('\u{017B4}', '\u{017D3}'), ('\u{017DD}', '\u{017DD}'),
        ('\u{0180B}', '\u{0180D}'), ('\u{0180F}', '\u{0180F}'), ('\u{01885}', '\u{01886}'),
        ('\u{018A9}', '\u{018A9}'), ('\u{01920}', '\u{0192B}'), ('\u{01930}', '\u{0193B}'),
        ('\u{01A17}', '\u{01A1B}'), ('\u{01A55}', '\u{01A5E}'), ('\u{01A60}', '\u{01A7C}'),
        ('\u{01A7F}', '\u{01A7F}'), ('\u{01AB0}', '\u{01AF0}'), ('\u{01B00}', '\u{01B04}'),
        ('\u{01B34}', '\u{01B44}'), ('\u{01B6B}', '\u{01B73}'), ('\u{01B80}', '\u{01B82}'),
        ('\u{01BA1}', '\u{01BAD}'), ('\u{01BE6}', '\u{01BF3}'), ('\u{01C24}', '\u{01C37}'),
        ('\u{01CD0}', '\u{01CD2}'), ('\u{01CD4}', '\u{01CE8}'), ('\u{01CED}', '\u{01CED}'),
        ('\u{01CF4}', '\u{01CF4}'), ('\u{01CF7}', '\u{01CF9}'), ('\u{01DC0}', '\u{01DFF}'),
        ('\u{020D0}', '\u{020F0}'), ('\u{02CEF}', '\u{02CF1}'), ('\u{02D7F}', '\u{02D7F}'),
        ('\u{02DE0}', '\u{02DFF}'), ('\u{0302A}', '\u{0302F}'), ('\u{03099}', '\u{0309A}'),
        ('\u{0A66F}', '\u{0A672}'), ('\u{0A674}', '\u{0A67D}'), ('\u{0A69E}', '\u{0A69F}'),
        ('\u{0A6F0}', '\u{0A6F1}'), ('\u{0A802}', '\u{0A802}'), ('\u{0A806}', '\u{0A806}'),
        ('\u{0A80B}', '\u{0A80B}'), ('\u{0A823}', '\u{0A827}'), ('\u{0A82C}', '\u{0A82C}'),
        ('\u{0A880}', '\u{0A881}'), ('\u{0A8B4}', '\u{0A8C5}'), ('\u{0A8E0}', '\u{0A8F1}'),
        ('\u{0A8FF}', '\u{0A8FF}'), ('\u{0A926}', '\u{0A92D}'), ('\u{0A947}', '\u{0A953}'),
        ('\u{0A980}', '\u{0A983}'), ('\u{0A9B3}', '\u{0A9C0}'), ('\u{0A9E5}', '\u{0A9E5}'),
        ('\u{0AA29}', '\u{0AA36}'), ('\u{0AA43}', '\u{0AA43}'), ('\u{0AA4C}', '\u{0AA4D}'),
        ('\u{0AA7B}', '\u{0AA7D}'), ('\u{0AAB0}', '\u{0AAB0}'), ('\u{0AAB2}', '\u{0AAB4}'),
        ('\u{0AAB7}', '\u{0AAB8}'), ('\u{0AABE}', '\u{0AABF}'), ('\u{0AAC1}', '\u{0AAC1}'),
        ('\u{0AAEB}', '\u{0AAEF}'), ('\u{0AAF5}', '\u{0AAF6}'), ('\u{0ABE3}', '\u{0ABEA}'),
        ('\u{0ABEC}', '\u{0ABED}'), ('\u{0FB1E}', '\u{0FB1E}'), ('\u{0FE00}', '\u{0FE0F}'),
        ('\u{0FE20}', '\u{0FE2F}'), ('\u{101FD}', '\u{101FD}'), ('\u{102E0}', '\u{102E0}'),
        ('\u{10376}', '\u{1037A}'), ('\u{10A01}', '\u{10A03}'), ('\u{10A05}', '\u{10A06}'),
        ('\u{10A0C}', '\u{10A0F}'), ('\u{10A38}', '\u{10A3A}'), ('\u{10A3F}', '\u{10A3F}'),
        ('\u{10AE5}', '\u{10AE6}'), ('\u{10D24}', '\u{10D27}'), ('\u{10D69}', '\u{10D6D}'),
        ('\u{10EAB}', '\u{10EAC}'), ('\u{10ECB}', '\u{10ECF}'), ('\u{10EF0}', '\u{10EFF}'),
        ('\u{10F46}', '\u{10F50}'), ('\u{10F82}', '\u{10F85}'), ('\u{11000}', '\u{11002}'),
        ('\u{11038}', '\u{11046}'), ('\u{11070}', '\u{11070}'), ('\u{11073}', '\u{11074}'),
        ('\u{1107F}', '\u{11082}'), ('\u{110B0}', '\u{110BA}'), ('\u{110C2}', '\u{110C2}'),
        ('\u{11100}', '\u{11102}'), ('\u{11127}', '\u{11134}'), ('\u{11145}', '\u{11146}'),
        ('\u{11173}', '\u{11173}'), ('\u{11180}', '\u{11182}'), ('\u{111B3}', '\u{111C0}'),
        ('\u{111C9}', '\u{111CC}'), ('\u{111CE}', '\u{111CF}'), ('\u{1122C}', '\u{11237}'),
        ('\u{1123E}', '\u{1123E}'), ('\u{11241}', '\u{11241}'), ('\u{112DF}', '\u{112EA}'),
        ('\u{11300}', '\u{11303}'), ('\u{1133B}', '\u{1133C}'), ('\u{1133E}', '\u{11344}'),
        ('\u{11347}', '\u{11348}'), ('\u{1134B}', '\u{1134D}'), ('\u{11357}', '\u{11357}'),
        ('\u{11362}', '\u{11363}'), ('\u{11366}', '\u{1136C}'), ('\u{11370}', '\u{11374}'),
        ('\u{113B8}', '\u{113C0}'), ('\u{113C2}', '\u{113C2}'), ('\u{113C5}', '\u{113C5}'),
        ('\u{113C7}', '\u{113CA}'), ('\u{113CC}', '\u{113D0}'), ('\u{113D2}', '\u{113D2}'),
        ('\u{113E1}', '\u{113E2}'), ('\u{11435}', '\u{11446}'), ('\u{1145E}', '\u{1145E}'),
        ('\u{114B0}', '\u{114C3}'), ('\u{115AF}', '\u{115B5}'), ('\u{115B8}', '\u{115C0}'),
        ('\u{115DC}', '\u{115DD}'), ('\u{11630}', '\u{11640}'), ('\u{116AB}', '\u{116B7}'),
        ('\u{1171D}', '\u{1172B}'), ('\u{1182C}', '\u{1183A}'), ('\u{11930}', '\u{11935}'),
        ('\u{11937}', '\u{11938}'), ('\u{1193B}', '\u{1193E}'), ('\u{11940}', '\u{11940}'),
        ('\u{11942}', '\u{11943}'), ('\u{119D1}', '\u{119D7}'), ('\u{119DA}', '\u{119E0}'),
        ('\u{119E4}', '\u{119E4}'), ('\u{11A01}', '\u{11A0A}'), ('\u{11A33}', '\u{11A39}'),
        ('\u{11A3B}', '\u{11A3E}'), ('\u{11A47}', '\u{11A47}'), ('\u{11A51}', '\u{11A5B}'),
        ('\u{11A8A}', '\u{11A99}'), ('\u{11B60}', '\u{11B67}'), ('\u{11C2F}', '\u{11C36}'),
        ('\u{11C38}', '\u{11C3F}'), ('\u{11C92}', '\u{11CA7}'), ('\u{11CA9}', '\u{11CB6}'),
        ('\u{11D31}', '\u{11D36}'), ('\u{11D3A}', '\u{11D3A}'), ('\u{11D3C}', '\u{11D3D}'),
        ('\u{11D3F}', '\u{11D45}'), ('\u{11D47}', '\u{11D47}'), ('\u{11D8A}', '\u{11D8E}'),
        ('\u{11D90}', '\u{11D91}'), ('\u{11D93}', '\u{11D97}'), ('\u{11DF0}', '\u{11DF0}'),
        ('\u{11EF3}', '\u{11EF6}'), ('\u{11F00}', '\u{11F01}'), ('\u{11F03}', '\u{11F03}'),
        ('\u{11F34}', '\u{11F3A}'), ('\u{11F3E}', '\u{11F42}'), ('\u{11F5A}', '\u{11F5A}'),
        ('\u{13440}', '\u{13440}'), ('\u{13447}', '\u{13455}'), ('\u{1611E}', '\u{1612F}'),
        ('\u{16AF0}', '\u{16AF4}'), ('\u{16B30}', '\u{16B36}'), ('\u{16F4F}', '\u{16F4F}'),
        ('\u{16F51}', '\u{16F87}'), ('\u{16F8F}', '\u{16F92}'), ('\u{16FE4}', '\u{16FE4}'),
        ('\u{16FF0}', '\u{16FF1}'), ('\u{1BC9D}', '\u{1BC9E}'), ('\u{1CF00}', '\u{1CF2D}'),
        ('\u{1CF30}', '\u{1CF46}'), ('\u{1D127}', '\u{1D128}'), ('\u{1D165}', '\u{1D169}'),
        ('\u{1D16D}', '\u{1D172}'), ('\u{1D17B}', '\u{1D182}'), ('\u{1D185}', '\u{1D18B}'),
        ('\u{1D1AA}', '\u{1D1AD}'), ('\u{1D242}', '\u{1D244}'), ('\u{1D250}', '\u{1D252}'),
        ('\u{1D25B}', '\u{1D25C}'), ('\u{1D25F}', '\u{1D25F}'), ('\u{1D280}', '\u{1D281}'),
        ('\u{1DA00}', '\u{1DA36}'), ('\u{1DA3B}', '\u{1DA6C}'), ('\u{1DA75}', '\u{1DA75}'),
        ('\u{1DA84}', '\u{1DA84}'), ('\u{1DA9B}', '\u{1DA9F}'), ('\u{1DAA1}', '\u{1DAAF}'),
        ('\u{1E000}', '\u{1E006}'), ('\u{1E008}', '\u{1E018}'), ('\u{1E01B}', '\u{1E021}'),
        ('\u{1E023}', '\u{1E024}'), ('\u{1E026}', '\u{1E02A}'), ('\u{1E08F}', '\u{1E08F}'),
        ('\u{1E130}', '\u{1E136}'), ('\u{1E2AE}', '\u{1E2AE}'), ('\u{1E2EC}', '\u{1E2EF}'),
        ('\u{1E4EC}', '\u{1E4EF}'), ('\u{1E5EE}', '\u{1E5EF}'), ('\u{1E6E3}', '\u{1E6E3}'),
        ('\u{1E6E6}', '\u{1E6E6}'), ('\u{1E6EE}', '\u{1E6EF}'), ('\u{1E6F5}', '\u{1E6F5}'),
        ('\u{1E8D0}', '\u{1E8D6}'), ('\u{1E944}', '\u{1E94A}'), ('\u{E0100}', '\u{E01EF}'),
    ];
    if c < '\u{00300}' {
        return false;
    }
    in_range(c, TABLE)
}

// =============================================================================
// TEST FUNCTIONS
// =============================================================================

// -----------------------------------------------------------------------------
// A raw implementation of `EnclosingMark` for testing purposes.
// -----------------------------------------------------------------------------
#[cfg(test)]
#[cfg(not(miri))]
#[cfg(feature = "unicode")]
pub fn is_enclosing_mark(c: char) -> bool {
    const TABLE: &[(char, char)] = &[
        ('\u{00488}', '\u{00489}'), ('\u{01ABE}', '\u{01ABE}'), ('\u{020DD}', '\u{020E0}'),
        ('\u{020E2}', '\u{020E4}'), ('\u{0A670}', '\u{0A672}'),
    ];
    if c < '\u{00488}' {
        return false;
    }
    in_range(c, TABLE)
}

// -----------------------------------------------------------------------------
// A raw implementation of `NonspacingMark` for testing purposes.
// -----------------------------------------------------------------------------
#[cfg(test)]
#[cfg(not(miri))]
#[cfg(feature = "unicode")]
pub fn is_nonspacing_mark(c: char) -> bool {
    const TABLE: &[(char, char)] = &[
        ('\u{00300}', '\u{0036F}'), ('\u{00483}', '\u{00487}'), ('\u{00591}', '\u{005BD}'),
        ('\u{005BF}', '\u{005BF}'), ('\u{005C1}', '\u{005C2}'), ('\u{005C4}', '\u{005C5}'),
        ('\u{005C7}', '\u{005C9}'), ('\u{00610}', '\u{0061A}'), ('\u{0064B}', '\u{0065F}'),
        ('\u{00670}', '\u{00670}'), ('\u{006D6}', '\u{006DC}'), ('\u{006DF}', '\u{006E4}'),
        ('\u{006E7}', '\u{006E8}'), ('\u{006EA}', '\u{006ED}'), ('\u{00711}', '\u{00711}'),
        ('\u{00730}', '\u{0074A}'), ('\u{007A6}', '\u{007B0}'), ('\u{007EB}', '\u{007F3}'),
        ('\u{007FD}', '\u{007FD}'), ('\u{00816}', '\u{00819}'), ('\u{0081B}', '\u{00823}'),
        ('\u{00825}', '\u{00827}'), ('\u{00829}', '\u{0082D}'), ('\u{00859}', '\u{0085B}'),
        ('\u{00897}', '\u{0089F}'), ('\u{008CA}', '\u{008E1}'), ('\u{008E3}', '\u{00902}'),
        ('\u{0093A}', '\u{0093A}'), ('\u{0093C}', '\u{0093C}'), ('\u{00941}', '\u{00948}'),
        ('\u{0094D}', '\u{0094D}'), ('\u{00951}', '\u{00957}'), ('\u{00962}', '\u{00963}'),
        ('\u{00981}', '\u{00981}'), ('\u{009BC}', '\u{009BC}'), ('\u{009C1}', '\u{009C4}'),
        ('\u{009CD}', '\u{009CD}'), ('\u{009E2}', '\u{009E3}'), ('\u{009FE}', '\u{009FE}'),
        ('\u{00A01}', '\u{00A02}'), ('\u{00A3C}', '\u{00A3C}'), ('\u{00A41}', '\u{00A42}'),
        ('\u{00A47}', '\u{00A48}'), ('\u{00A4B}', '\u{00A4D}'), ('\u{00A51}', '\u{00A51}'),
        ('\u{00A70}', '\u{00A71}'), ('\u{00A75}', '\u{00A75}'), ('\u{00A81}', '\u{00A82}'),
        ('\u{00ABC}', '\u{00ABC}'), ('\u{00AC1}', '\u{00AC5}'), ('\u{00AC7}', '\u{00AC8}'),
        ('\u{00ACD}', '\u{00ACD}'), ('\u{00AE2}', '\u{00AE3}'), ('\u{00AFA}', '\u{00AFF}'),
        ('\u{00B01}', '\u{00B01}'), ('\u{00B3C}', '\u{00B3C}'), ('\u{00B3F}', '\u{00B3F}'),
        ('\u{00B41}', '\u{00B44}'), ('\u{00B4D}', '\u{00B4D}'), ('\u{00B53}', '\u{00B56}'),
        ('\u{00B62}', '\u{00B63}'), ('\u{00B82}', '\u{00B82}'), ('\u{00BC0}', '\u{00BC0}'),
        ('\u{00BCD}', '\u{00BCD}'), ('\u{00C00}', '\u{00C00}'), ('\u{00C04}', '\u{00C04}'),
        ('\u{00C3C}', '\u{00C3C}'), ('\u{00C3E}', '\u{00C40}'), ('\u{00C46}', '\u{00C48}'),
        ('\u{00C4A}', '\u{00C4D}'), ('\u{00C55}', '\u{00C56}'), ('\u{00C62}', '\u{00C63}'),
        ('\u{00C81}', '\u{00C81}'), ('\u{00CBC}', '\u{00CBC}'), ('\u{00CBF}', '\u{00CBF}'),
        ('\u{00CC6}', '\u{00CC6}'), ('\u{00CCC}', '\u{00CCD}'), ('\u{00CE2}', '\u{00CE3}'),
        ('\u{00D00}', '\u{00D01}'), ('\u{00D3B}', '\u{00D3C}'), ('\u{00D41}', '\u{00D44}'),
        ('\u{00D4D}', '\u{00D4D}'), ('\u{00D62}', '\u{00D63}'), ('\u{00D81}', '\u{00D81}'),
        ('\u{00DCA}', '\u{00DCA}'), ('\u{00DD2}', '\u{00DD4}'), ('\u{00DD6}', '\u{00DD6}'),
        ('\u{00E31}', '\u{00E31}'), ('\u{00E34}', '\u{00E3A}'), ('\u{00E47}', '\u{00E4E}'),
        ('\u{00EB1}', '\u{00EB1}'), ('\u{00EB4}', '\u{00EBC}'), ('\u{00EC8}', '\u{00ECE}'),
        ('\u{00F18}', '\u{00F19}'), ('\u{00F35}', '\u{00F35}'), ('\u{00F37}', '\u{00F37}'),
        ('\u{00F39}', '\u{00F39}'), ('\u{00F71}', '\u{00F7E}'), ('\u{00F80}', '\u{00F84}'),
        ('\u{00F86}', '\u{00F87}'), ('\u{00F8D}', '\u{00F97}'), ('\u{00F99}', '\u{00FBC}'),
        ('\u{00FC6}', '\u{00FC6}'), ('\u{0102D}', '\u{01030}'), ('\u{01032}', '\u{01037}'),
        ('\u{01039}', '\u{0103A}'), ('\u{0103D}', '\u{0103E}'), ('\u{01058}', '\u{01059}'),
        ('\u{0105E}', '\u{01060}'), ('\u{01071}', '\u{01074}'), ('\u{01082}', '\u{01082}'),
        ('\u{01085}', '\u{01086}'), ('\u{0108D}', '\u{0108D}'), ('\u{0109D}', '\u{0109D}'),
        ('\u{0135D}', '\u{0135F}'), ('\u{01712}', '\u{01714}'), ('\u{01732}', '\u{01733}'),
        ('\u{01752}', '\u{01753}'), ('\u{01772}', '\u{01773}'), ('\u{017B4}', '\u{017B5}'),
        ('\u{017B7}', '\u{017BD}'), ('\u{017C6}', '\u{017C6}'), ('\u{017C9}', '\u{017D3}'),
        ('\u{017DD}', '\u{017DD}'), ('\u{0180B}', '\u{0180D}'), ('\u{0180F}', '\u{0180F}'),
        ('\u{01885}', '\u{01886}'), ('\u{018A9}', '\u{018A9}'), ('\u{01920}', '\u{01922}'),
        ('\u{01927}', '\u{01928}'), ('\u{01932}', '\u{01932}'), ('\u{01939}', '\u{0193B}'),
        ('\u{01A17}', '\u{01A18}'), ('\u{01A1B}', '\u{01A1B}'), ('\u{01A56}', '\u{01A56}'),
        ('\u{01A58}', '\u{01A5E}'), ('\u{01A60}', '\u{01A60}'), ('\u{01A62}', '\u{01A62}'),
        ('\u{01A65}', '\u{01A6C}'), ('\u{01A73}', '\u{01A7C}'), ('\u{01A7F}', '\u{01A7F}'),
        ('\u{01AB0}', '\u{01ABD}'), ('\u{01ABF}', '\u{01AF0}'), ('\u{01B00}', '\u{01B03}'),
        ('\u{01B34}', '\u{01B34}'), ('\u{01B36}', '\u{01B3A}'), ('\u{01B3C}', '\u{01B3C}'),
        ('\u{01B42}', '\u{01B42}'), ('\u{01B6B}', '\u{01B73}'), ('\u{01B80}', '\u{01B81}'),
        ('\u{01BA2}', '\u{01BA5}'), ('\u{01BA8}', '\u{01BA9}'), ('\u{01BAB}', '\u{01BAD}'),
        ('\u{01BE6}', '\u{01BE6}'), ('\u{01BE8}', '\u{01BE9}'), ('\u{01BED}', '\u{01BED}'),
        ('\u{01BEF}', '\u{01BF1}'), ('\u{01C2C}', '\u{01C33}'), ('\u{01C36}', '\u{01C37}'),
        ('\u{01CD0}', '\u{01CD2}'), ('\u{01CD4}', '\u{01CE0}'), ('\u{01CE2}', '\u{01CE8}'),
        ('\u{01CED}', '\u{01CED}'), ('\u{01CF4}', '\u{01CF4}'), ('\u{01CF8}', '\u{01CF9}'),
        ('\u{01DC0}', '\u{01DFF}'), ('\u{020D0}', '\u{020DC}'), ('\u{020E1}', '\u{020E1}'),
        ('\u{020E5}', '\u{020F0}'), ('\u{02CEF}', '\u{02CF1}'), ('\u{02D7F}', '\u{02D7F}'),
        ('\u{02DE0}', '\u{02DFF}'), ('\u{0302A}', '\u{0302D}'), ('\u{03099}', '\u{0309A}'),
        ('\u{0A66F}', '\u{0A66F}'), ('\u{0A674}', '\u{0A67D}'), ('\u{0A69E}', '\u{0A69F}'),
        ('\u{0A6F0}', '\u{0A6F1}'), ('\u{0A802}', '\u{0A802}'), ('\u{0A806}', '\u{0A806}'),
        ('\u{0A80B}', '\u{0A80B}'), ('\u{0A825}', '\u{0A826}'), ('\u{0A82C}', '\u{0A82C}'),
        ('\u{0A8C4}', '\u{0A8C5}'), ('\u{0A8E0}', '\u{0A8F1}'), ('\u{0A8FF}', '\u{0A8FF}'),
        ('\u{0A926}', '\u{0A92D}'), ('\u{0A947}', '\u{0A951}'), ('\u{0A980}', '\u{0A982}'),
        ('\u{0A9B3}', '\u{0A9B3}'), ('\u{0A9B6}', '\u{0A9B9}'), ('\u{0A9BC}', '\u{0A9BD}'),
        ('\u{0A9E5}', '\u{0A9E5}'), ('\u{0AA29}', '\u{0AA2E}'), ('\u{0AA31}', '\u{0AA32}'),
        ('\u{0AA35}', '\u{0AA36}'), ('\u{0AA43}', '\u{0AA43}'), ('\u{0AA4C}', '\u{0AA4C}'),
        ('\u{0AA7C}', '\u{0AA7C}'), ('\u{0AAB0}', '\u{0AAB0}'), ('\u{0AAB2}', '\u{0AAB4}'),
        ('\u{0AAB7}', '\u{0AAB8}'), ('\u{0AABE}', '\u{0AABF}'), ('\u{0AAC1}', '\u{0AAC1}'),
        ('\u{0AAEC}', '\u{0AAED}'), ('\u{0AAF6}', '\u{0AAF6}'), ('\u{0ABE5}', '\u{0ABE5}'),
        ('\u{0ABE8}', '\u{0ABE8}'), ('\u{0ABED}', '\u{0ABED}'), ('\u{0FB1E}', '\u{0FB1E}'),
        ('\u{0FE00}', '\u{0FE0F}'), ('\u{0FE20}', '\u{0FE2F}'), ('\u{101FD}', '\u{101FD}'),
        ('\u{102E0}', '\u{102E0}'), ('\u{10376}', '\u{1037A}'), ('\u{10A01}', '\u{10A03}'),
        ('\u{10A05}', '\u{10A06}'), ('\u{10A0C}', '\u{10A0F}'), ('\u{10A38}', '\u{10A3A}'),
        ('\u{10A3F}', '\u{10A3F}'), ('\u{10AE5}', '\u{10AE6}'), ('\u{10D24}', '\u{10D27}'),
        ('\u{10D69}', '\u{10D6D}'), ('\u{10EAB}', '\u{10EAC}'), ('\u{10ECB}', '\u{10ECF}'),
        ('\u{10EF0}', '\u{10EFF}'), ('\u{10F46}', '\u{10F50}'), ('\u{10F82}', '\u{10F85}'),
        ('\u{11001}', '\u{11001}'), ('\u{11038}', '\u{11046}'), ('\u{11070}', '\u{11070}'),
        ('\u{11073}', '\u{11074}'), ('\u{1107F}', '\u{11081}'), ('\u{110B3}', '\u{110B6}'),
        ('\u{110B9}', '\u{110BA}'), ('\u{110C2}', '\u{110C2}'), ('\u{11100}', '\u{11102}'),
        ('\u{11127}', '\u{1112B}'), ('\u{1112D}', '\u{11134}'), ('\u{11173}', '\u{11173}'),
        ('\u{11180}', '\u{11181}'), ('\u{111B6}', '\u{111BE}'), ('\u{111C9}', '\u{111CC}'),
        ('\u{111CF}', '\u{111CF}'), ('\u{1122F}', '\u{11231}'), ('\u{11234}', '\u{11234}'),
        ('\u{11236}', '\u{11237}'), ('\u{1123E}', '\u{1123E}'), ('\u{11241}', '\u{11241}'),
        ('\u{112DF}', '\u{112DF}'), ('\u{112E3}', '\u{112EA}'), ('\u{11300}', '\u{11301}'),
        ('\u{1133B}', '\u{1133C}'), ('\u{11340}', '\u{11340}'), ('\u{11366}', '\u{1136C}'),
        ('\u{11370}', '\u{11374}'), ('\u{113BB}', '\u{113C0}'), ('\u{113CE}', '\u{113CE}'),
        ('\u{113D0}', '\u{113D0}'), ('\u{113D2}', '\u{113D2}'), ('\u{113E1}', '\u{113E2}'),
        ('\u{11438}', '\u{1143F}'), ('\u{11442}', '\u{11444}'), ('\u{11446}', '\u{11446}'),
        ('\u{1145E}', '\u{1145E}'), ('\u{114B3}', '\u{114B8}'), ('\u{114BA}', '\u{114BA}'),
        ('\u{114BF}', '\u{114C0}'), ('\u{114C2}', '\u{114C3}'), ('\u{115B2}', '\u{115B5}'),
        ('\u{115BC}', '\u{115BD}'), ('\u{115BF}', '\u{115C0}'), ('\u{115DC}', '\u{115DD}'),
        ('\u{11633}', '\u{1163A}'), ('\u{1163D}', '\u{1163D}'), ('\u{1163F}', '\u{11640}'),
        ('\u{116AB}', '\u{116AB}'), ('\u{116AD}', '\u{116AD}'), ('\u{116B0}', '\u{116B5}'),
        ('\u{116B7}', '\u{116B7}'), ('\u{1171D}', '\u{1171D}'), ('\u{1171F}', '\u{1171F}'),
        ('\u{11722}', '\u{11725}'), ('\u{11727}', '\u{1172B}'), ('\u{1182F}', '\u{11837}'),
        ('\u{11839}', '\u{1183A}'), ('\u{1193B}', '\u{1193C}'), ('\u{1193E}', '\u{1193E}'),
        ('\u{11943}', '\u{11943}'), ('\u{119D4}', '\u{119D7}'), ('\u{119DA}', '\u{119DB}'),
        ('\u{119E0}', '\u{119E0}'), ('\u{11A01}', '\u{11A0A}'), ('\u{11A33}', '\u{11A38}'),
        ('\u{11A3B}', '\u{11A3E}'), ('\u{11A47}', '\u{11A47}'), ('\u{11A51}', '\u{11A56}'),
        ('\u{11A59}', '\u{11A5B}'), ('\u{11A8A}', '\u{11A96}'), ('\u{11A98}', '\u{11A99}'),
        ('\u{11B60}', '\u{11B60}'), ('\u{11B62}', '\u{11B64}'), ('\u{11B66}', '\u{11B66}'),
        ('\u{11C30}', '\u{11C36}'), ('\u{11C38}', '\u{11C3D}'), ('\u{11C3F}', '\u{11C3F}'),
        ('\u{11C92}', '\u{11CA7}'), ('\u{11CAA}', '\u{11CB0}'), ('\u{11CB2}', '\u{11CB3}'),
        ('\u{11CB5}', '\u{11CB6}'), ('\u{11D31}', '\u{11D36}'), ('\u{11D3A}', '\u{11D3A}'),
        ('\u{11D3C}', '\u{11D3D}'), ('\u{11D3F}', '\u{11D45}'), ('\u{11D47}', '\u{11D47}'),
        ('\u{11D90}', '\u{11D91}'), ('\u{11D95}', '\u{11D95}'), ('\u{11D97}', '\u{11D97}'),
        ('\u{11DF0}', '\u{11DF0}'), ('\u{11EF3}', '\u{11EF4}'), ('\u{11F00}', '\u{11F01}'),
        ('\u{11F36}', '\u{11F3A}'), ('\u{11F40}', '\u{11F40}'), ('\u{11F42}', '\u{11F42}'),
        ('\u{11F5A}', '\u{11F5A}'), ('\u{13440}', '\u{13440}'), ('\u{13447}', '\u{13455}'),
        ('\u{1611E}', '\u{16129}'), ('\u{1612D}', '\u{1612F}'), ('\u{16AF0}', '\u{16AF4}'),
        ('\u{16B30}', '\u{16B36}'), ('\u{16F4F}', '\u{16F4F}'), ('\u{16F8F}', '\u{16F92}'),
        ('\u{16FE4}', '\u{16FE4}'), ('\u{1BC9D}', '\u{1BC9E}'), ('\u{1CF00}', '\u{1CF2D}'),
        ('\u{1CF30}', '\u{1CF46}'), ('\u{1D127}', '\u{1D128}'), ('\u{1D167}', '\u{1D169}'),
        ('\u{1D17B}', '\u{1D182}'), ('\u{1D185}', '\u{1D18B}'), ('\u{1D1AA}', '\u{1D1AD}'),
        ('\u{1D242}', '\u{1D244}'), ('\u{1D25B}', '\u{1D25C}'), ('\u{1DA00}', '\u{1DA36}'),
        ('\u{1DA3B}', '\u{1DA6C}'), ('\u{1DA75}', '\u{1DA75}'), ('\u{1DA84}', '\u{1DA84}'),
        ('\u{1DA9B}', '\u{1DA9F}'), ('\u{1DAA1}', '\u{1DAAF}'), ('\u{1E000}', '\u{1E006}'),
        ('\u{1E008}', '\u{1E018}'), ('\u{1E01B}', '\u{1E021}'), ('\u{1E023}', '\u{1E024}'),
        ('\u{1E026}', '\u{1E02A}'), ('\u{1E08F}', '\u{1E08F}'), ('\u{1E130}', '\u{1E136}'),
        ('\u{1E2AE}', '\u{1E2AE}'), ('\u{1E2EC}', '\u{1E2EF}'), ('\u{1E4EC}', '\u{1E4EF}'),
        ('\u{1E5EE}', '\u{1E5EF}'), ('\u{1E6E3}', '\u{1E6E3}'), ('\u{1E6E6}', '\u{1E6E6}'),
        ('\u{1E6EE}', '\u{1E6EF}'), ('\u{1E6F5}', '\u{1E6F5}'), ('\u{1E8D0}', '\u{1E8D6}'),
        ('\u{1E944}', '\u{1E94A}'), ('\u{E0100}', '\u{E01EF}'),
    ];
    if c < '\u{00300}' {
        return false;
    }
    in_range(c, TABLE)
}

// -----------------------------------------------------------------------------
// A raw implementation of `SpacingMark` for testing purposes.
// -----------------------------------------------------------------------------
#[cfg(test)]
#[cfg(not(miri))]
#[cfg(feature = "unicode")]
pub fn is_spacing_mark(c: char) -> bool {
    const TABLE: &[(char, char)] = &[
        ('\u{00903}', '\u{00903}'), ('\u{0093B}', '\u{0093B}'), ('\u{0093E}', '\u{00940}'),
        ('\u{00949}', '\u{0094C}'), ('\u{0094E}', '\u{0094F}'), ('\u{00982}', '\u{00983}'),
        ('\u{009BE}', '\u{009C0}'), ('\u{009C7}', '\u{009C8}'), ('\u{009CB}', '\u{009CC}'),
        ('\u{009D7}', '\u{009D7}'), ('\u{00A03}', '\u{00A03}'), ('\u{00A3E}', '\u{00A40}'),
        ('\u{00A83}', '\u{00A83}'), ('\u{00ABE}', '\u{00AC0}'), ('\u{00AC9}', '\u{00AC9}'),
        ('\u{00ACB}', '\u{00ACC}'), ('\u{00B02}', '\u{00B03}'), ('\u{00B3E}', '\u{00B3E}'),
        ('\u{00B40}', '\u{00B40}'), ('\u{00B47}', '\u{00B48}'), ('\u{00B4B}', '\u{00B4C}'),
        ('\u{00B57}', '\u{00B57}'), ('\u{00BBE}', '\u{00BBF}'), ('\u{00BC1}', '\u{00BC2}'),
        ('\u{00BC6}', '\u{00BC8}'), ('\u{00BCA}', '\u{00BCC}'), ('\u{00BD7}', '\u{00BD7}'),
        ('\u{00C01}', '\u{00C03}'), ('\u{00C41}', '\u{00C44}'), ('\u{00C82}', '\u{00C83}'),
        ('\u{00CBE}', '\u{00CBE}'), ('\u{00CC0}', '\u{00CC4}'), ('\u{00CC7}', '\u{00CC8}'),
        ('\u{00CCA}', '\u{00CCB}'), ('\u{00CD5}', '\u{00CD6}'), ('\u{00CF3}', '\u{00CF3}'),
        ('\u{00D02}', '\u{00D03}'), ('\u{00D3E}', '\u{00D40}'), ('\u{00D46}', '\u{00D48}'),
        ('\u{00D4A}', '\u{00D4C}'), ('\u{00D57}', '\u{00D57}'), ('\u{00D82}', '\u{00D83}'),
        ('\u{00DCF}', '\u{00DD1}'), ('\u{00DD8}', '\u{00DDF}'), ('\u{00DF2}', '\u{00DF3}'),
        ('\u{00F3E}', '\u{00F3F}'), ('\u{00F7F}', '\u{00F7F}'), ('\u{0102B}', '\u{0102C}'),
        ('\u{01031}', '\u{01031}'), ('\u{01038}', '\u{01038}'), ('\u{0103B}', '\u{0103C}'),
        ('\u{01056}', '\u{01057}'), ('\u{01062}', '\u{01064}'), ('\u{01067}', '\u{0106D}'),
        ('\u{01083}', '\u{01084}'), ('\u{01087}', '\u{0108C}'), ('\u{0108F}', '\u{0108F}'),
        ('\u{0109A}', '\u{0109C}'), ('\u{01715}', '\u{01715}'), ('\u{01734}', '\u{01734}'),
        ('\u{017B6}', '\u{017B6}'), ('\u{017BE}', '\u{017C5}'), ('\u{017C7}', '\u{017C8}'),
        ('\u{01923}', '\u{01926}'), ('\u{01929}', '\u{0192B}'), ('\u{01930}', '\u{01931}'),
        ('\u{01933}', '\u{01938}'), ('\u{01A19}', '\u{01A1A}'), ('\u{01A55}', '\u{01A55}'),
        ('\u{01A57}', '\u{01A57}'), ('\u{01A61}', '\u{01A61}'), ('\u{01A63}', '\u{01A64}'),
        ('\u{01A6D}', '\u{01A72}'), ('\u{01B04}', '\u{01B04}'), ('\u{01B35}', '\u{01B35}'),
        ('\u{01B3B}', '\u{01B3B}'), ('\u{01B3D}', '\u{01B41}'), ('\u{01B43}', '\u{01B44}'),
        ('\u{01B82}', '\u{01B82}'), ('\u{01BA1}', '\u{01BA1}'), ('\u{01BA6}', '\u{01BA7}'),
        ('\u{01BAA}', '\u{01BAA}'), ('\u{01BE7}', '\u{01BE7}'), ('\u{01BEA}', '\u{01BEC}'),
        ('\u{01BEE}', '\u{01BEE}'), ('\u{01BF2}', '\u{01BF3}'), ('\u{01C24}', '\u{01C2B}'),
        ('\u{01C34}', '\u{01C35}'), ('\u{01CE1}', '\u{01CE1}'), ('\u{01CF7}', '\u{01CF7}'),
        ('\u{0302E}', '\u{0302F}'), ('\u{0A823}', '\u{0A824}'), ('\u{0A827}', '\u{0A827}'),
        ('\u{0A880}', '\u{0A881}'), ('\u{0A8B4}', '\u{0A8C3}'), ('\u{0A952}', '\u{0A953}'),
        ('\u{0A983}', '\u{0A983}'), ('\u{0A9B4}', '\u{0A9B5}'), ('\u{0A9BA}', '\u{0A9BB}'),
        ('\u{0A9BE}', '\u{0A9C0}'), ('\u{0AA2F}', '\u{0AA30}'), ('\u{0AA33}', '\u{0AA34}'),
        ('\u{0AA4D}', '\u{0AA4D}'), ('\u{0AA7B}', '\u{0AA7B}'), ('\u{0AA7D}', '\u{0AA7D}'),
        ('\u{0AAEB}', '\u{0AAEB}'), ('\u{0AAEE}', '\u{0AAEF}'), ('\u{0AAF5}', '\u{0AAF5}'),
        ('\u{0ABE3}', '\u{0ABE4}'), ('\u{0ABE6}', '\u{0ABE7}'), ('\u{0ABE9}', '\u{0ABEA}'),
        ('\u{0ABEC}', '\u{0ABEC}'), ('\u{11000}', '\u{11000}'), ('\u{11002}', '\u{11002}'),
        ('\u{11082}', '\u{11082}'), ('\u{110B0}', '\u{110B2}'), ('\u{110B7}', '\u{110B8}'),
        ('\u{1112C}', '\u{1112C}'), ('\u{11145}', '\u{11146}'), ('\u{11182}', '\u{11182}'),
        ('\u{111B3}', '\u{111B5}'), ('\u{111BF}', '\u{111C0}'), ('\u{111CE}', '\u{111CE}'),
        ('\u{1122C}', '\u{1122E}'), ('\u{11232}', '\u{11233}'), ('\u{11235}', '\u{11235}'),
        ('\u{112E0}', '\u{112E2}'), ('\u{11302}', '\u{11303}'), ('\u{1133E}', '\u{1133F}'),
        ('\u{11341}', '\u{11344}'), ('\u{11347}', '\u{11348}'), ('\u{1134B}', '\u{1134D}'),
        ('\u{11357}', '\u{11357}'), ('\u{11362}', '\u{11363}'), ('\u{113B8}', '\u{113BA}'),
        ('\u{113C2}', '\u{113C2}'), ('\u{113C5}', '\u{113C5}'), ('\u{113C7}', '\u{113CA}'),
        ('\u{113CC}', '\u{113CD}'), ('\u{113CF}', '\u{113CF}'), ('\u{11435}', '\u{11437}'),
        ('\u{11440}', '\u{11441}'), ('\u{11445}', '\u{11445}'), ('\u{114B0}', '\u{114B2}'),
        ('\u{114B9}', '\u{114B9}'), ('\u{114BB}', '\u{114BE}'), ('\u{114C1}', '\u{114C1}'),
        ('\u{115AF}', '\u{115B1}'), ('\u{115B8}', '\u{115BB}'), ('\u{115BE}', '\u{115BE}'),
        ('\u{11630}', '\u{11632}'), ('\u{1163B}', '\u{1163C}'), ('\u{1163E}', '\u{1163E}'),
        ('\u{116AC}', '\u{116AC}'), ('\u{116AE}', '\u{116AF}'), ('\u{116B6}', '\u{116B6}'),
        ('\u{1171E}', '\u{1171E}'), ('\u{11720}', '\u{11721}'), ('\u{11726}', '\u{11726}'),
        ('\u{1182C}', '\u{1182E}'), ('\u{11838}', '\u{11838}'), ('\u{11930}', '\u{11935}'),
        ('\u{11937}', '\u{11938}'), ('\u{1193D}', '\u{1193D}'), ('\u{11940}', '\u{11940}'),
        ('\u{11942}', '\u{11942}'), ('\u{119D1}', '\u{119D3}'), ('\u{119DC}', '\u{119DF}'),
        ('\u{119E4}', '\u{119E4}'), ('\u{11A39}', '\u{11A39}'), ('\u{11A57}', '\u{11A58}'),
        ('\u{11A97}', '\u{11A97}'), ('\u{11B61}', '\u{11B61}'), ('\u{11B65}', '\u{11B65}'),
        ('\u{11B67}', '\u{11B67}'), ('\u{11C2F}', '\u{11C2F}'), ('\u{11C3E}', '\u{11C3E}'),
        ('\u{11CA9}', '\u{11CA9}'), ('\u{11CB1}', '\u{11CB1}'), ('\u{11CB4}', '\u{11CB4}'),
        ('\u{11D8A}', '\u{11D8E}'), ('\u{11D93}', '\u{11D94}'), ('\u{11D96}', '\u{11D96}'),
        ('\u{11EF5}', '\u{11EF6}'), ('\u{11F03}', '\u{11F03}'), ('\u{11F34}', '\u{11F35}'),
        ('\u{11F3E}', '\u{11F3F}'), ('\u{11F41}', '\u{11F41}'), ('\u{1612A}', '\u{1612C}'),
        ('\u{16F51}', '\u{16F87}'), ('\u{16FF0}', '\u{16FF1}'), ('\u{1D165}', '\u{1D166}'),
        ('\u{1D16D}', '\u{1D172}'), ('\u{1D250}', '\u{1D252}'), ('\u{1D25F}', '\u{1D25F}'),
        ('\u{1D280}', '\u{1D281}'),
    ];
    if c < '\u{00903}' {
        return false;
    }
    in_range(c, TABLE)
}