16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 1996-2011, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef CANITER_H
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CANITER_H
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_NORMALIZATION
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uobject.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: Canonical Iterator
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** Should permutation skip characters with combining class zero
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *  Should be either TRUE or FALSE. This is a compile time option
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *  @stable ICU 2.4
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef CANITER_SKIP_ZEROES
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CANITER_SKIP_ZEROES TRUE
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass Hashtable;
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass Normalizer2;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass Normalizer2Impl;
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This class allows one to iterate through all the strings that are canonically equivalent to a given
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * string. For example, here are some sample results:
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgResults for: {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA}
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org1: \\u0041\\u030A\\u0064\\u0307\\u0327
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA}
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org2: \\u0041\\u030A\\u0064\\u0327\\u0307
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D}{COMBINING CEDILLA}{COMBINING DOT ABOVE}
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org3: \\u0041\\u030A\\u1E0B\\u0327
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D WITH DOT ABOVE}{COMBINING CEDILLA}
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org4: \\u0041\\u030A\\u1E11\\u0307
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D WITH CEDILLA}{COMBINING DOT ABOVE}
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org5: \\u00C5\\u0064\\u0307\\u0327
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA}
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org6: \\u00C5\\u0064\\u0327\\u0307
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMBINING CEDILLA}{COMBINING DOT ABOVE}
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org7: \\u00C5\\u1E0B\\u0327
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D WITH DOT ABOVE}{COMBINING CEDILLA}
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org8: \\u00C5\\u1E11\\u0307
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D WITH CEDILLA}{COMBINING DOT ABOVE}
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org9: \\u212B\\u0064\\u0307\\u0327
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {ANGSTROM SIGN}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA}
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org10: \\u212B\\u0064\\u0327\\u0307
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {ANGSTROM SIGN}{LATIN SMALL LETTER D}{COMBINING CEDILLA}{COMBINING DOT ABOVE}
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org11: \\u212B\\u1E0B\\u0327
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {ANGSTROM SIGN}{LATIN SMALL LETTER D WITH DOT ABOVE}{COMBINING CEDILLA}
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org12: \\u212B\\u1E11\\u0307
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org = {ANGSTROM SIGN}{LATIN SMALL LETTER D WITH CEDILLA}{COMBINING DOT ABOVE}
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *<br>Note: the code is intended for use with small strings, and is not suitable for larger ones,
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * since it has not been optimized for that situation.
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Note, CanonicalIterator is not intended to be subclassed.
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @author M. Davis
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @author C++ port by V. Weinstein
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.4
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API CanonicalIterator : public UObject {
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Construct a CanonicalIterator object
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source    string to get results for
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status    Fill-in parameter which receives the status of this operation.
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CanonicalIterator(const UnicodeString &source, UErrorCode &status);
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /** Destructor
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  Cleans pieces
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~CanonicalIterator();
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the NFD form of the current source we are iterating over.
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return gets the source: NOTE: it is the NFD form of source
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString getSource();
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Resets the iterator so that one can start again from the beginning.
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void reset();
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Get the next canonically equivalent string.
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <br><b>Warning: The strings are not guaranteed to be in any particular order.</b>
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the next string that is canonically equivalent. A bogus string is returned when
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the iteration is done.
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString next();
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Set a new source for this iterator. Allows object reuse.
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param newSource     the source string to iterate against. This allows the same iterator to be used
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                     while changing the source string, saving object creation.
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status        Fill-in parameter which receives the status of this operation.
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void setSource(const UnicodeString &newSource, UErrorCode &status);
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Dumb recursive implementation of permutation.
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * TODO: optimize
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source     the string to find permutations for
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param skipZeros  determine if skip zeros
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result     the results in a set.
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status       Fill-in parameter which receives the status of this operation.
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void U_EXPORT2 permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status);
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_INTERNAL_API */
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * ICU "poor man's RTTI", returns a UClassID for this class.
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.2
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UClassID U_EXPORT2 getStaticClassID();
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * ICU "poor man's RTTI", returns a UClassID for the actual class.
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.2
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UClassID getDynamicClassID() const;
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // ===================== PRIVATES ==============================
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // private default constructor
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CanonicalIterator();
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Copy constructor. Private for now.
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CanonicalIterator(const CanonicalIterator& other);
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Assignment operator. Private for now.
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CanonicalIterator& operator=(const CanonicalIterator& other);
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // fields
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString source;
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool done;
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // 2 dimensional array holds the pieces of the string with
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // their different canonically equivalent representations
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString **pieces;
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t pieces_length;
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t *pieces_lengths;
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // current is used in iterating to combine pieces
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t *current;
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t current_length;
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // transient fields
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString buffer;
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const Normalizer2 &nfd;
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const Normalizer2Impl &nfcImpl;
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // we have a segment, in NFD. Find all the strings that are canonically equivalent to it.
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status); //private String[] getEquivalents(String segment)
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //Set getEquivalents2(String segment);
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Hashtable *getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status);
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //Hashtable *getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status);
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See if the decomposition of cp2 is at segment starting at segmentPos
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (with canonical rearrangment!)
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If so, take the remainder, and return the equivalents
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //Set extract(int comp, String segment, int segmentPos, StringBuffer buffer);
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status);
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //Hashtable *extract(UChar32 comp, const UnicodeString &segment, int32_t segLen, int32_t segmentPos, UErrorCode &status);
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void cleanPieces();
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_NORMALIZATION */
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
209