1fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/*
2fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*******************************************************************************
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Copyright (C) 2013-2014, International Business Machines
4fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Corporation and others.  All Rights Reserved.
5fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*******************************************************************************
6fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* collationsettings.h
7fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*
8fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* created on: 2013feb07
9fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* created by: Markus W. Scherer
10fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*/
11fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
12fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#ifndef __COLLATIONSETTINGS_H__
13fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#define __COLLATIONSETTINGS_H__
14fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
15fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/utypes.h"
16fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
17fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_COLLATION
18fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
19fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/ucol.h"
20fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "collation.h"
21fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "sharedobject.h"
22fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "umutex.h"
23fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
24fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_BEGIN
25fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
26fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/**
27fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Collation settings/options/attributes.
28fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * These are the values that can be changed via API.
29fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius */
30fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstruct U_I18N_API CollationSettings : public SharedObject {
31fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
32fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bit 0: Perform the FCD check on the input text and deliver normalized text.
33fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
34fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t CHECK_FCD = 1;
35fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
36fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bit 1: Numeric collation.
37fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Also known as CODAN = COllate Digits As Numbers.
38fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     *
39fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Treat digit sequences as numbers with CE sequences in numeric order,
40fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * rather than returning a normal CE for each digit.
41fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
42fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t NUMERIC = 2;
43fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
44fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * "Shifted" alternate handling, see ALTERNATE_MASK.
45fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
46fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t SHIFTED = 4;
47fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
48fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bits 3..2: Alternate-handling mask. 0 for non-ignorable.
49fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Reserve values 8 and 0xc for shift-trimmed and blanked.
50fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
51fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t ALTERNATE_MASK = 0xc;
52fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
53fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bits 6..4: The 3-bit maxVariable value bit field is shifted by this value.
54fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
55fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t MAX_VARIABLE_SHIFT = 4;
56fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** maxVariable options bit mask before shifting. */
57fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t MAX_VARIABLE_MASK = 0x70;
58fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** Options bit 7: Reserved/unused/0. */
59fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
60fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bit 8: Sort uppercase first if caseLevel or caseFirst is on.
61fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
62fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t UPPER_FIRST = 0x100;
63fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
64fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bit 9: Keep the case bits in the tertiary weight (they trump other tertiary values)
65fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * unless case level is on (when they are *moved* into the separate case level).
66fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * By default, the case bits are removed from the tertiary weight (ignored).
67fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     *
68fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * When CASE_FIRST is off, UPPER_FIRST must be off too, corresponding to
69fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * the tri-value UCOL_CASE_FIRST attribute: UCOL_OFF vs. UCOL_LOWER_FIRST vs. UCOL_UPPER_FIRST.
70fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
71fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t CASE_FIRST = 0x200;
72fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
73fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bit mask for caseFirst and upperFirst, before shifting.
74fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Same value as caseFirst==upperFirst.
75fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
76fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t CASE_FIRST_AND_UPPER_MASK = CASE_FIRST | UPPER_FIRST;
77fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
78fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bit 10: Insert the case level between the secondary and tertiary levels.
79fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
80fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t CASE_LEVEL = 0x400;
81fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
82fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bit 11: Compare secondary weights backwards. ("French secondary")
83fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
84fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t BACKWARD_SECONDARY = 0x800;
85fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
86fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Options bits 15..12: The 4-bit strength value bit field is shifted by this value.
87fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * It is the top used bit field in the options. (No need to mask after shifting.)
88fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
89fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t STRENGTH_SHIFT = 12;
90fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** Strength options bit mask before shifting. */
91fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const int32_t STRENGTH_MASK = 0xf000;
92fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
93fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** maxVariable values */
94fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    enum MaxVariable {
95fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        MAX_VAR_SPACE,
96fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        MAX_VAR_PUNCT,
97fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        MAX_VAR_SYMBOL,
98fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        MAX_VAR_CURRENCY
99fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    };
100fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
101fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CollationSettings()
102fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            : options((UCOL_DEFAULT_STRENGTH << STRENGTH_SHIFT) |
103fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                      (MAX_VAR_PUNCT << MAX_VARIABLE_SHIFT)),
104fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius              variableTop(0),
105fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius              reorderTable(NULL),
106fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius              reorderCodes(NULL), reorderCodesLength(0), reorderCodesCapacity(0),
107fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius              fastLatinOptions(-1) {}
108fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
109fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CollationSettings(const CollationSettings &other);
110fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    virtual ~CollationSettings();
111fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
112fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UBool operator==(const CollationSettings &other) const;
113fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
114fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    inline UBool operator!=(const CollationSettings &other) const {
115fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return !operator==(other);
116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
117fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
118fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t hashCode() const;
119fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
120fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    void resetReordering();
121fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    void aliasReordering(const int32_t *codes, int32_t length, const uint8_t *table);
122fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UBool setReordering(const int32_t *codes, int32_t length, const uint8_t table[256]);
123fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
124fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    void setStrength(int32_t value, int32_t defaultOptions, UErrorCode &errorCode);
125fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
126fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static int32_t getStrength(int32_t options) {
127fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return options >> STRENGTH_SHIFT;
128fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
129fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
130fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t getStrength() const {
131fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return getStrength(options);
132fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
133fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
134fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** Sets the options bit for an on/off attribute. */
135fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    void setFlag(int32_t bit, UColAttributeValue value,
136fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                 int32_t defaultOptions, UErrorCode &errorCode);
137fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
138fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UColAttributeValue getFlag(int32_t bit) const {
139fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return ((options & bit) != 0) ? UCOL_ON : UCOL_OFF;
140fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
141fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
142fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    void setCaseFirst(UColAttributeValue value, int32_t defaultOptions, UErrorCode &errorCode);
143fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
144fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UColAttributeValue getCaseFirst() const {
145fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        int32_t option = options & CASE_FIRST_AND_UPPER_MASK;
146fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (option == 0) ? UCOL_OFF :
147fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                (option == CASE_FIRST) ? UCOL_LOWER_FIRST : UCOL_UPPER_FIRST;
148fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
149fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
150fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    void setAlternateHandling(UColAttributeValue value,
151fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                              int32_t defaultOptions, UErrorCode &errorCode);
152fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
153fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UColAttributeValue getAlternateHandling() const {
154fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return ((options & ALTERNATE_MASK) == 0) ? UCOL_NON_IGNORABLE : UCOL_SHIFTED;
155fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
156fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
157fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    void setMaxVariable(int32_t value, int32_t defaultOptions, UErrorCode &errorCode);
158fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
159fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    MaxVariable getMaxVariable() const {
160fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (MaxVariable)((options & MAX_VARIABLE_MASK) >> MAX_VARIABLE_SHIFT);
161fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
162fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
163fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
164fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Include case bits in the tertiary level if caseLevel=off and caseFirst!=off.
165fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
166fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static inline UBool isTertiaryWithCaseBits(int32_t options) {
167fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (options & (CASE_LEVEL | CASE_FIRST)) == CASE_FIRST;
168fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
169fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static uint32_t getTertiaryMask(int32_t options) {
170fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // Remove the case bits from the tertiary weight when caseLevel is on or caseFirst is off.
171fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return isTertiaryWithCaseBits(options) ?
172fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                Collation::CASE_AND_TERTIARY_MASK : Collation::ONLY_TERTIARY_MASK;
173fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
174fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
175fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static UBool sortsTertiaryUpperCaseFirst(int32_t options) {
176fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // On tertiary level, consider case bits and sort uppercase first
177fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // if caseLevel is off and caseFirst==upperFirst.
178fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (options & (CASE_LEVEL | CASE_FIRST_AND_UPPER_MASK)) == CASE_FIRST_AND_UPPER_MASK;
179fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
180fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
181fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    inline UBool dontCheckFCD() const {
182fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (options & CHECK_FCD) == 0;
183fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
184fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
185fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    inline UBool hasBackwardSecondary() const {
186fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (options & BACKWARD_SECONDARY) != 0;
187fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
188fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
189fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    inline UBool isNumeric() const {
190fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (options & NUMERIC) != 0;
191fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
192fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
193fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** CHECK_FCD etc. */
194fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t options;
195fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** Variable-top primary weight. */
196fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    uint32_t variableTop;
197fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** 256-byte table for reordering permutation of primary lead bytes; NULL if no reordering. */
198fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const uint8_t *reorderTable;
199fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** Array of reorder codes; ignored if reorderCodesLength == 0. */
200fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const int32_t *reorderCodes;
201fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** Number of reorder codes; 0 if no reordering. */
202fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t reorderCodesLength;
203fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /**
204fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Capacity of reorderCodes.
205fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * If 0, then the table and codes are aliases.
206fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * Otherwise, this object owns the memory via the reorderCodes pointer;
207fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     * the table and the codes are in the same memory block, with the codes first.
208fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     */
209fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t reorderCodesCapacity;
210fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
211fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** Options for CollationFastLatin. Negative if disabled. */
212fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t fastLatinOptions;
213fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    uint16_t fastLatinPrimaries[0x180];
214fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius};
215fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
216fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_END
217fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
218fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif  // !UCONFIG_NO_COLLATION
219fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif  // __COLLATIONSETTINGS_H__
220