Home | History | Annotate | Download | only in unicode
      1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /*
      4 *******************************************************************************
      5 *
      6 *   Copyright (C) 2009-2013, International Business Machines
      7 *   Corporation and others.  All Rights Reserved.
      8 *
      9 *******************************************************************************
     10 *   file name:  normalizer2.h
     11 *   encoding:   US-ASCII
     12 *   tab size:   8 (not used)
     13 *   indentation:4
     14 *
     15 *   created on: 2009nov22
     16 *   created by: Markus W. Scherer
     17 */
     18 
     19 #ifndef __NORMALIZER2_H__
     20 #define __NORMALIZER2_H__
     21 
     22 /**
     23  * \file
     24  * \brief C++ API: New API for Unicode Normalization.
     25  */
     26 
     27 #include "unicode/utypes.h"
     28 
     29 #if !UCONFIG_NO_NORMALIZATION
     30 
     31 #include "unicode/uniset.h"
     32 #include "unicode/unistr.h"
     33 #include "unicode/unorm2.h"
     34 
     35 U_NAMESPACE_BEGIN
     36 
     37 /**
     38  * Unicode normalization functionality for standard Unicode normalization or
     39  * for using custom mapping tables.
     40  * All instances of this class are unmodifiable/immutable.
     41  * Instances returned by getInstance() are singletons that must not be deleted by the caller.
     42  * The Normalizer2 class is not intended for public subclassing.
     43  *
     44  * The primary functions are to produce a normalized string and to detect whether
     45  * a string is already normalized.
     46  * The most commonly used normalization forms are those defined in
     47  * http://www.unicode.org/unicode/reports/tr15/
     48  * However, this API supports additional normalization forms for specialized purposes.
     49  * For example, NFKC_Casefold is provided via getInstance("nfkc_cf", COMPOSE)
     50  * and can be used in implementations of UTS #46.
     51  *
     52  * Not only are the standard compose and decompose modes supplied,
     53  * but additional modes are provided as documented in the Mode enum.
     54  *
     55  * Some of the functions in this class identify normalization boundaries.
     56  * At a normalization boundary, the portions of the string
     57  * before it and starting from it do not interact and can be handled independently.
     58  *
     59  * The spanQuickCheckYes() stops at a normalization boundary.
     60  * When the goal is a normalized string, then the text before the boundary
     61  * can be copied, and the remainder can be processed with normalizeSecondAndAppend().
     62  *
     63  * The hasBoundaryBefore(), hasBoundaryAfter() and isInert() functions test whether
     64  * a character is guaranteed to be at a normalization boundary,
     65  * regardless of context.
     66  * This is used for moving from one normalization boundary to the next
     67  * or preceding boundary, and for performing iterative normalization.
     68  *
     69  * Iterative normalization is useful when only a small portion of a
     70  * longer string needs to be processed.
     71  * For example, in ICU, iterative normalization is used by the NormalizationTransliterator
     72  * (to avoid replacing already-normalized text) and ucol_nextSortKeyPart()
     73  * (to process only the substring for which sort key bytes are computed).
     74  *
     75  * The set of normalization boundaries returned by these functions may not be
     76  * complete: There may be more boundaries that could be returned.
     77  * Different functions may return different boundaries.
     78  * @stable ICU 4.4
     79  */
     80 class U_COMMON_API Normalizer2 : public UObject {
     81 public:
     82     /**
     83      * Destructor.
     84      * @stable ICU 4.4
     85      */
     86     ~Normalizer2();
     87 
     88     /**
     89      * Returns a Normalizer2 instance for Unicode NFC normalization.
     90      * Same as getInstance(NULL, "nfc", UNORM2_COMPOSE, errorCode).
     91      * Returns an unmodifiable singleton instance. Do not delete it.
     92      * @param errorCode Standard ICU error code. Its input value must
     93      *                  pass the U_SUCCESS() test, or else the function returns
     94      *                  immediately. Check for U_FAILURE() on output or use with
     95      *                  function chaining. (See User Guide for details.)
     96      * @return the requested Normalizer2, if successful
     97      * @stable ICU 49
     98      */
     99     static const Normalizer2 *
    100     getNFCInstance(UErrorCode &errorCode);
    101 
    102     /**
    103      * Returns a Normalizer2 instance for Unicode NFD normalization.
    104      * Same as getInstance(NULL, "nfc", UNORM2_DECOMPOSE, errorCode).
    105      * Returns an unmodifiable singleton instance. Do not delete it.
    106      * @param errorCode Standard ICU error code. Its input value must
    107      *                  pass the U_SUCCESS() test, or else the function returns
    108      *                  immediately. Check for U_FAILURE() on output or use with
    109      *                  function chaining. (See User Guide for details.)
    110      * @return the requested Normalizer2, if successful
    111      * @stable ICU 49
    112      */
    113     static const Normalizer2 *
    114     getNFDInstance(UErrorCode &errorCode);
    115 
    116     /**
    117      * Returns a Normalizer2 instance for Unicode NFKC normalization.
    118      * Same as getInstance(NULL, "nfkc", UNORM2_COMPOSE, errorCode).
    119      * Returns an unmodifiable singleton instance. Do not delete it.
    120      * @param errorCode Standard ICU error code. Its input value must
    121      *                  pass the U_SUCCESS() test, or else the function returns
    122      *                  immediately. Check for U_FAILURE() on output or use with
    123      *                  function chaining. (See User Guide for details.)
    124      * @return the requested Normalizer2, if successful
    125      * @stable ICU 49
    126      */
    127     static const Normalizer2 *
    128     getNFKCInstance(UErrorCode &errorCode);
    129 
    130     /**
    131      * Returns a Normalizer2 instance for Unicode NFKD normalization.
    132      * Same as getInstance(NULL, "nfkc", UNORM2_DECOMPOSE, errorCode).
    133      * Returns an unmodifiable singleton instance. Do not delete it.
    134      * @param errorCode Standard ICU error code. Its input value must
    135      *                  pass the U_SUCCESS() test, or else the function returns
    136      *                  immediately. Check for U_FAILURE() on output or use with
    137      *                  function chaining. (See User Guide for details.)
    138      * @return the requested Normalizer2, if successful
    139      * @stable ICU 49
    140      */
    141     static const Normalizer2 *
    142     getNFKDInstance(UErrorCode &errorCode);
    143 
    144     /**
    145      * Returns a Normalizer2 instance for Unicode NFKC_Casefold normalization.
    146      * Same as getInstance(NULL, "nfkc_cf", UNORM2_COMPOSE, errorCode).
    147      * Returns an unmodifiable singleton instance. Do not delete it.
    148      * @param errorCode Standard ICU error code. Its input value must
    149      *                  pass the U_SUCCESS() test, or else the function returns
    150      *                  immediately. Check for U_FAILURE() on output or use with
    151      *                  function chaining. (See User Guide for details.)
    152      * @return the requested Normalizer2, if successful
    153      * @stable ICU 49
    154      */
    155     static const Normalizer2 *
    156     getNFKCCasefoldInstance(UErrorCode &errorCode);
    157 
    158     /**
    159      * Returns a Normalizer2 instance which uses the specified data file
    160      * (packageName/name similar to ucnv_openPackage() and ures_open()/ResourceBundle)
    161      * and which composes or decomposes text according to the specified mode.
    162      * Returns an unmodifiable singleton instance. Do not delete it.
    163      *
    164      * Use packageName=NULL for data files that are part of ICU's own data.
    165      * Use name="nfc" and UNORM2_COMPOSE/UNORM2_DECOMPOSE for Unicode standard NFC/NFD.
    166      * Use name="nfkc" and UNORM2_COMPOSE/UNORM2_DECOMPOSE for Unicode standard NFKC/NFKD.
    167      * Use name="nfkc_cf" and UNORM2_COMPOSE for Unicode standard NFKC_CF=NFKC_Casefold.
    168      *
    169      * @param packageName NULL for ICU built-in data, otherwise application data package name
    170      * @param name "nfc" or "nfkc" or "nfkc_cf" or name of custom data file
    171      * @param mode normalization mode (compose or decompose etc.)
    172      * @param errorCode Standard ICU error code. Its input value must
    173      *                  pass the U_SUCCESS() test, or else the function returns
    174      *                  immediately. Check for U_FAILURE() on output or use with
    175      *                  function chaining. (See User Guide for details.)
    176      * @return the requested Normalizer2, if successful
    177      * @stable ICU 4.4
    178      */
    179     static const Normalizer2 *
    180     getInstance(const char *packageName,
    181                 const char *name,
    182                 UNormalization2Mode mode,
    183                 UErrorCode &errorCode);
    184 
    185     /**
    186      * Returns the normalized form of the source string.
    187      * @param src source string
    188      * @param errorCode Standard ICU error code. Its input value must
    189      *                  pass the U_SUCCESS() test, or else the function returns
    190      *                  immediately. Check for U_FAILURE() on output or use with
    191      *                  function chaining. (See User Guide for details.)
    192      * @return normalized src
    193      * @stable ICU 4.4
    194      */
    195     UnicodeString
    196     normalize(const UnicodeString &src, UErrorCode &errorCode) const {
    197         UnicodeString result;
    198         normalize(src, result, errorCode);
    199         return result;
    200     }
    201     /**
    202      * Writes the normalized form of the source string to the destination string
    203      * (replacing its contents) and returns the destination string.
    204      * The source and destination strings must be different objects.
    205      * @param src source string
    206      * @param dest destination string; its contents is replaced with normalized src
    207      * @param errorCode Standard ICU error code. Its input value must
    208      *                  pass the U_SUCCESS() test, or else the function returns
    209      *                  immediately. Check for U_FAILURE() on output or use with
    210      *                  function chaining. (See User Guide for details.)
    211      * @return dest
    212      * @stable ICU 4.4
    213      */
    214     virtual UnicodeString &
    215     normalize(const UnicodeString &src,
    216               UnicodeString &dest,
    217               UErrorCode &errorCode) const = 0;
    218     /**
    219      * Appends the normalized form of the second string to the first string
    220      * (merging them at the boundary) and returns the first string.
    221      * The result is normalized if the first string was normalized.
    222      * The first and second strings must be different objects.
    223      * @param first string, should be normalized
    224      * @param second string, will be normalized
    225      * @param errorCode Standard ICU error code. Its input value must
    226      *                  pass the U_SUCCESS() test, or else the function returns
    227      *                  immediately. Check for U_FAILURE() on output or use with
    228      *                  function chaining. (See User Guide for details.)
    229      * @return first
    230      * @stable ICU 4.4
    231      */
    232     virtual UnicodeString &
    233     normalizeSecondAndAppend(UnicodeString &first,
    234                              const UnicodeString &second,
    235                              UErrorCode &errorCode) const = 0;
    236     /**
    237      * Appends the second string to the first string
    238      * (merging them at the boundary) and returns the first string.
    239      * The result is normalized if both the strings were normalized.
    240      * The first and second strings must be different objects.
    241      * @param first string, should be normalized
    242      * @param second string, should be normalized
    243      * @param errorCode Standard ICU error code. Its input value must
    244      *                  pass the U_SUCCESS() test, or else the function returns
    245      *                  immediately. Check for U_FAILURE() on output or use with
    246      *                  function chaining. (See User Guide for details.)
    247      * @return first
    248      * @stable ICU 4.4
    249      */
    250     virtual UnicodeString &
    251     append(UnicodeString &first,
    252            const UnicodeString &second,
    253            UErrorCode &errorCode) const = 0;
    254 
    255     /**
    256      * Gets the decomposition mapping of c.
    257      * Roughly equivalent to normalizing the String form of c
    258      * on a UNORM2_DECOMPOSE Normalizer2 instance, but much faster, and except that this function
    259      * returns FALSE and does not write a string
    260      * if c does not have a decomposition mapping in this instance's data.
    261      * This function is independent of the mode of the Normalizer2.
    262      * @param c code point
    263      * @param decomposition String object which will be set to c's
    264      *                      decomposition mapping, if there is one.
    265      * @return TRUE if c has a decomposition, otherwise FALSE
    266      * @stable ICU 4.6
    267      */
    268     virtual UBool
    269     getDecomposition(UChar32 c, UnicodeString &decomposition) const = 0;
    270 
    271     /**
    272      * Gets the raw decomposition mapping of c.
    273      *
    274      * This is similar to the getDecomposition() method but returns the
    275      * raw decomposition mapping as specified in UnicodeData.txt or
    276      * (for custom data) in the mapping files processed by the gennorm2 tool.
    277      * By contrast, getDecomposition() returns the processed,
    278      * recursively-decomposed version of this mapping.
    279      *
    280      * When used on a standard NFKC Normalizer2 instance,
    281      * getRawDecomposition() returns the Unicode Decomposition_Mapping (dm) property.
    282      *
    283      * When used on a standard NFC Normalizer2 instance,
    284      * it returns the Decomposition_Mapping only if the Decomposition_Type (dt) is Canonical (Can);
    285      * in this case, the result contains either one or two code points (=1..4 UChars).
    286      *
    287      * This function is independent of the mode of the Normalizer2.
    288      * The default implementation returns FALSE.
    289      * @param c code point
    290      * @param decomposition String object which will be set to c's
    291      *                      raw decomposition mapping, if there is one.
    292      * @return TRUE if c has a decomposition, otherwise FALSE
    293      * @stable ICU 49
    294      */
    295     virtual UBool
    296     getRawDecomposition(UChar32 c, UnicodeString &decomposition) const;
    297 
    298     /**
    299      * Performs pairwise composition of a & b and returns the composite if there is one.
    300      *
    301      * Returns a composite code point c only if c has a two-way mapping to a+b.
    302      * In standard Unicode normalization, this means that
    303      * c has a canonical decomposition to a+b
    304      * and c does not have the Full_Composition_Exclusion property.
    305      *
    306      * This function is independent of the mode of the Normalizer2.
    307      * The default implementation returns a negative value.
    308      * @param a A (normalization starter) code point.
    309      * @param b Another code point.
    310      * @return The non-negative composite code point if there is one; otherwise a negative value.
    311      * @stable ICU 49
    312      */
    313     virtual UChar32
    314     composePair(UChar32 a, UChar32 b) const;
    315 
    316     /**
    317      * Gets the combining class of c.
    318      * The default implementation returns 0
    319      * but all standard implementations return the Unicode Canonical_Combining_Class value.
    320      * @param c code point
    321      * @return c's combining class
    322      * @stable ICU 49
    323      */
    324     virtual uint8_t
    325     getCombiningClass(UChar32 c) const;
    326 
    327     /**
    328      * Tests if the string is normalized.
    329      * Internally, in cases where the quickCheck() method would return "maybe"
    330      * (which is only possible for the two COMPOSE modes) this method
    331      * resolves to "yes" or "no" to provide a definitive result,
    332      * at the cost of doing more work in those cases.
    333      * @param s input string
    334      * @param errorCode Standard ICU error code. Its input value must
    335      *                  pass the U_SUCCESS() test, or else the function returns
    336      *                  immediately. Check for U_FAILURE() on output or use with
    337      *                  function chaining. (See User Guide for details.)
    338      * @return TRUE if s is normalized
    339      * @stable ICU 4.4
    340      */
    341     virtual UBool
    342     isNormalized(const UnicodeString &s, UErrorCode &errorCode) const = 0;
    343 
    344     /**
    345      * Tests if the string is normalized.
    346      * For the two COMPOSE modes, the result could be "maybe" in cases that
    347      * would take a little more work to resolve definitively.
    348      * Use spanQuickCheckYes() and normalizeSecondAndAppend() for a faster
    349      * combination of quick check + normalization, to avoid
    350      * re-checking the "yes" prefix.
    351      * @param s input string
    352      * @param errorCode Standard ICU error code. Its input value must
    353      *                  pass the U_SUCCESS() test, or else the function returns
    354      *                  immediately. Check for U_FAILURE() on output or use with
    355      *                  function chaining. (See User Guide for details.)
    356      * @return UNormalizationCheckResult
    357      * @stable ICU 4.4
    358      */
    359     virtual UNormalizationCheckResult
    360     quickCheck(const UnicodeString &s, UErrorCode &errorCode) const = 0;
    361 
    362     /**
    363      * Returns the end of the normalized substring of the input string.
    364      * In other words, with <code>end=spanQuickCheckYes(s, ec);</code>
    365      * the substring <code>UnicodeString(s, 0, end)</code>
    366      * will pass the quick check with a "yes" result.
    367      *
    368      * The returned end index is usually one or more characters before the
    369      * "no" or "maybe" character: The end index is at a normalization boundary.
    370      * (See the class documentation for more about normalization boundaries.)
    371      *
    372      * When the goal is a normalized string and most input strings are expected
    373      * to be normalized already, then call this method,
    374      * and if it returns a prefix shorter than the input string,
    375      * copy that prefix and use normalizeSecondAndAppend() for the remainder.
    376      * @param s input string
    377      * @param errorCode Standard ICU error code. Its input value must
    378      *                  pass the U_SUCCESS() test, or else the function returns
    379      *                  immediately. Check for U_FAILURE() on output or use with
    380      *                  function chaining. (See User Guide for details.)
    381      * @return "yes" span end index
    382      * @stable ICU 4.4
    383      */
    384     virtual int32_t
    385     spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const = 0;
    386 
    387     /**
    388      * Tests if the character always has a normalization boundary before it,
    389      * regardless of context.
    390      * If true, then the character does not normalization-interact with
    391      * preceding characters.
    392      * In other words, a string containing this character can be normalized
    393      * by processing portions before this character and starting from this
    394      * character independently.
    395      * This is used for iterative normalization. See the class documentation for details.
    396      * @param c character to test
    397      * @return TRUE if c has a normalization boundary before it
    398      * @stable ICU 4.4
    399      */
    400     virtual UBool hasBoundaryBefore(UChar32 c) const = 0;
    401 
    402     /**
    403      * Tests if the character always has a normalization boundary after it,
    404      * regardless of context.
    405      * If true, then the character does not normalization-interact with
    406      * following characters.
    407      * In other words, a string containing this character can be normalized
    408      * by processing portions up to this character and after this
    409      * character independently.
    410      * This is used for iterative normalization. See the class documentation for details.
    411      * Note that this operation may be significantly slower than hasBoundaryBefore().
    412      * @param c character to test
    413      * @return TRUE if c has a normalization boundary after it
    414      * @stable ICU 4.4
    415      */
    416     virtual UBool hasBoundaryAfter(UChar32 c) const = 0;
    417 
    418     /**
    419      * Tests if the character is normalization-inert.
    420      * If true, then the character does not change, nor normalization-interact with
    421      * preceding or following characters.
    422      * In other words, a string containing this character can be normalized
    423      * by processing portions before this character and after this
    424      * character independently.
    425      * This is used for iterative normalization. See the class documentation for details.
    426      * Note that this operation may be significantly slower than hasBoundaryBefore().
    427      * @param c character to test
    428      * @return TRUE if c is normalization-inert
    429      * @stable ICU 4.4
    430      */
    431     virtual UBool isInert(UChar32 c) const = 0;
    432 };
    433 
    434 /**
    435  * Normalization filtered by a UnicodeSet.
    436  * Normalizes portions of the text contained in the filter set and leaves
    437  * portions not contained in the filter set unchanged.
    438  * Filtering is done via UnicodeSet::span(..., USET_SPAN_SIMPLE).
    439  * Not-in-the-filter text is treated as "is normalized" and "quick check yes".
    440  * This class implements all of (and only) the Normalizer2 API.
    441  * An instance of this class is unmodifiable/immutable but is constructed and
    442  * must be destructed by the owner.
    443  * @stable ICU 4.4
    444  */
    445 class U_COMMON_API FilteredNormalizer2 : public Normalizer2 {
    446 public:
    447     /**
    448      * Constructs a filtered normalizer wrapping any Normalizer2 instance
    449      * and a filter set.
    450      * Both are aliased and must not be modified or deleted while this object
    451      * is used.
    452      * The filter set should be frozen; otherwise the performance will suffer greatly.
    453      * @param n2 wrapped Normalizer2 instance
    454      * @param filterSet UnicodeSet which determines the characters to be normalized
    455      * @stable ICU 4.4
    456      */
    457     FilteredNormalizer2(const Normalizer2 &n2, const UnicodeSet &filterSet) :
    458             norm2(n2), set(filterSet) {}
    459 
    460     /**
    461      * Destructor.
    462      * @stable ICU 4.4
    463      */
    464     ~FilteredNormalizer2();
    465 
    466     /**
    467      * Writes the normalized form of the source string to the destination string
    468      * (replacing its contents) and returns the destination string.
    469      * The source and destination strings must be different objects.
    470      * @param src source string
    471      * @param dest destination string; its contents is replaced with normalized src
    472      * @param errorCode Standard ICU error code. Its input value must
    473      *                  pass the U_SUCCESS() test, or else the function returns
    474      *                  immediately. Check for U_FAILURE() on output or use with
    475      *                  function chaining. (See User Guide for details.)
    476      * @return dest
    477      * @stable ICU 4.4
    478      */
    479     virtual UnicodeString &
    480     normalize(const UnicodeString &src,
    481               UnicodeString &dest,
    482               UErrorCode &errorCode) const;
    483     /**
    484      * Appends the normalized form of the second string to the first string
    485      * (merging them at the boundary) and returns the first string.
    486      * The result is normalized if the first string was normalized.
    487      * The first and second strings must be different objects.
    488      * @param first string, should be normalized
    489      * @param second string, will be normalized
    490      * @param errorCode Standard ICU error code. Its input value must
    491      *                  pass the U_SUCCESS() test, or else the function returns
    492      *                  immediately. Check for U_FAILURE() on output or use with
    493      *                  function chaining. (See User Guide for details.)
    494      * @return first
    495      * @stable ICU 4.4
    496      */
    497     virtual UnicodeString &
    498     normalizeSecondAndAppend(UnicodeString &first,
    499                              const UnicodeString &second,
    500                              UErrorCode &errorCode) const;
    501     /**
    502      * Appends the second string to the first string
    503      * (merging them at the boundary) and returns the first string.
    504      * The result is normalized if both the strings were normalized.
    505      * The first and second strings must be different objects.
    506      * @param first string, should be normalized
    507      * @param second string, should be normalized
    508      * @param errorCode Standard ICU error code. Its input value must
    509      *                  pass the U_SUCCESS() test, or else the function returns
    510      *                  immediately. Check for U_FAILURE() on output or use with
    511      *                  function chaining. (See User Guide for details.)
    512      * @return first
    513      * @stable ICU 4.4
    514      */
    515     virtual UnicodeString &
    516     append(UnicodeString &first,
    517            const UnicodeString &second,
    518            UErrorCode &errorCode) const;
    519 
    520     /**
    521      * Gets the decomposition mapping of c.
    522      * For details see the base class documentation.
    523      *
    524      * This function is independent of the mode of the Normalizer2.
    525      * @param c code point
    526      * @param decomposition String object which will be set to c's
    527      *                      decomposition mapping, if there is one.
    528      * @return TRUE if c has a decomposition, otherwise FALSE
    529      * @stable ICU 4.6
    530      */
    531     virtual UBool
    532     getDecomposition(UChar32 c, UnicodeString &decomposition) const;
    533 
    534     /**
    535      * Gets the raw decomposition mapping of c.
    536      * For details see the base class documentation.
    537      *
    538      * This function is independent of the mode of the Normalizer2.
    539      * @param c code point
    540      * @param decomposition String object which will be set to c's
    541      *                      raw decomposition mapping, if there is one.
    542      * @return TRUE if c has a decomposition, otherwise FALSE
    543      * @stable ICU 49
    544      */
    545     virtual UBool
    546     getRawDecomposition(UChar32 c, UnicodeString &decomposition) const;
    547 
    548     /**
    549      * Performs pairwise composition of a & b and returns the composite if there is one.
    550      * For details see the base class documentation.
    551      *
    552      * This function is independent of the mode of the Normalizer2.
    553      * @param a A (normalization starter) code point.
    554      * @param b Another code point.
    555      * @return The non-negative composite code point if there is one; otherwise a negative value.
    556      * @stable ICU 49
    557      */
    558     virtual UChar32
    559     composePair(UChar32 a, UChar32 b) const;
    560 
    561     /**
    562      * Gets the combining class of c.
    563      * The default implementation returns 0
    564      * but all standard implementations return the Unicode Canonical_Combining_Class value.
    565      * @param c code point
    566      * @return c's combining class
    567      * @stable ICU 49
    568      */
    569     virtual uint8_t
    570     getCombiningClass(UChar32 c) const;
    571 
    572     /**
    573      * Tests if the string is normalized.
    574      * For details see the Normalizer2 base class documentation.
    575      * @param s input string
    576      * @param errorCode Standard ICU error code. Its input value must
    577      *                  pass the U_SUCCESS() test, or else the function returns
    578      *                  immediately. Check for U_FAILURE() on output or use with
    579      *                  function chaining. (See User Guide for details.)
    580      * @return TRUE if s is normalized
    581      * @stable ICU 4.4
    582      */
    583     virtual UBool
    584     isNormalized(const UnicodeString &s, UErrorCode &errorCode) const;
    585     /**
    586      * Tests if the string is normalized.
    587      * For details see the Normalizer2 base class documentation.
    588      * @param s input string
    589      * @param errorCode Standard ICU error code. Its input value must
    590      *                  pass the U_SUCCESS() test, or else the function returns
    591      *                  immediately. Check for U_FAILURE() on output or use with
    592      *                  function chaining. (See User Guide for details.)
    593      * @return UNormalizationCheckResult
    594      * @stable ICU 4.4
    595      */
    596     virtual UNormalizationCheckResult
    597     quickCheck(const UnicodeString &s, UErrorCode &errorCode) const;
    598     /**
    599      * Returns the end of the normalized substring of the input string.
    600      * For details see the Normalizer2 base class documentation.
    601      * @param s input string
    602      * @param errorCode Standard ICU error code. Its input value must
    603      *                  pass the U_SUCCESS() test, or else the function returns
    604      *                  immediately. Check for U_FAILURE() on output or use with
    605      *                  function chaining. (See User Guide for details.)
    606      * @return "yes" span end index
    607      * @stable ICU 4.4
    608      */
    609     virtual int32_t
    610     spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const;
    611 
    612     /**
    613      * Tests if the character always has a normalization boundary before it,
    614      * regardless of context.
    615      * For details see the Normalizer2 base class documentation.
    616      * @param c character to test
    617      * @return TRUE if c has a normalization boundary before it
    618      * @stable ICU 4.4
    619      */
    620     virtual UBool hasBoundaryBefore(UChar32 c) const;
    621 
    622     /**
    623      * Tests if the character always has a normalization boundary after it,
    624      * regardless of context.
    625      * For details see the Normalizer2 base class documentation.
    626      * @param c character to test
    627      * @return TRUE if c has a normalization boundary after it
    628      * @stable ICU 4.4
    629      */
    630     virtual UBool hasBoundaryAfter(UChar32 c) const;
    631 
    632     /**
    633      * Tests if the character is normalization-inert.
    634      * For details see the Normalizer2 base class documentation.
    635      * @param c character to test
    636      * @return TRUE if c is normalization-inert
    637      * @stable ICU 4.4
    638      */
    639     virtual UBool isInert(UChar32 c) const;
    640 private:
    641     UnicodeString &
    642     normalize(const UnicodeString &src,
    643               UnicodeString &dest,
    644               USetSpanCondition spanCondition,
    645               UErrorCode &errorCode) const;
    646 
    647     UnicodeString &
    648     normalizeSecondAndAppend(UnicodeString &first,
    649                              const UnicodeString &second,
    650                              UBool doNormalize,
    651                              UErrorCode &errorCode) const;
    652 
    653     const Normalizer2 &norm2;
    654     const UnicodeSet &set;
    655 };
    656 
    657 U_NAMESPACE_END
    658 
    659 #endif  // !UCONFIG_NO_NORMALIZATION
    660 #endif  // __NORMALIZER2_H__
    661