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