xref: /aosp_15_r20/external/icu/libicu/cts_headers/collation.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker *******************************************************************************
5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2010-2015, International Business Machines
6*0e209d39SAndroid Build Coastguard Worker * Corporation and others.  All Rights Reserved.
7*0e209d39SAndroid Build Coastguard Worker *******************************************************************************
8*0e209d39SAndroid Build Coastguard Worker * collation.h
9*0e209d39SAndroid Build Coastguard Worker *
10*0e209d39SAndroid Build Coastguard Worker * created on: 2010oct27
11*0e209d39SAndroid Build Coastguard Worker * created by: Markus W. Scherer
12*0e209d39SAndroid Build Coastguard Worker */
13*0e209d39SAndroid Build Coastguard Worker 
14*0e209d39SAndroid Build Coastguard Worker #ifndef __COLLATION_H__
15*0e209d39SAndroid Build Coastguard Worker #define __COLLATION_H__
16*0e209d39SAndroid Build Coastguard Worker 
17*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
18*0e209d39SAndroid Build Coastguard Worker 
19*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_COLLATION
20*0e209d39SAndroid Build Coastguard Worker 
21*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
22*0e209d39SAndroid Build Coastguard Worker 
23*0e209d39SAndroid Build Coastguard Worker /**
24*0e209d39SAndroid Build Coastguard Worker  * Collation v2 basic definitions and static helper functions.
25*0e209d39SAndroid Build Coastguard Worker  *
26*0e209d39SAndroid Build Coastguard Worker  * Data structures except for expansion tables store 32-bit CEs which are
27*0e209d39SAndroid Build Coastguard Worker  * either specials (see tags below) or are compact forms of 64-bit CEs.
28*0e209d39SAndroid Build Coastguard Worker  */
29*0e209d39SAndroid Build Coastguard Worker class U_I18N_API Collation {
30*0e209d39SAndroid Build Coastguard Worker public:
31*0e209d39SAndroid Build Coastguard Worker     // Special sort key bytes for all levels.
32*0e209d39SAndroid Build Coastguard Worker     static const uint8_t TERMINATOR_BYTE = 0;
33*0e209d39SAndroid Build Coastguard Worker     static const uint8_t LEVEL_SEPARATOR_BYTE = 1;
34*0e209d39SAndroid Build Coastguard Worker 
35*0e209d39SAndroid Build Coastguard Worker     /** The secondary/tertiary lower limit for tailoring before any root elements. */
36*0e209d39SAndroid Build Coastguard Worker     static const uint32_t BEFORE_WEIGHT16 = 0x0100;
37*0e209d39SAndroid Build Coastguard Worker 
38*0e209d39SAndroid Build Coastguard Worker     /**
39*0e209d39SAndroid Build Coastguard Worker      * Merge-sort-key separator.
40*0e209d39SAndroid Build Coastguard Worker      * Same as the unique primary and identical-level weights of U+FFFE.
41*0e209d39SAndroid Build Coastguard Worker      * Must not be used as primary compression low terminator.
42*0e209d39SAndroid Build Coastguard Worker      * Otherwise usable.
43*0e209d39SAndroid Build Coastguard Worker      */
44*0e209d39SAndroid Build Coastguard Worker     static const uint8_t MERGE_SEPARATOR_BYTE = 2;
45*0e209d39SAndroid Build Coastguard Worker     static const uint32_t MERGE_SEPARATOR_PRIMARY = 0x02000000;  // U+FFFE
46*0e209d39SAndroid Build Coastguard Worker     static const uint32_t MERGE_SEPARATOR_CE32 = 0x02000505;  // U+FFFE
47*0e209d39SAndroid Build Coastguard Worker 
48*0e209d39SAndroid Build Coastguard Worker     /**
49*0e209d39SAndroid Build Coastguard Worker      * Primary compression low terminator, must be greater than MERGE_SEPARATOR_BYTE.
50*0e209d39SAndroid Build Coastguard Worker      * Reserved value in primary second byte if the lead byte is compressible.
51*0e209d39SAndroid Build Coastguard Worker      * Otherwise usable in all CE weight bytes.
52*0e209d39SAndroid Build Coastguard Worker      */
53*0e209d39SAndroid Build Coastguard Worker     static const uint8_t PRIMARY_COMPRESSION_LOW_BYTE = 3;
54*0e209d39SAndroid Build Coastguard Worker     /**
55*0e209d39SAndroid Build Coastguard Worker      * Primary compression high terminator.
56*0e209d39SAndroid Build Coastguard Worker      * Reserved value in primary second byte if the lead byte is compressible.
57*0e209d39SAndroid Build Coastguard Worker      * Otherwise usable in all CE weight bytes.
58*0e209d39SAndroid Build Coastguard Worker      */
59*0e209d39SAndroid Build Coastguard Worker     static const uint8_t PRIMARY_COMPRESSION_HIGH_BYTE = 0xff;
60*0e209d39SAndroid Build Coastguard Worker 
61*0e209d39SAndroid Build Coastguard Worker     /** Default secondary/tertiary weight lead byte. */
62*0e209d39SAndroid Build Coastguard Worker     static const uint8_t COMMON_BYTE = 5;
63*0e209d39SAndroid Build Coastguard Worker     static const uint32_t COMMON_WEIGHT16 = 0x0500;
64*0e209d39SAndroid Build Coastguard Worker     /** Middle 16 bits of a CE with a common secondary weight. */
65*0e209d39SAndroid Build Coastguard Worker     static const uint32_t COMMON_SECONDARY_CE = 0x05000000;
66*0e209d39SAndroid Build Coastguard Worker     /** Lower 16 bits of a CE with a common tertiary weight. */
67*0e209d39SAndroid Build Coastguard Worker     static const uint32_t COMMON_TERTIARY_CE = 0x0500;
68*0e209d39SAndroid Build Coastguard Worker     /** Lower 32 bits of a CE with common secondary and tertiary weights. */
69*0e209d39SAndroid Build Coastguard Worker     static const uint32_t COMMON_SEC_AND_TER_CE = 0x05000500;
70*0e209d39SAndroid Build Coastguard Worker 
71*0e209d39SAndroid Build Coastguard Worker     static const uint32_t SECONDARY_MASK = 0xffff0000;
72*0e209d39SAndroid Build Coastguard Worker     static const uint32_t CASE_MASK = 0xc000;
73*0e209d39SAndroid Build Coastguard Worker     static const uint32_t SECONDARY_AND_CASE_MASK = SECONDARY_MASK | CASE_MASK;
74*0e209d39SAndroid Build Coastguard Worker     /** Only the 2*6 bits for the pure tertiary weight. */
75*0e209d39SAndroid Build Coastguard Worker     static const uint32_t ONLY_TERTIARY_MASK = 0x3f3f;
76*0e209d39SAndroid Build Coastguard Worker     /** Only the secondary & tertiary bits; no case, no quaternary. */
77*0e209d39SAndroid Build Coastguard Worker     static const uint32_t ONLY_SEC_TER_MASK = SECONDARY_MASK | ONLY_TERTIARY_MASK;
78*0e209d39SAndroid Build Coastguard Worker     /** Case bits and tertiary bits. */
79*0e209d39SAndroid Build Coastguard Worker     static const uint32_t CASE_AND_TERTIARY_MASK = CASE_MASK | ONLY_TERTIARY_MASK;
80*0e209d39SAndroid Build Coastguard Worker     static const uint32_t QUATERNARY_MASK = 0xc0;
81*0e209d39SAndroid Build Coastguard Worker     /** Case bits and quaternary bits. */
82*0e209d39SAndroid Build Coastguard Worker     static const uint32_t CASE_AND_QUATERNARY_MASK = CASE_MASK | QUATERNARY_MASK;
83*0e209d39SAndroid Build Coastguard Worker 
84*0e209d39SAndroid Build Coastguard Worker     static const uint8_t UNASSIGNED_IMPLICIT_BYTE = 0xfe;  // compressible
85*0e209d39SAndroid Build Coastguard Worker     /**
86*0e209d39SAndroid Build Coastguard Worker      * First unassigned: AlphabeticIndex overflow boundary.
87*0e209d39SAndroid Build Coastguard Worker      * We want a 3-byte primary so that it fits into the root elements table.
88*0e209d39SAndroid Build Coastguard Worker      *
89*0e209d39SAndroid Build Coastguard Worker      * This 3-byte primary will not collide with
90*0e209d39SAndroid Build Coastguard Worker      * any unassigned-implicit 4-byte primaries because
91*0e209d39SAndroid Build Coastguard Worker      * the first few hundred Unicode code points all have real mappings.
92*0e209d39SAndroid Build Coastguard Worker      */
93*0e209d39SAndroid Build Coastguard Worker     static const uint32_t FIRST_UNASSIGNED_PRIMARY = 0xfe040200;
94*0e209d39SAndroid Build Coastguard Worker 
95*0e209d39SAndroid Build Coastguard Worker     static const uint8_t TRAIL_WEIGHT_BYTE = 0xff;  // not compressible
96*0e209d39SAndroid Build Coastguard Worker     static const uint32_t FIRST_TRAILING_PRIMARY = 0xff020200;  // [first trailing]
97*0e209d39SAndroid Build Coastguard Worker     static const uint32_t MAX_PRIMARY = 0xffff0000;  // U+FFFF
98*0e209d39SAndroid Build Coastguard Worker     static const uint32_t MAX_REGULAR_CE32 = 0xffff0505;  // U+FFFF
99*0e209d39SAndroid Build Coastguard Worker 
100*0e209d39SAndroid Build Coastguard Worker     // CE32 value for U+FFFD as well as illegal UTF-8 byte sequences (which behave like U+FFFD).
101*0e209d39SAndroid Build Coastguard Worker     // We use the third-highest primary weight for U+FFFD (as in UCA 6.3+).
102*0e209d39SAndroid Build Coastguard Worker     static const uint32_t FFFD_PRIMARY = MAX_PRIMARY - 0x20000;
103*0e209d39SAndroid Build Coastguard Worker     static const uint32_t FFFD_CE32 = MAX_REGULAR_CE32 - 0x20000;
104*0e209d39SAndroid Build Coastguard Worker 
105*0e209d39SAndroid Build Coastguard Worker     /**
106*0e209d39SAndroid Build Coastguard Worker      * A CE32 is special if its low byte is this or greater.
107*0e209d39SAndroid Build Coastguard Worker      * Impossible case bits 11 mark special CE32s.
108*0e209d39SAndroid Build Coastguard Worker      * This value itself is used to indicate a fallback to the base collator.
109*0e209d39SAndroid Build Coastguard Worker      */
110*0e209d39SAndroid Build Coastguard Worker     static const uint8_t SPECIAL_CE32_LOW_BYTE = 0xc0;
111*0e209d39SAndroid Build Coastguard Worker     static const uint32_t FALLBACK_CE32 = SPECIAL_CE32_LOW_BYTE;
112*0e209d39SAndroid Build Coastguard Worker     /**
113*0e209d39SAndroid Build Coastguard Worker      * Low byte of a long-primary special CE32.
114*0e209d39SAndroid Build Coastguard Worker      */
115*0e209d39SAndroid Build Coastguard Worker     static const uint8_t LONG_PRIMARY_CE32_LOW_BYTE = 0xc1;  // SPECIAL_CE32_LOW_BYTE | LONG_PRIMARY_TAG
116*0e209d39SAndroid Build Coastguard Worker 
117*0e209d39SAndroid Build Coastguard Worker     static const uint32_t UNASSIGNED_CE32 = 0xffffffff;  // Compute an unassigned-implicit CE.
118*0e209d39SAndroid Build Coastguard Worker 
119*0e209d39SAndroid Build Coastguard Worker     static const uint32_t NO_CE32 = 1;
120*0e209d39SAndroid Build Coastguard Worker 
121*0e209d39SAndroid Build Coastguard Worker     /** No CE: End of input. Only used in runtime code, not stored in data. */
122*0e209d39SAndroid Build Coastguard Worker     static const uint32_t NO_CE_PRIMARY = 1;  // not a left-adjusted weight
123*0e209d39SAndroid Build Coastguard Worker     static const uint32_t NO_CE_WEIGHT16 = 0x0100;  // weight of LEVEL_SEPARATOR_BYTE
124*0e209d39SAndroid Build Coastguard Worker     static const int64_t NO_CE = INT64_C(0x101000100);  // NO_CE_PRIMARY, NO_CE_WEIGHT16, NO_CE_WEIGHT16
125*0e209d39SAndroid Build Coastguard Worker 
126*0e209d39SAndroid Build Coastguard Worker     /** Sort key levels. */
127*0e209d39SAndroid Build Coastguard Worker     enum Level {
128*0e209d39SAndroid Build Coastguard Worker         /** Unspecified level. */
129*0e209d39SAndroid Build Coastguard Worker         NO_LEVEL,
130*0e209d39SAndroid Build Coastguard Worker         PRIMARY_LEVEL,
131*0e209d39SAndroid Build Coastguard Worker         SECONDARY_LEVEL,
132*0e209d39SAndroid Build Coastguard Worker         CASE_LEVEL,
133*0e209d39SAndroid Build Coastguard Worker         TERTIARY_LEVEL,
134*0e209d39SAndroid Build Coastguard Worker         QUATERNARY_LEVEL,
135*0e209d39SAndroid Build Coastguard Worker         IDENTICAL_LEVEL,
136*0e209d39SAndroid Build Coastguard Worker         /** Beyond sort key bytes. */
137*0e209d39SAndroid Build Coastguard Worker         ZERO_LEVEL
138*0e209d39SAndroid Build Coastguard Worker     };
139*0e209d39SAndroid Build Coastguard Worker 
140*0e209d39SAndroid Build Coastguard Worker     /**
141*0e209d39SAndroid Build Coastguard Worker      * Sort key level flags: xx_FLAG = 1 << xx_LEVEL.
142*0e209d39SAndroid Build Coastguard Worker      * In Java, use enum Level with flag() getters, or use EnumSet rather than hand-made bit sets.
143*0e209d39SAndroid Build Coastguard Worker      */
144*0e209d39SAndroid Build Coastguard Worker     static const uint32_t NO_LEVEL_FLAG = 1;
145*0e209d39SAndroid Build Coastguard Worker     static const uint32_t PRIMARY_LEVEL_FLAG = 2;
146*0e209d39SAndroid Build Coastguard Worker     static const uint32_t SECONDARY_LEVEL_FLAG = 4;
147*0e209d39SAndroid Build Coastguard Worker     static const uint32_t CASE_LEVEL_FLAG = 8;
148*0e209d39SAndroid Build Coastguard Worker     static const uint32_t TERTIARY_LEVEL_FLAG = 0x10;
149*0e209d39SAndroid Build Coastguard Worker     static const uint32_t QUATERNARY_LEVEL_FLAG = 0x20;
150*0e209d39SAndroid Build Coastguard Worker     static const uint32_t IDENTICAL_LEVEL_FLAG = 0x40;
151*0e209d39SAndroid Build Coastguard Worker     static const uint32_t ZERO_LEVEL_FLAG = 0x80;
152*0e209d39SAndroid Build Coastguard Worker 
153*0e209d39SAndroid Build Coastguard Worker     /**
154*0e209d39SAndroid Build Coastguard Worker      * Special-CE32 tags, from bits 3..0 of a special 32-bit CE.
155*0e209d39SAndroid Build Coastguard Worker      * Bits 31..8 are available for tag-specific data.
156*0e209d39SAndroid Build Coastguard Worker      * Bits  5..4: Reserved. May be used in the future to indicate lccc!=0 and tccc!=0.
157*0e209d39SAndroid Build Coastguard Worker      */
158*0e209d39SAndroid Build Coastguard Worker     enum {
159*0e209d39SAndroid Build Coastguard Worker         /**
160*0e209d39SAndroid Build Coastguard Worker          * Fall back to the base collator.
161*0e209d39SAndroid Build Coastguard Worker          * This is the tag value in SPECIAL_CE32_LOW_BYTE and FALLBACK_CE32.
162*0e209d39SAndroid Build Coastguard Worker          * Bits 31..8: Unused, 0.
163*0e209d39SAndroid Build Coastguard Worker          */
164*0e209d39SAndroid Build Coastguard Worker         FALLBACK_TAG = 0,
165*0e209d39SAndroid Build Coastguard Worker         /**
166*0e209d39SAndroid Build Coastguard Worker          * Long-primary CE with COMMON_SEC_AND_TER_CE.
167*0e209d39SAndroid Build Coastguard Worker          * Bits 31..8: Three-byte primary.
168*0e209d39SAndroid Build Coastguard Worker          */
169*0e209d39SAndroid Build Coastguard Worker         LONG_PRIMARY_TAG = 1,
170*0e209d39SAndroid Build Coastguard Worker         /**
171*0e209d39SAndroid Build Coastguard Worker          * Long-secondary CE with zero primary.
172*0e209d39SAndroid Build Coastguard Worker          * Bits 31..16: Secondary weight.
173*0e209d39SAndroid Build Coastguard Worker          * Bits 15.. 8: Tertiary weight.
174*0e209d39SAndroid Build Coastguard Worker          */
175*0e209d39SAndroid Build Coastguard Worker         LONG_SECONDARY_TAG = 2,
176*0e209d39SAndroid Build Coastguard Worker         /**
177*0e209d39SAndroid Build Coastguard Worker          * Unused.
178*0e209d39SAndroid Build Coastguard Worker          * May be used in the future for single-byte secondary CEs (SHORT_SECONDARY_TAG),
179*0e209d39SAndroid Build Coastguard Worker          * storing the secondary in bits 31..24, the ccc in bits 23..16,
180*0e209d39SAndroid Build Coastguard Worker          * and the tertiary in bits 15..8.
181*0e209d39SAndroid Build Coastguard Worker          */
182*0e209d39SAndroid Build Coastguard Worker         RESERVED_TAG_3 = 3,
183*0e209d39SAndroid Build Coastguard Worker         /**
184*0e209d39SAndroid Build Coastguard Worker          * Latin mini expansions of two simple CEs [pp, 05, tt] [00, ss, 05].
185*0e209d39SAndroid Build Coastguard Worker          * Bits 31..24: Single-byte primary weight pp of the first CE.
186*0e209d39SAndroid Build Coastguard Worker          * Bits 23..16: Tertiary weight tt of the first CE.
187*0e209d39SAndroid Build Coastguard Worker          * Bits 15.. 8: Secondary weight ss of the second CE.
188*0e209d39SAndroid Build Coastguard Worker          */
189*0e209d39SAndroid Build Coastguard Worker         LATIN_EXPANSION_TAG = 4,
190*0e209d39SAndroid Build Coastguard Worker         /**
191*0e209d39SAndroid Build Coastguard Worker          * Points to one or more simple/long-primary/long-secondary 32-bit CE32s.
192*0e209d39SAndroid Build Coastguard Worker          * Bits 31..13: Index into uint32_t table.
193*0e209d39SAndroid Build Coastguard Worker          * Bits 12.. 8: Length=1..31.
194*0e209d39SAndroid Build Coastguard Worker          */
195*0e209d39SAndroid Build Coastguard Worker         EXPANSION32_TAG = 5,
196*0e209d39SAndroid Build Coastguard Worker         /**
197*0e209d39SAndroid Build Coastguard Worker          * Points to one or more 64-bit CEs.
198*0e209d39SAndroid Build Coastguard Worker          * Bits 31..13: Index into CE table.
199*0e209d39SAndroid Build Coastguard Worker          * Bits 12.. 8: Length=1..31.
200*0e209d39SAndroid Build Coastguard Worker          */
201*0e209d39SAndroid Build Coastguard Worker         EXPANSION_TAG = 6,
202*0e209d39SAndroid Build Coastguard Worker         /**
203*0e209d39SAndroid Build Coastguard Worker          * Builder data, used only in the CollationDataBuilder, not in runtime data.
204*0e209d39SAndroid Build Coastguard Worker          *
205*0e209d39SAndroid Build Coastguard Worker          * If bit 8 is 0: Builder context, points to a list of context-sensitive mappings.
206*0e209d39SAndroid Build Coastguard Worker          * Bits 31..13: Index to the builder's list of ConditionalCE32 for this character.
207*0e209d39SAndroid Build Coastguard Worker          * Bits 12.. 9: Unused, 0.
208*0e209d39SAndroid Build Coastguard Worker          *
209*0e209d39SAndroid Build Coastguard Worker          * If bit 8 is 1 (IS_BUILDER_JAMO_CE32): Builder-only jamoCE32 value.
210*0e209d39SAndroid Build Coastguard Worker          * The builder fetches the Jamo CE32 from the trie.
211*0e209d39SAndroid Build Coastguard Worker          * Bits 31..13: Jamo code point.
212*0e209d39SAndroid Build Coastguard Worker          * Bits 12.. 9: Unused, 0.
213*0e209d39SAndroid Build Coastguard Worker          */
214*0e209d39SAndroid Build Coastguard Worker         BUILDER_DATA_TAG = 7,
215*0e209d39SAndroid Build Coastguard Worker         /**
216*0e209d39SAndroid Build Coastguard Worker          * Points to prefix trie.
217*0e209d39SAndroid Build Coastguard Worker          * Bits 31..13: Index into prefix/contraction data.
218*0e209d39SAndroid Build Coastguard Worker          * Bits 12.. 8: Unused, 0.
219*0e209d39SAndroid Build Coastguard Worker          */
220*0e209d39SAndroid Build Coastguard Worker         PREFIX_TAG = 8,
221*0e209d39SAndroid Build Coastguard Worker         /**
222*0e209d39SAndroid Build Coastguard Worker          * Points to contraction data.
223*0e209d39SAndroid Build Coastguard Worker          * Bits 31..13: Index into prefix/contraction data.
224*0e209d39SAndroid Build Coastguard Worker          * Bit      12: Unused, 0.
225*0e209d39SAndroid Build Coastguard Worker          * Bit      11: CONTRACT_HAS_STARTER flag. (Used by ICU4X only.)
226*0e209d39SAndroid Build Coastguard Worker          * Bit      10: CONTRACT_TRAILING_CCC flag.
227*0e209d39SAndroid Build Coastguard Worker          * Bit       9: CONTRACT_NEXT_CCC flag.
228*0e209d39SAndroid Build Coastguard Worker          * Bit       8: CONTRACT_SINGLE_CP_NO_MATCH flag.
229*0e209d39SAndroid Build Coastguard Worker          */
230*0e209d39SAndroid Build Coastguard Worker         CONTRACTION_TAG = 9,
231*0e209d39SAndroid Build Coastguard Worker         /**
232*0e209d39SAndroid Build Coastguard Worker          * Decimal digit.
233*0e209d39SAndroid Build Coastguard Worker          * Bits 31..13: Index into uint32_t table for non-numeric-collation CE32.
234*0e209d39SAndroid Build Coastguard Worker          * Bit      12: Unused, 0.
235*0e209d39SAndroid Build Coastguard Worker          * Bits 11.. 8: Digit value 0..9.
236*0e209d39SAndroid Build Coastguard Worker          */
237*0e209d39SAndroid Build Coastguard Worker         DIGIT_TAG = 10,
238*0e209d39SAndroid Build Coastguard Worker         /**
239*0e209d39SAndroid Build Coastguard Worker          * Tag for U+0000, for moving the NUL-termination handling
240*0e209d39SAndroid Build Coastguard Worker          * from the regular fastpath into specials-handling code.
241*0e209d39SAndroid Build Coastguard Worker          * Bits 31..8: Unused, 0.
242*0e209d39SAndroid Build Coastguard Worker          */
243*0e209d39SAndroid Build Coastguard Worker         U0000_TAG = 11,
244*0e209d39SAndroid Build Coastguard Worker         /**
245*0e209d39SAndroid Build Coastguard Worker          * Tag for a Hangul syllable.
246*0e209d39SAndroid Build Coastguard Worker          * Bits 31..9: Unused, 0.
247*0e209d39SAndroid Build Coastguard Worker          * Bit      8: HANGUL_NO_SPECIAL_JAMO flag.
248*0e209d39SAndroid Build Coastguard Worker          */
249*0e209d39SAndroid Build Coastguard Worker         HANGUL_TAG = 12,
250*0e209d39SAndroid Build Coastguard Worker         /**
251*0e209d39SAndroid Build Coastguard Worker          * Tag for a lead surrogate code unit.
252*0e209d39SAndroid Build Coastguard Worker          * Optional optimization for UTF-16 string processing.
253*0e209d39SAndroid Build Coastguard Worker          * Bits 31..10: Unused, 0.
254*0e209d39SAndroid Build Coastguard Worker          *       9.. 8: =0: All associated supplementary code points are unassigned-implicit.
255*0e209d39SAndroid Build Coastguard Worker          *              =1: All associated supplementary code points fall back to the base data.
256*0e209d39SAndroid Build Coastguard Worker          *              else: (Normally 2) Look up the data for the supplementary code point.
257*0e209d39SAndroid Build Coastguard Worker          */
258*0e209d39SAndroid Build Coastguard Worker         LEAD_SURROGATE_TAG = 13,
259*0e209d39SAndroid Build Coastguard Worker         /**
260*0e209d39SAndroid Build Coastguard Worker          * Tag for CEs with primary weights in code point order.
261*0e209d39SAndroid Build Coastguard Worker          * Bits 31..13: Index into CE table, for one data "CE".
262*0e209d39SAndroid Build Coastguard Worker          * Bits 12.. 8: Unused, 0.
263*0e209d39SAndroid Build Coastguard Worker          *
264*0e209d39SAndroid Build Coastguard Worker          * This data "CE" has the following bit fields:
265*0e209d39SAndroid Build Coastguard Worker          * Bits 63..32: Three-byte primary pppppp00.
266*0e209d39SAndroid Build Coastguard Worker          *      31.. 8: Start/base code point of the in-order range.
267*0e209d39SAndroid Build Coastguard Worker          *           7: Flag isCompressible primary.
268*0e209d39SAndroid Build Coastguard Worker          *       6.. 0: Per-code point primary-weight increment.
269*0e209d39SAndroid Build Coastguard Worker          */
270*0e209d39SAndroid Build Coastguard Worker         OFFSET_TAG = 14,
271*0e209d39SAndroid Build Coastguard Worker         /**
272*0e209d39SAndroid Build Coastguard Worker          * Implicit CE tag. Compute an unassigned-implicit CE.
273*0e209d39SAndroid Build Coastguard Worker          * All bits are set (UNASSIGNED_CE32=0xffffffff).
274*0e209d39SAndroid Build Coastguard Worker          */
275*0e209d39SAndroid Build Coastguard Worker         IMPLICIT_TAG = 15
276*0e209d39SAndroid Build Coastguard Worker     };
277*0e209d39SAndroid Build Coastguard Worker 
isAssignedCE32(uint32_t ce32)278*0e209d39SAndroid Build Coastguard Worker     static UBool isAssignedCE32(uint32_t ce32) {
279*0e209d39SAndroid Build Coastguard Worker         return ce32 != FALLBACK_CE32 && ce32 != UNASSIGNED_CE32;
280*0e209d39SAndroid Build Coastguard Worker     }
281*0e209d39SAndroid Build Coastguard Worker 
282*0e209d39SAndroid Build Coastguard Worker     /**
283*0e209d39SAndroid Build Coastguard Worker      * We limit the number of CEs in an expansion
284*0e209d39SAndroid Build Coastguard Worker      * so that we can use a small number of length bits in the data structure,
285*0e209d39SAndroid Build Coastguard Worker      * and so that an implementation can copy CEs at runtime without growing a destination buffer.
286*0e209d39SAndroid Build Coastguard Worker      */
287*0e209d39SAndroid Build Coastguard Worker     static const int32_t MAX_EXPANSION_LENGTH = 31;
288*0e209d39SAndroid Build Coastguard Worker     static const int32_t MAX_INDEX = 0x7ffff;
289*0e209d39SAndroid Build Coastguard Worker 
290*0e209d39SAndroid Build Coastguard Worker     /**
291*0e209d39SAndroid Build Coastguard Worker      * Set if there is no match for the single (no-suffix) character itself.
292*0e209d39SAndroid Build Coastguard Worker      * This is only possible if there is a prefix.
293*0e209d39SAndroid Build Coastguard Worker      * In this case, discontiguous contraction matching cannot add combining marks
294*0e209d39SAndroid Build Coastguard Worker      * starting from an empty suffix.
295*0e209d39SAndroid Build Coastguard Worker      * The default CE32 is used anyway if there is no suffix match.
296*0e209d39SAndroid Build Coastguard Worker      */
297*0e209d39SAndroid Build Coastguard Worker     static const uint32_t CONTRACT_SINGLE_CP_NO_MATCH = 0x100;
298*0e209d39SAndroid Build Coastguard Worker     /** Set if the first character of every contraction suffix has lccc!=0. */
299*0e209d39SAndroid Build Coastguard Worker     static const uint32_t CONTRACT_NEXT_CCC = 0x200;
300*0e209d39SAndroid Build Coastguard Worker     /** Set if any contraction suffix ends with lccc!=0. */
301*0e209d39SAndroid Build Coastguard Worker     static const uint32_t CONTRACT_TRAILING_CCC = 0x400;
302*0e209d39SAndroid Build Coastguard Worker     /** Set if any contraction suffix contains a starter. (Used by ICU4X only.) */
303*0e209d39SAndroid Build Coastguard Worker     static const uint32_t CONTRACT_HAS_STARTER = 0x800;
304*0e209d39SAndroid Build Coastguard Worker 
305*0e209d39SAndroid Build Coastguard Worker     /** For HANGUL_TAG: None of its Jamo CE32s isSpecialCE32(). */
306*0e209d39SAndroid Build Coastguard Worker     static const uint32_t HANGUL_NO_SPECIAL_JAMO = 0x100;
307*0e209d39SAndroid Build Coastguard Worker 
308*0e209d39SAndroid Build Coastguard Worker     static const uint32_t LEAD_ALL_UNASSIGNED = 0;
309*0e209d39SAndroid Build Coastguard Worker     static const uint32_t LEAD_ALL_FALLBACK = 0x100;
310*0e209d39SAndroid Build Coastguard Worker     static const uint32_t LEAD_MIXED = 0x200;
311*0e209d39SAndroid Build Coastguard Worker     static const uint32_t LEAD_TYPE_MASK = 0x300;
312*0e209d39SAndroid Build Coastguard Worker 
makeLongPrimaryCE32(uint32_t p)313*0e209d39SAndroid Build Coastguard Worker     static uint32_t makeLongPrimaryCE32(uint32_t p) { return p | LONG_PRIMARY_CE32_LOW_BYTE; }
314*0e209d39SAndroid Build Coastguard Worker 
315*0e209d39SAndroid Build Coastguard Worker     /** Turns the long-primary CE32 into a primary weight pppppp00. */
primaryFromLongPrimaryCE32(uint32_t ce32)316*0e209d39SAndroid Build Coastguard Worker     static inline uint32_t primaryFromLongPrimaryCE32(uint32_t ce32) {
317*0e209d39SAndroid Build Coastguard Worker         return ce32 & 0xffffff00;
318*0e209d39SAndroid Build Coastguard Worker     }
ceFromLongPrimaryCE32(uint32_t ce32)319*0e209d39SAndroid Build Coastguard Worker     static inline int64_t ceFromLongPrimaryCE32(uint32_t ce32) {
320*0e209d39SAndroid Build Coastguard Worker         return ((int64_t)(ce32 & 0xffffff00) << 32) | COMMON_SEC_AND_TER_CE;
321*0e209d39SAndroid Build Coastguard Worker     }
322*0e209d39SAndroid Build Coastguard Worker 
makeLongSecondaryCE32(uint32_t lower32)323*0e209d39SAndroid Build Coastguard Worker     static uint32_t makeLongSecondaryCE32(uint32_t lower32) {
324*0e209d39SAndroid Build Coastguard Worker         return lower32 | SPECIAL_CE32_LOW_BYTE | LONG_SECONDARY_TAG;
325*0e209d39SAndroid Build Coastguard Worker     }
ceFromLongSecondaryCE32(uint32_t ce32)326*0e209d39SAndroid Build Coastguard Worker     static inline int64_t ceFromLongSecondaryCE32(uint32_t ce32) {
327*0e209d39SAndroid Build Coastguard Worker         return ce32 & 0xffffff00;
328*0e209d39SAndroid Build Coastguard Worker     }
329*0e209d39SAndroid Build Coastguard Worker 
330*0e209d39SAndroid Build Coastguard Worker     /** Makes a special CE32 with tag, index and length. */
makeCE32FromTagIndexAndLength(int32_t tag,int32_t index,int32_t length)331*0e209d39SAndroid Build Coastguard Worker     static uint32_t makeCE32FromTagIndexAndLength(int32_t tag, int32_t index, int32_t length) {
332*0e209d39SAndroid Build Coastguard Worker         return (index << 13) | (length << 8) | SPECIAL_CE32_LOW_BYTE | tag;
333*0e209d39SAndroid Build Coastguard Worker     }
334*0e209d39SAndroid Build Coastguard Worker     /** Makes a special CE32 with only tag and index. */
makeCE32FromTagAndIndex(int32_t tag,int32_t index)335*0e209d39SAndroid Build Coastguard Worker     static uint32_t makeCE32FromTagAndIndex(int32_t tag, int32_t index) {
336*0e209d39SAndroid Build Coastguard Worker         return (index << 13) | SPECIAL_CE32_LOW_BYTE | tag;
337*0e209d39SAndroid Build Coastguard Worker     }
338*0e209d39SAndroid Build Coastguard Worker 
isSpecialCE32(uint32_t ce32)339*0e209d39SAndroid Build Coastguard Worker     static inline UBool isSpecialCE32(uint32_t ce32) {
340*0e209d39SAndroid Build Coastguard Worker         return (ce32 & 0xff) >= SPECIAL_CE32_LOW_BYTE;
341*0e209d39SAndroid Build Coastguard Worker     }
342*0e209d39SAndroid Build Coastguard Worker 
tagFromCE32(uint32_t ce32)343*0e209d39SAndroid Build Coastguard Worker     static inline int32_t tagFromCE32(uint32_t ce32) {
344*0e209d39SAndroid Build Coastguard Worker         return (int32_t)(ce32 & 0xf);
345*0e209d39SAndroid Build Coastguard Worker     }
346*0e209d39SAndroid Build Coastguard Worker 
hasCE32Tag(uint32_t ce32,int32_t tag)347*0e209d39SAndroid Build Coastguard Worker     static inline UBool hasCE32Tag(uint32_t ce32, int32_t tag) {
348*0e209d39SAndroid Build Coastguard Worker         return isSpecialCE32(ce32) && tagFromCE32(ce32) == tag;
349*0e209d39SAndroid Build Coastguard Worker     }
350*0e209d39SAndroid Build Coastguard Worker 
isLongPrimaryCE32(uint32_t ce32)351*0e209d39SAndroid Build Coastguard Worker     static inline UBool isLongPrimaryCE32(uint32_t ce32) {
352*0e209d39SAndroid Build Coastguard Worker         return hasCE32Tag(ce32, LONG_PRIMARY_TAG);
353*0e209d39SAndroid Build Coastguard Worker     }
354*0e209d39SAndroid Build Coastguard Worker 
isSimpleOrLongCE32(uint32_t ce32)355*0e209d39SAndroid Build Coastguard Worker     static UBool isSimpleOrLongCE32(uint32_t ce32) {
356*0e209d39SAndroid Build Coastguard Worker         return !isSpecialCE32(ce32) ||
357*0e209d39SAndroid Build Coastguard Worker                 tagFromCE32(ce32) == LONG_PRIMARY_TAG ||
358*0e209d39SAndroid Build Coastguard Worker                 tagFromCE32(ce32) == LONG_SECONDARY_TAG;
359*0e209d39SAndroid Build Coastguard Worker     }
360*0e209d39SAndroid Build Coastguard Worker 
361*0e209d39SAndroid Build Coastguard Worker     /**
362*0e209d39SAndroid Build Coastguard Worker      * @return true if the ce32 yields one or more CEs without further data lookups
363*0e209d39SAndroid Build Coastguard Worker      */
isSelfContainedCE32(uint32_t ce32)364*0e209d39SAndroid Build Coastguard Worker     static UBool isSelfContainedCE32(uint32_t ce32) {
365*0e209d39SAndroid Build Coastguard Worker         return !isSpecialCE32(ce32) ||
366*0e209d39SAndroid Build Coastguard Worker                 tagFromCE32(ce32) == LONG_PRIMARY_TAG ||
367*0e209d39SAndroid Build Coastguard Worker                 tagFromCE32(ce32) == LONG_SECONDARY_TAG ||
368*0e209d39SAndroid Build Coastguard Worker                 tagFromCE32(ce32) == LATIN_EXPANSION_TAG;
369*0e209d39SAndroid Build Coastguard Worker     }
370*0e209d39SAndroid Build Coastguard Worker 
isPrefixCE32(uint32_t ce32)371*0e209d39SAndroid Build Coastguard Worker     static inline UBool isPrefixCE32(uint32_t ce32) {
372*0e209d39SAndroid Build Coastguard Worker         return hasCE32Tag(ce32, PREFIX_TAG);
373*0e209d39SAndroid Build Coastguard Worker     }
374*0e209d39SAndroid Build Coastguard Worker 
isContractionCE32(uint32_t ce32)375*0e209d39SAndroid Build Coastguard Worker     static inline UBool isContractionCE32(uint32_t ce32) {
376*0e209d39SAndroid Build Coastguard Worker         return hasCE32Tag(ce32, CONTRACTION_TAG);
377*0e209d39SAndroid Build Coastguard Worker     }
378*0e209d39SAndroid Build Coastguard Worker 
ce32HasContext(uint32_t ce32)379*0e209d39SAndroid Build Coastguard Worker     static inline UBool ce32HasContext(uint32_t ce32) {
380*0e209d39SAndroid Build Coastguard Worker         return isSpecialCE32(ce32) &&
381*0e209d39SAndroid Build Coastguard Worker                 (tagFromCE32(ce32) == PREFIX_TAG ||
382*0e209d39SAndroid Build Coastguard Worker                 tagFromCE32(ce32) == CONTRACTION_TAG);
383*0e209d39SAndroid Build Coastguard Worker     }
384*0e209d39SAndroid Build Coastguard Worker 
385*0e209d39SAndroid Build Coastguard Worker     /**
386*0e209d39SAndroid Build Coastguard Worker      * Get the first of the two Latin-expansion CEs encoded in ce32.
387*0e209d39SAndroid Build Coastguard Worker      * @see LATIN_EXPANSION_TAG
388*0e209d39SAndroid Build Coastguard Worker      */
latinCE0FromCE32(uint32_t ce32)389*0e209d39SAndroid Build Coastguard Worker     static inline int64_t latinCE0FromCE32(uint32_t ce32) {
390*0e209d39SAndroid Build Coastguard Worker         return ((int64_t)(ce32 & 0xff000000) << 32) | COMMON_SECONDARY_CE | ((ce32 & 0xff0000) >> 8);
391*0e209d39SAndroid Build Coastguard Worker     }
392*0e209d39SAndroid Build Coastguard Worker 
393*0e209d39SAndroid Build Coastguard Worker     /**
394*0e209d39SAndroid Build Coastguard Worker      * Get the second of the two Latin-expansion CEs encoded in ce32.
395*0e209d39SAndroid Build Coastguard Worker      * @see LATIN_EXPANSION_TAG
396*0e209d39SAndroid Build Coastguard Worker      */
latinCE1FromCE32(uint32_t ce32)397*0e209d39SAndroid Build Coastguard Worker     static inline int64_t latinCE1FromCE32(uint32_t ce32) {
398*0e209d39SAndroid Build Coastguard Worker         return ((ce32 & 0xff00) << 16) | COMMON_TERTIARY_CE;
399*0e209d39SAndroid Build Coastguard Worker     }
400*0e209d39SAndroid Build Coastguard Worker 
401*0e209d39SAndroid Build Coastguard Worker     /**
402*0e209d39SAndroid Build Coastguard Worker      * Returns the data index from a special CE32.
403*0e209d39SAndroid Build Coastguard Worker      */
indexFromCE32(uint32_t ce32)404*0e209d39SAndroid Build Coastguard Worker     static inline int32_t indexFromCE32(uint32_t ce32) {
405*0e209d39SAndroid Build Coastguard Worker         return (int32_t)(ce32 >> 13);
406*0e209d39SAndroid Build Coastguard Worker     }
407*0e209d39SAndroid Build Coastguard Worker 
408*0e209d39SAndroid Build Coastguard Worker     /**
409*0e209d39SAndroid Build Coastguard Worker      * Returns the data length from a ce32.
410*0e209d39SAndroid Build Coastguard Worker      */
lengthFromCE32(uint32_t ce32)411*0e209d39SAndroid Build Coastguard Worker     static inline int32_t lengthFromCE32(uint32_t ce32) {
412*0e209d39SAndroid Build Coastguard Worker         return (ce32 >> 8) & 31;
413*0e209d39SAndroid Build Coastguard Worker     }
414*0e209d39SAndroid Build Coastguard Worker 
415*0e209d39SAndroid Build Coastguard Worker     /**
416*0e209d39SAndroid Build Coastguard Worker      * Returns the digit value from a DIGIT_TAG ce32.
417*0e209d39SAndroid Build Coastguard Worker      */
digitFromCE32(uint32_t ce32)418*0e209d39SAndroid Build Coastguard Worker     static inline char digitFromCE32(uint32_t ce32) {
419*0e209d39SAndroid Build Coastguard Worker         return (char)((ce32 >> 8) & 0xf);
420*0e209d39SAndroid Build Coastguard Worker     }
421*0e209d39SAndroid Build Coastguard Worker 
422*0e209d39SAndroid Build Coastguard Worker     /** Returns a 64-bit CE from a simple CE32 (not special). */
ceFromSimpleCE32(uint32_t ce32)423*0e209d39SAndroid Build Coastguard Worker     static inline int64_t ceFromSimpleCE32(uint32_t ce32) {
424*0e209d39SAndroid Build Coastguard Worker         // normal form ppppsstt -> pppp0000ss00tt00
425*0e209d39SAndroid Build Coastguard Worker         // assert (ce32 & 0xff) < SPECIAL_CE32_LOW_BYTE
426*0e209d39SAndroid Build Coastguard Worker         return ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | ((ce32 & 0xff) << 8);
427*0e209d39SAndroid Build Coastguard Worker     }
428*0e209d39SAndroid Build Coastguard Worker 
429*0e209d39SAndroid Build Coastguard Worker     /** Returns a 64-bit CE from a simple/long-primary/long-secondary CE32. */
ceFromCE32(uint32_t ce32)430*0e209d39SAndroid Build Coastguard Worker     static inline int64_t ceFromCE32(uint32_t ce32) {
431*0e209d39SAndroid Build Coastguard Worker         uint32_t tertiary = ce32 & 0xff;
432*0e209d39SAndroid Build Coastguard Worker         if(tertiary < SPECIAL_CE32_LOW_BYTE) {
433*0e209d39SAndroid Build Coastguard Worker             // normal form ppppsstt -> pppp0000ss00tt00
434*0e209d39SAndroid Build Coastguard Worker             return ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (tertiary << 8);
435*0e209d39SAndroid Build Coastguard Worker         } else {
436*0e209d39SAndroid Build Coastguard Worker             ce32 -= tertiary;
437*0e209d39SAndroid Build Coastguard Worker             if((tertiary & 0xf) == LONG_PRIMARY_TAG) {
438*0e209d39SAndroid Build Coastguard Worker                 // long-primary form ppppppC1 -> pppppp00050000500
439*0e209d39SAndroid Build Coastguard Worker                 return ((int64_t)ce32 << 32) | COMMON_SEC_AND_TER_CE;
440*0e209d39SAndroid Build Coastguard Worker             } else {
441*0e209d39SAndroid Build Coastguard Worker                 // long-secondary form ssssttC2 -> 00000000sssstt00
442*0e209d39SAndroid Build Coastguard Worker                 // assert (tertiary & 0xf) == LONG_SECONDARY_TAG
443*0e209d39SAndroid Build Coastguard Worker                 return ce32;
444*0e209d39SAndroid Build Coastguard Worker             }
445*0e209d39SAndroid Build Coastguard Worker         }
446*0e209d39SAndroid Build Coastguard Worker     }
447*0e209d39SAndroid Build Coastguard Worker 
448*0e209d39SAndroid Build Coastguard Worker     /** Creates a CE from a primary weight. */
makeCE(uint32_t p)449*0e209d39SAndroid Build Coastguard Worker     static inline int64_t makeCE(uint32_t p) {
450*0e209d39SAndroid Build Coastguard Worker         return ((int64_t)p << 32) | COMMON_SEC_AND_TER_CE;
451*0e209d39SAndroid Build Coastguard Worker     }
452*0e209d39SAndroid Build Coastguard Worker     /**
453*0e209d39SAndroid Build Coastguard Worker      * Creates a CE from a primary weight,
454*0e209d39SAndroid Build Coastguard Worker      * 16-bit secondary/tertiary weights, and a 2-bit quaternary.
455*0e209d39SAndroid Build Coastguard Worker      */
makeCE(uint32_t p,uint32_t s,uint32_t t,uint32_t q)456*0e209d39SAndroid Build Coastguard Worker     static inline int64_t makeCE(uint32_t p, uint32_t s, uint32_t t, uint32_t q) {
457*0e209d39SAndroid Build Coastguard Worker         return ((int64_t)p << 32) | (s << 16) | t | (q << 6);
458*0e209d39SAndroid Build Coastguard Worker     }
459*0e209d39SAndroid Build Coastguard Worker 
460*0e209d39SAndroid Build Coastguard Worker     /**
461*0e209d39SAndroid Build Coastguard Worker      * Increments a 2-byte primary by a code point offset.
462*0e209d39SAndroid Build Coastguard Worker      */
463*0e209d39SAndroid Build Coastguard Worker     static uint32_t incTwoBytePrimaryByOffset(uint32_t basePrimary, UBool isCompressible,
464*0e209d39SAndroid Build Coastguard Worker                                               int32_t offset);
465*0e209d39SAndroid Build Coastguard Worker 
466*0e209d39SAndroid Build Coastguard Worker     /**
467*0e209d39SAndroid Build Coastguard Worker      * Increments a 3-byte primary by a code point offset.
468*0e209d39SAndroid Build Coastguard Worker      */
469*0e209d39SAndroid Build Coastguard Worker     static uint32_t incThreeBytePrimaryByOffset(uint32_t basePrimary, UBool isCompressible,
470*0e209d39SAndroid Build Coastguard Worker                                                 int32_t offset);
471*0e209d39SAndroid Build Coastguard Worker 
472*0e209d39SAndroid Build Coastguard Worker     /**
473*0e209d39SAndroid Build Coastguard Worker      * Decrements a 2-byte primary by one range step (1..0x7f).
474*0e209d39SAndroid Build Coastguard Worker      */
475*0e209d39SAndroid Build Coastguard Worker     static uint32_t decTwoBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressible, int32_t step);
476*0e209d39SAndroid Build Coastguard Worker 
477*0e209d39SAndroid Build Coastguard Worker     /**
478*0e209d39SAndroid Build Coastguard Worker      * Decrements a 3-byte primary by one range step (1..0x7f).
479*0e209d39SAndroid Build Coastguard Worker      */
480*0e209d39SAndroid Build Coastguard Worker     static uint32_t decThreeBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressible, int32_t step);
481*0e209d39SAndroid Build Coastguard Worker 
482*0e209d39SAndroid Build Coastguard Worker     /**
483*0e209d39SAndroid Build Coastguard Worker      * Computes a 3-byte primary for c's OFFSET_TAG data "CE".
484*0e209d39SAndroid Build Coastguard Worker      */
485*0e209d39SAndroid Build Coastguard Worker     static uint32_t getThreeBytePrimaryForOffsetData(UChar32 c, int64_t dataCE);
486*0e209d39SAndroid Build Coastguard Worker 
487*0e209d39SAndroid Build Coastguard Worker     /**
488*0e209d39SAndroid Build Coastguard Worker      * Returns the unassigned-character implicit primary weight for any valid code point c.
489*0e209d39SAndroid Build Coastguard Worker      */
490*0e209d39SAndroid Build Coastguard Worker     static uint32_t unassignedPrimaryFromCodePoint(UChar32 c);
491*0e209d39SAndroid Build Coastguard Worker 
unassignedCEFromCodePoint(UChar32 c)492*0e209d39SAndroid Build Coastguard Worker     static inline int64_t unassignedCEFromCodePoint(UChar32 c) {
493*0e209d39SAndroid Build Coastguard Worker         return makeCE(unassignedPrimaryFromCodePoint(c));
494*0e209d39SAndroid Build Coastguard Worker     }
495*0e209d39SAndroid Build Coastguard Worker 
496*0e209d39SAndroid Build Coastguard Worker private:
497*0e209d39SAndroid Build Coastguard Worker     Collation() = delete;  // No instantiation.
498*0e209d39SAndroid Build Coastguard Worker };
499*0e209d39SAndroid Build Coastguard Worker 
500*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
501*0e209d39SAndroid Build Coastguard Worker 
502*0e209d39SAndroid Build Coastguard Worker #endif  // !UCONFIG_NO_COLLATION
503*0e209d39SAndroid Build Coastguard Worker #endif  // __COLLATION_H__
504