16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1999-2013, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date        Name        Description
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   11/17/99    aliu        Creation.
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef TRANSLIT_H
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TRANSLIT_H
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: Tranforms text from one format to another.
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_TRANSLITERATION
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uobject.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/parseerr.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utrans.h" // UTransPosition, UTransDirection
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/strenum.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass UnicodeFilter;
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass UnicodeSet;
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass CompoundTransliterator;
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TransliteratorParser;
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass NormalizationTransliterator;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TransliteratorIDParser;
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>Transliterator</code> is an abstract class that
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterates text from one format to another.  The most common
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * kind of transliterator is a script, or alphabet, transliterator.
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For example, a Russian to Latin transliterator changes Russian text
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * written in Cyrillic characters to phonetically equivalent Latin
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * characters.  It does not <em>translate</em> Russian to English!
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Transliteration, unlike translation, operates on characters, without
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * reference to the meanings of words and sentences.
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Although script conversion is its most common use, a
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterator can actually perform a more general class of tasks.
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * In fact, <code>Transliterator</code> defines a very general API
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which specifies only that a segment of the input text is replaced
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * by new text.  The particulars of this conversion are determined
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * entirely by subclasses of <code>Transliterator</code>.
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Transliterators are stateless</b>
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><code>Transliterator</code> objects are <em>stateless</em>; they
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * retain no information between calls to
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>transliterate()</code>.  (However, this does <em>not</em>
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * mean that threads may share transliterators without synchronizing
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * them.  Transliterators are not immutable, so they must be
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * synchronized when shared between threads.)  This might seem to
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * limit the complexity of the transliteration operation.  In
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * practice, subclasses perform complex transliterations by delaying
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the replacement of text until it is known that no other
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * replacements are possible.  In other words, although the
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>Transliterator</code> objects are stateless, the source text
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * itself embodies all the needed information, and delayed operation
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * allows arbitrary complexity.
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Batch transliteration</b>
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The simplest way to perform transliteration is all at once, on a
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * string of existing text.  This is referred to as <em>batch</em>
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliteration.  For example, given a string <code>input</code>
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and a transliterator <code>t</code>, the call
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \htmlonly<blockquote>\endhtmlonly<code>String result = t.transliterate(input);
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </code>\htmlonly</blockquote>\endhtmlonly
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * will transliterate it and return the result.  Other methods allow
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the client to specify a substring to be transliterated and to use
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * {@link Replaceable } objects instead of strings, in order to
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * preserve out-of-band information (such as text styles).
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Keyboard transliteration</b>
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Somewhat more involved is <em>keyboard</em>, or incremental
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliteration.  This is the transliteration of text that is
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * arriving from some source (typically the user's keyboard) one
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * character at a time, or in some other piecemeal fashion.
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>In keyboard transliteration, a <code>Replaceable</code> buffer
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * stores the text.  As text is inserted, as much as possible is
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterated on the fly.  This means a GUI that displays the
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * contents of the buffer may show text being modified as each new
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * character arrives.
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Consider the simple <code>RuleBasedTransliterator</code>:
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \htmlonly<blockquote>\endhtmlonly<code>
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * th&gt;{theta}<br>
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * t&gt;{tau}
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </code>\htmlonly</blockquote>\endhtmlonly
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * When the user types 't', nothing will happen, since the
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterator is waiting to see if the next character is 'h'.  To
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * remedy this, we introduce the notion of a cursor, marked by a '|'
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in the output string:
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \htmlonly<blockquote>\endhtmlonly<code>
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * t&gt;|{tau}<br>
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * {tau}h&gt;{theta}
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </code>\htmlonly</blockquote>\endhtmlonly
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Now when the user types 't', tau appears, and if the next character
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is 'h', the tau changes to a theta.  This is accomplished by
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * maintaining a cursor position (independent of the insertion point,
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and invisible in the GUI) across calls to
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>transliterate()</code>.  Typically, the cursor will
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * be coincident with the insertion point, but in a case like the one
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * above, it will precede the insertion point.
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Keyboard transliteration methods maintain a set of three indices
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that are updated with each call to
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>transliterate()</code>, including the cursor, start,
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and limit.  Since these indices are changed by the method, they are
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * passed in an <code>int[]</code> array. The <code>START</code> index
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * marks the beginning of the substring that the transliterator will
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * look at.  It is advanced as text becomes committed (but it is not
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the committed index; that's the <code>CURSOR</code>).  The
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>CURSOR</code> index, described above, marks the point at
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which the transliterator last stopped, either because it reached
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the end, or because it required more characters to disambiguate
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * between possible inputs.  The <code>CURSOR</code> can also be
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * explicitly set by rules in a <code>RuleBasedTransliterator</code>.
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Any characters before the <code>CURSOR</code> index are frozen;
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * future keyboard transliteration calls within this input sequence
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * will not change them.  New text is inserted at the
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>LIMIT</code> index, which marks the end of the substring that
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the transliterator looks at.
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Because keyboard transliteration assumes that more characters
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * are to arrive, it is conservative in its operation.  It only
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterates when it can do so unambiguously.  Otherwise it waits
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for more characters to arrive.  When the client code knows that no
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * more characters are forthcoming, perhaps because the user has
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * performed some input termination operation, then it should call
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>finishTransliteration()</code> to complete any
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pending transliterations.
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Inverses</b>
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Pairs of transliterators may be inverses of one another.  For
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * example, if transliterator <b>A</b> transliterates characters by
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * incrementing their Unicode value (so "abc" -> "def"), and
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterator <b>B</b> decrements character values, then <b>A</b>
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is an inverse of <b>B</b> and vice versa.  If we compose <b>A</b>
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with <b>B</b> in a compound transliterator, the result is the
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * indentity transliterator, that is, a transliterator that does not
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * change its input text.
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The <code>Transliterator</code> method <code>getInverse()</code>
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * returns a transliterator's inverse, if one exists, or
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>null</code> otherwise.  However, the result of
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>getInverse()</code> usually will <em>not</em> be a true
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * mathematical inverse.  This is because true inverse transliterators
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * are difficult to formulate.  For example, consider two
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterators: <b>AB</b>, which transliterates the character 'A'
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to 'B', and <b>BA</b>, which transliterates 'B' to 'A'.  It might
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * seem that these are exact inverses, since
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \htmlonly<blockquote>\endhtmlonly"A" x <b>AB</b> -> "B"<br>
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "B" x <b>BA</b> -> "A"\htmlonly</blockquote>\endhtmlonly
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * where 'x' represents transliteration.  However,
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \htmlonly<blockquote>\endhtmlonly"ABCD" x <b>AB</b> -> "BBCD"<br>
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "BBCD" x <b>BA</b> -> "AACD"\htmlonly</blockquote>\endhtmlonly
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * so <b>AB</b> composed with <b>BA</b> is not the
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * identity. Nonetheless, <b>BA</b> may be usefully considered to be
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <b>AB</b>'s inverse, and it is on this basis that
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <b>AB</b><code>.getInverse()</code> could legitimately return
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <b>BA</b>.
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>IDs and display names</b>
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>A transliterator is designated by a short identifier string or
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <em>ID</em>.  IDs follow the format <em>source-destination</em>,
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * where <em>source</em> describes the entity being replaced, and
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <em>destination</em> describes the entity replacing
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <em>source</em>.  The entities may be the names of scripts,
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * particular sequences of characters, or whatever else it is that the
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterator converts to or from.  For example, a transliterator
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * from Russian to Latin might be named "Russian-Latin".  A
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterator from keyboard escape sequences to Latin-1 characters
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * might be named "KeyboardEscape-Latin1".  By convention, system
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * entity names are in English, with the initial letters of words
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * capitalized; user entity names may follow any format so long as
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * they do not contain dashes.
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>In addition to programmatic IDs, transliterator objects have
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * display names for presentation in user interfaces, returned by
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * {@link #getDisplayName }.
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Factory methods and registration</b>
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>In general, client code should use the factory method
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * {@link #createInstance } to obtain an instance of a
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transliterator given its ID.  Valid IDs may be enumerated using
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>getAvailableIDs()</code>.  Since transliterators are mutable,
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * multiple calls to {@link #createInstance } with the same ID will
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * return distinct objects.
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>In addition to the system transliterators registered at startup,
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * user transliterators may be registered by calling
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>registerInstance()</code> at run time.  A registered instance
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * acts a template; future calls to {@link #createInstance } with the ID
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of the registered object return clones of that object.  Thus any
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * object passed to <tt>registerInstance()</tt> must implement
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tt>clone()</tt> propertly.  To register a transliterator subclass
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * without instantiating it (until it is needed), users may call
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * {@link #registerFactory }.  In this case, the objects are
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * instantiated by invoking the zero-argument public constructor of
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the class.
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Subclassing</b>
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Subclasses must implement the abstract method
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>handleTransliterate()</code>.  <p>Subclasses should override
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the <code>transliterate()</code> method taking a
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>Replaceable</code> and the <code>transliterate()</code>
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * method taking a <code>String</code> and <code>StringBuffer</code>
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * if the performance of these methods can be improved over the
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * performance obtained by the default implementations in this class.
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @author Alan Liu
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.0
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_I18N_API Transliterator : public UObject {
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Programmatic name, e.g., "Latin-Arabic".
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString ID;
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This transliterator's filter.  Any character for which
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <tt>filter.contains()</tt> returns <tt>false</tt> will not be
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * altered by this transliterator.  If <tt>filter</tt> is
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <tt>null</tt> then no filtering is applied.
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeFilter* filter;
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t maximumContextLength;
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A context integer or pointer for a factory function, passed by
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * value.
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    union Token {
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * This token, interpreted as a 32-bit integer.
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.4
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t integer;
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * This token, interpreted as a native pointer.
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.4
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        void*   pointer;
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return a token containing an integer.
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a token containing an integer.
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline static Token integerToken(int32_t);
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return a token containing a pointer.
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a token containing a pointer.
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline static Token pointerToken(void*);
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_INTERNAL_API */
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A function that creates and returns a Transliterator.  When
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * invoked, it will be passed the ID string that is being
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * instantiated, together with the context pointer that was passed
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * in when the factory function was first registered.  Many
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * factory functions will ignore both parameters, however,
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * functions that are registered to more than one ID may use the
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * ID or the context parameter to parameterize the transliterator
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * they create.
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ID      the string identifier for this transliterator
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param context a context pointer that will be stored and
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                later passed to the factory function when an ID matching
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                the registration ID is being instantiated with this factory.
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    typedef Transliterator* (U_EXPORT2 *Factory)(const UnicodeString& ID, Token context);
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected:
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Default constructor.
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ID the string identifier for this transliterator
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param adoptedFilter the filter.  Any character for which
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <tt>filter.contains()</tt> returns <tt>false</tt> will not be
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * altered by this transliterator.  If <tt>filter</tt> is
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <tt>null</tt> then no filtering is applied.
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Copy constructor.
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Transliterator(const Transliterator&);
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Assignment operator.
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Transliterator& operator=(const Transliterator&);
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Create a transliterator from a basic ID.  This is an ID
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * containing only the forward direction source, target, and
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * variant.
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param id a basic ID of the form S-T or S-T/V.
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param canon canonical ID to assign to the object, or
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * NULL to leave the ID unchanged
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a newly created Transliterator or null if the ID is
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * invalid.
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Transliterator* createBasicInstance(const UnicodeString& id,
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               const UnicodeString* canon);
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    friend class TransliteratorParser; // for parseID()
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    friend class TransliteratorIDParser; // for createBasicInstance()
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    friend class TransliteratorAlias; // for setID()
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Destructor.
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~Transliterator();
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Implements Cloneable.
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * All subclasses are encouraged to implement this method if it is
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * possible and reasonable to do so.  Subclasses that are to be
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * registered with the system using <tt>registerInstance()</tt>
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * are required to implement this method.  If a subclass does not
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * implement clone() properly and is registered with the system
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * using registerInstance(), then the default clone() implementation
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * will return null, and calls to createInstance() will fail.
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a copy of the object.
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #registerInstance
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual Transliterator* clone() const;
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Transliterates a segment of a string, with optional filtering.
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the string to be transliterated
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start the beginning index, inclusive; <code>0 <= start
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <= limit</code>.
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param limit the ending index, exclusive; <code>start <= limit
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <= text.length()</code>.
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return The new limit index.  The text previously occupying <code>[start,
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * limit)</code> has been transliterated, possibly to a string of a different
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * length, at <code>[start, </code><em>new-limit</em><code>)</code>, where
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <em>new-limit</em> is the return value. If the input offsets are out of bounds,
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the returned value is -1 and the input string remains unchanged.
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t transliterate(Replaceable& text,
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  int32_t start, int32_t limit) const;
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Transliterates an entire string in place. Convenience method.
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the string to be transliterated
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void transliterate(Replaceable& text) const;
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Transliterates the portion of the text buffer that can be
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterated unambiguosly after new text has been inserted,
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * typically as a result of a keyboard event.  The new text in
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>insertion</code> will be inserted into <code>text</code>
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * at <code>index.limit</code>, advancing
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.limit</code> by <code>insertion.length()</code>.
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Then the transliterator will try to transliterate characters of
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>text</code> between <code>index.cursor</code> and
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.limit</code>.  Characters before
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.cursor</code> will not be changed.
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>Upon return, values in <code>index</code> will be updated.
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.start</code> will be advanced to the first
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * character that future calls to this method will read.
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.cursor</code> and <code>index.limit</code> will
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * be adjusted to delimit the range of text that future calls to
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this method may change.
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>Typical usage of this method begins with an initial call
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * with <code>index.start</code> and <code>index.limit</code>
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * set to indicate the portion of <code>text</code> to be
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterated, and <code>index.cursor == index.start</code>.
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Thereafter, <code>index</code> can be used without
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * modification in future calls, provided that all changes to
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>text</code> are made via this method.
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>This method assumes that future calls may be made that will
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * insert new text into the buffer.  As a result, it only performs
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * unambiguous transliterations.  After the last call to this
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * method, there may be untransliterated text that is waiting for
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * more input to resolve an ambiguity.  In order to perform these
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * pending transliterations, clients should call {@link
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * #finishTransliteration } after the last call to this
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * method has been made.
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the buffer holding transliterated and untransliterated text
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index an array of three integers.
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <ul><li><code>index.start</code>: the beginning index,
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * inclusive; <code>0 <= index.start <= index.limit</code>.
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <li><code>index.limit</code>: the ending index, exclusive;
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.start <= index.limit <= text.length()</code>.
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>insertion</code> is inserted at
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.limit</code>.
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <li><code>index.cursor</code>: the next character to be
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * considered for transliteration; <code>index.start <=
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * index.cursor <= index.limit</code>.  Characters before
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.cursor</code> will not be changed by future calls
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to this method.</ul>
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param insertion text to be inserted and possibly
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterated into the translation buffer at
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.limit</code>.  If <code>null</code> then no text
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is inserted.
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status    Output param to filled in with a success or an error.
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #handleTransliterate
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @exception IllegalArgumentException if <code>index</code>
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is invalid
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see UTransPosition
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void transliterate(Replaceable& text, UTransPosition& index,
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               const UnicodeString& insertion,
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               UErrorCode& status) const;
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Transliterates the portion of the text buffer that can be
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterated unambiguosly after a new character has been
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * inserted, typically as a result of a keyboard event.  This is a
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * convenience method.
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the buffer holding transliterated and
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * untransliterated text
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index an array of three integers.
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param insertion text to be inserted and possibly
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterated into the translation buffer at
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.limit</code>.
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status    Output param to filled in with a success or an error.
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void transliterate(Replaceable& text, UTransPosition& index,
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               UChar32 insertion,
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               UErrorCode& status) const;
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Transliterates the portion of the text buffer that can be
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterated unambiguosly.  This is a convenience method; see
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * {@link
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const }
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * for details.
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the buffer holding transliterated and
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * untransliterated text
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index an array of three integers.  See {@link #transliterate(Replaceable&, UTransPosition&, const UnicodeString*, UErrorCode&) const }.
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status    Output param to filled in with a success or an error.
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #transliterate(Replaceable, int[], String)
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void transliterate(Replaceable& text, UTransPosition& index,
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               UErrorCode& status) const;
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Finishes any pending transliterations that were waiting for
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * more characters.  Clients should call this method as the last
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * call after a sequence of one or more calls to
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>transliterate()</code>.
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the buffer holding transliterated and
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * untransliterated text.
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index the array of indices previously passed to {@link
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * #transliterate }
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void finishTransliteration(Replaceable& text,
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       UTransPosition& index) const;
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This internal method does incremental transliteration.  If the
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 'insertion' is non-null then we append it to 'text' before
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * proceeding.  This method calls through to the pure virtual
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * framework method handleTransliterate() to do the actual
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * work.
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the buffer holding transliterated and
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * untransliterated text
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index an array of three integers.  See {@link
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * #transliterate(Replaceable, int[], String)}.
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param insertion text to be inserted and possibly
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterated into the translation buffer at
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>index.limit</code>.
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status    Output param to filled in with a success or an error.
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void _transliterate(Replaceable& text,
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        UTransPosition& index,
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        const UnicodeString* insertion,
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        UErrorCode &status) const;
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected:
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Abstract method that concrete subclasses define to implement
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * their transliteration algorithm.  This method handles both
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * incremental and non-incremental transliteration.  Let
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>originalStart</code> refer to the value of
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>pos.start</code> upon entry.
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <ul>
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <li>If <code>incremental</code> is false, then this method
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  should transliterate all characters between
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code>pos.start</code> and <code>pos.limit</code>. Upon return
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code>pos.start</code> must == <code> pos.limit</code>.</li>
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <li>If <code>incremental</code> is true, then this method
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  should transliterate all characters between
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code>pos.start</code> and <code>pos.limit</code> that can be
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  unambiguously transliterated, regardless of future insertions
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  of text at <code>pos.limit</code>.  Upon return,
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code>pos.start</code> should be in the range
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  [<code>originalStart</code>, <code>pos.limit</code>).
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code>pos.start</code> should be positioned such that
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  characters [<code>originalStart</code>, <code>
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  pos.start</code>) will not be changed in the future by this
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  transliterator and characters [<code>pos.start</code>,
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code>pos.limit</code>) are unchanged.</li>
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * </ul>
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>Implementations of this method should also obey the
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * following invariants:</p>
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <ul>
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <li> <code>pos.limit</code> and <code>pos.contextLimit</code>
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  should be updated to reflect changes in length of the text
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  between <code>pos.start</code> and <code>pos.limit</code>. The
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  difference <code> pos.contextLimit - pos.limit</code> should
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  not change.</li>
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <li><code>pos.contextStart</code> should not change.</li>
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <li>Upon return, neither <code>pos.start</code> nor
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code>pos.limit</code> should be less than
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code>originalStart</code>.</li>
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <li>Text before <code>originalStart</code> and text after
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code>pos.limit</code> should not change.</li>
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <li>Text before <code>pos.contextStart</code> and text after
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  <code> pos.contextLimit</code> should be ignored.</li>
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * </ul>
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>Subclasses may safely assume that all characters in
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * [<code>pos.start</code>, <code>pos.limit</code>) are filtered.
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * In other words, the filter has already been applied by the time
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this method is called.  See
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>filteredTransliterate()</code>.
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>This method is <b>not</b> for public consumption.  Calling
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this method directly will transliterate
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * [<code>pos.start</code>, <code>pos.limit</code>) without
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * applying the filter. End user code should call <code>
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterate()</code> instead of this method. Subclass code
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and wrapping transliterators should call
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>filteredTransliterate()</code> instead of this method.<p>
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the buffer holding transliterated and
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * untransliterated text
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pos the indices indicating the start, limit, context
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * start, and context limit of the text.
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param incremental if true, assume more text may be inserted at
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>pos.limit</code> and act accordingly.  Otherwise,
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterate all text between <code>pos.start</code> and
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>pos.limit</code> and move <code>pos.start</code> up to
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>pos.limit</code>.
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #transliterate
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void handleTransliterate(Replaceable& text,
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     UTransPosition& pos,
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     UBool incremental) const = 0;
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Transliterate a substring of text, as specified by index, taking filters
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * into account.  This method is for subclasses that need to delegate to
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * another transliterator, such as CompoundTransliterator.
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the text to be transliterated
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index the position indices
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param incremental if TRUE, then assume more characters may be inserted
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * at index.limit, and postpone processing to accomodate future incoming
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * characters
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void filteredTransliterate(Replaceable& text,
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       UTransPosition& index,
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       UBool incremental) const;
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Top-level transliteration method, handling filtering, incremental and
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * non-incremental transliteration, and rollback.  All transliteration
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * public API methods eventually call this method with a rollback argument
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of TRUE.  Other entities may call this method but rollback should be
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * FALSE.
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>If this transliterator has a filter, break up the input text into runs
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of unfiltered characters.  Pass each run to
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * subclass.handleTransliterate().
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>In incremental mode, if rollback is TRUE, perform a special
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * incremental procedure in which several passes are made over the input
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * text, adding one character at a time, and committing successful
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterations as they occur.  Unsuccessful transliterations are rolled
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * back and retried with additional characters to give correct results.
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the text to be transliterated
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index the position indices
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param incremental if TRUE, then assume more characters may be inserted
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * at index.limit, and postpone processing to accomodate future incoming
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * characters
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param rollback if TRUE and if incremental is TRUE, then perform special
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * incremental processing, as described above, and undo partial
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterations where necessary.  If incremental is FALSE then this
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * parameter is ignored.
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void filteredTransliterate(Replaceable& text,
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       UTransPosition& index,
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       UBool incremental,
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       UBool rollback) const;
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the length of the longest context required by this transliterator.
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This is <em>preceding</em> context.  The default implementation supplied
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * by <code>Transliterator</code> returns zero; subclasses
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * that use preceding context should override this method to return the
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * correct value.  For example, if a transliterator translates "ddd" (where
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * d is any digit) to "555" when preceded by "(ddd)", then the preceding
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * context length is 5, the length of "(ddd)".
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return The maximum number of preceding context characters this
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterator needs to examine
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t getMaximumContextLength(void) const;
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected:
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Method for subclasses to use to set the maximum context length.
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param maxContextLength the new value to be set.
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getMaximumContextLength
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void setMaximumContextLength(int32_t maxContextLength);
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a programmatic identifier for this transliterator.
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If this identifier is passed to <code>createInstance()</code>, it
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * will return this object, if it has been registered.
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a programmatic identifier for this transliterator.
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #registerInstance
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #registerFactory
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getAvailableIDs
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual const UnicodeString& getID(void) const;
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a name for this transliterator that is appropriate for
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * display to the user in the default locale.  See {@link
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * #getDisplayName } for details.
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ID     the string identifier for this transliterator
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result Output param to receive the display name
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return       A reference to 'result'.
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                         UnicodeString& result);
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a name for this transliterator that is appropriate for
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * display to the user in the given locale.  This name is taken
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * from the locale resource data in the standard manner of the
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>java.text</code> package.
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>If no localized names exist in the system resource bundles,
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a name is synthesized using a localized
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>MessageFormat</code> pattern from the resource data.  The
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * arguments to this pattern are an integer followed by one or two
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * strings.  The integer is the number of strings, either 1 or 2.
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The strings are formed by splitting the ID for this
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterator at the first '-'.  If there is no '-', then the
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * entire ID forms the only string.
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ID       the string identifier for this transliterator
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param inLocale the Locale in which the display name should be
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                 localized.
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result   Output param to receive the display name
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return         A reference to 'result'.
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                         const Locale& inLocale,
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                         UnicodeString& result);
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the filter used by this transliterator, or <tt>NULL</tt>
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * if this transliterator uses no filter.
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the filter used by this transliterator, or <tt>NULL</tt>
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *         if this transliterator uses no filter.
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeFilter* getFilter(void) const;
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the filter used by this transliterator, or <tt>NULL</tt> if this
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterator uses no filter.  The caller must eventually delete the
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * result.  After this call, this transliterator's filter is set to
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <tt>NULL</tt>.
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the filter used by this transliterator, or <tt>NULL</tt> if this
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *         transliterator uses no filter.
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeFilter* orphanFilter(void);
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Changes the filter used by this transliterator.  If the filter
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is set to <tt>null</tt> then no filtering will occur.
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>Callers must take care if a transliterator is in use by
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * multiple threads.  The filter should not be changed by one
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * thread while another thread may be transliterating.
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param adoptedFilter the new filter to be adopted.
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void adoptFilter(UnicodeFilter* adoptedFilter);
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns this transliterator's inverse.  See the class
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * documentation for details.  This implementation simply inverts
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the two entities in the ID and attempts to retrieve the
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * resulting transliterator.  That is, if <code>getID()</code>
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * returns "A-B", then this method will return the result of
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>createInstance("B-A")</code>, or <code>null</code> if that
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * call fails.
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>Subclasses with knowledge of their inverse may wish to
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * override this method.
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status Output param to filled in with a success or an error.
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a transliterator that is an inverse, not necessarily
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * exact, of this transliterator, or <code>null</code> if no such
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterator is registered.
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #registerInstance
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Transliterator* createInverse(UErrorCode& status) const;
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a <code>Transliterator</code> object given its ID.
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The ID must be either a system transliterator ID or a ID registered
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * using <code>registerInstance()</code>.
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ID a valid ID, as enumerated by <code>getAvailableIDs()</code>
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param dir        either FORWARD or REVERSE.
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param parseError Struct to recieve information on position
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                   of error if an error is encountered
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status     Output param to filled in with a success or an error.
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return A <code>Transliterator</code> object with the given ID
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #registerInstance
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getAvailableIDs
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getID
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          UTransDirection dir,
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          UParseError& parseError,
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          UErrorCode& status);
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a <code>Transliterator</code> object given its ID.
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The ID must be either a system transliterator ID or a ID registered
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * using <code>registerInstance()</code>.
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ID a valid ID, as enumerated by <code>getAvailableIDs()</code>
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param dir        either FORWARD or REVERSE.
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status     Output param to filled in with a success or an error.
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return A <code>Transliterator</code> object with the given ID
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          UTransDirection dir,
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          UErrorCode& status);
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a <code>Transliterator</code> object constructed from
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the given rule string.  This will be a RuleBasedTransliterator,
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * if the rule string contains only rules, or a
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * CompoundTransliterator, if it contains ID blocks, or a
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * NullTransliterator, if it contains ID blocks which parse as
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * empty for the given direction.
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ID            the id for the transliterator.
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param rules         rules, separated by ';'
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param dir           either FORWARD or REVERSE.
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param parseError    Struct to recieve information on position
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                      of error if an error is encountered
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status        Output param set to success/failure code.
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static Transliterator* U_EXPORT2 createFromRules(const UnicodeString& ID,
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           const UnicodeString& rules,
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           UTransDirection dir,
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           UParseError& parseError,
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           UErrorCode& status);
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Create a rule string that can be passed to createFromRules()
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to recreate this transliterator.
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result the string to receive the rules.  Previous
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contents will be deleted.
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param escapeUnprintable if TRUE then convert unprintable
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * character to their hex escape representations, \\uxxxx or
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * \\Uxxxxxxxx.  Unprintable characters are those other than
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * U+000A, U+0020..U+007E.
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeString& toRules(UnicodeString& result,
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                   UBool escapeUnprintable) const;
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the number of elements that make up this transliterator.
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For example, if the transliterator "NFD;Jamo-Latin;Latin-Greek"
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * were created, the return value of this method would be 3.
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>If this transliterator is not composed of other
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterators, then this method returns 1.
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the number of transliterators that compose this
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterator, or 1 if this transliterator is not composed of
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * multiple transliterators
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t countElements() const;
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return an element that makes up this transliterator.  For
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * example, if the transliterator "NFD;Jamo-Latin;Latin-Greek"
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * were created, the return value of this method would be one
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of the three transliterator objects that make up that
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterator: [NFD, Jamo-Latin, Latin-Greek].
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>If this transliterator is not composed of other
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterators, then this method will return a reference to
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this transliterator when given the index 0.
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index a value from 0..countElements()-1 indicating the
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterator to return
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ec input-output error code
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return one of the transliterators that makes up this
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterator, if this transliterator is made up of multiple
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * transliterators, otherwise a reference to this object if given
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * an index of 0
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const Transliterator& getElement(int32_t index, UErrorCode& ec) const;
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the set of all characters that may be modified in the
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * input text by this Transliterator.  This incorporates this
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * object's current filter; if the filter is changed, the return
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * value of this function will change.  The default implementation
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * returns an empty set.  Some subclasses may override {@link
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * #handleGetSourceSet } to return a more precise result.  The
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * return result is approximate in any case and is intended for
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * use by tests, tools, or utilities.
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result receives result set; previous contents lost
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to result
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getTargetSet
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #handleGetSourceSet
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& getSourceSet(UnicodeSet& result) const;
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Framework method that returns the set of all characters that
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * may be modified in the input text by this Transliterator,
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * ignoring the effect of this object's filter.  The base class
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * implementation returns the empty set.  Subclasses that wish to
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * implement this should override this method.
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the set of characters that this transliterator may
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * modify.  The set may be modified, so subclasses should return a
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * newly-created object.
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result receives result set; previous contents lost
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getSourceSet
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getTargetSet
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void handleGetSourceSet(UnicodeSet& result) const;
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the set of all characters that may be generated as
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * replacement text by this transliterator.  The default
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * implementation returns the empty set.  Some subclasses may
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * override this method to return a more precise result.  The
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * return result is approximate in any case and is intended for
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * use by tests, tools, or utilities requiring such
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * meta-information.
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result receives result set; previous contents lost
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to result
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getTargetSet
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Registers a factory function that creates transliterators of
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a given ID.
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param id the ID being registered
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param factory a function pointer that will be copied and
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * called later when the given ID is passed to createInstance()
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param context a context pointer that will be stored and
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * later passed to the factory function when an ID matching
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the registration ID is being instantiated with this factory.
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void U_EXPORT2 registerFactory(const UnicodeString& id,
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                Factory factory,
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                Token context);
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Registers an instance <tt>obj</tt> of a subclass of
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>Transliterator</code> with the system.  When
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <tt>createInstance()</tt> is called with an ID string that is
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * equal to <tt>obj->getID()</tt>, then <tt>obj->clone()</tt> is
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * returned.
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * After this call the Transliterator class owns the adoptedObj
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and will delete it.
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param adoptedObj an instance of subclass of
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>Transliterator</code> that defines <tt>clone()</tt>
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #createInstance
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #registerFactory
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #unregister
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void U_EXPORT2 registerInstance(Transliterator* adoptedObj);
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Registers an ID string as an alias of another ID string.
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * That is, after calling this function, <tt>createInstance(aliasID)</tt>
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * will return the same thing as <tt>createInstance(realID)</tt>.
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This is generally used to create shorter, more mnemonic aliases
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * for long compound IDs.
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param aliasID The new ID being registered.
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param realID The ID that the new ID is to be an alias for.
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This can be a compound ID and can include filters and should
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * refer to transliterators that have already been registered with
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the framework, although this isn't checked.
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.6
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     static void U_EXPORT2 registerAlias(const UnicodeString& aliasID,
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                         const UnicodeString& realID);
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected:
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param id the ID being registered
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param factory a function pointer that will be copied and
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * called later when the given ID is passed to createInstance()
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param context a context pointer that will be stored and
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * later passed to the factory function when an ID matching
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the registration ID is being instantiated with this factory.
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void _registerFactory(const UnicodeString& id,
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 Factory factory,
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 Token context);
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void _registerInstance(Transliterator* adoptedObj);
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void _registerAlias(const UnicodeString& aliasID, const UnicodeString& realID);
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Register two targets as being inverses of one another.  For
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * example, calling registerSpecialInverse("NFC", "NFD", true) causes
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Transliterator to form the following inverse relationships:
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <pre>NFC => NFD
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Any-NFC => Any-NFD
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * NFD => NFC
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Any-NFD => Any-NFC</pre>
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (Without the special inverse registration, the inverse of NFC
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * would be NFC-Any.)  Note that NFD is shorthand for Any-NFD, but
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * that the presence or absence of "Any-" is preserved.
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>The relationship is symmetrical; registering (a, b) is
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * equivalent to registering (b, a).
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>The relevant IDs must still be registered separately as
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * factories or classes.
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>Only the targets are specified.  Special inverses always
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * have the form Any-Target1 <=> Any-Target2.  The target should
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * have canonical casing (the casing desired to be produced when
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * an inverse is formed) and should contain no whitespace or other
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * extraneous characters.
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param target the target against which to register the inverse
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param inverseTarget the inverse of target, that is
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Any-target.getInverse() => Any-inverseTarget
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param bidirectional if true, register the reverse relation
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * as well, that is, Any-inverseTarget.getInverse() => Any-target
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void _registerSpecialInverse(const UnicodeString& target,
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        const UnicodeString& inverseTarget,
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        UBool bidirectional);
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_INTERNAL_API */
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Unregisters a transliterator or class.  This may be either
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a system transliterator or a user transliterator or class.
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Any attempt to construct an unregistered transliterator based
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * on its ID will fail.
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ID the ID of the transliterator or class
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the <code>Object</code> that was registered with
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>ID</code>, or <code>null</code> if none was
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #registerInstance
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #registerFactory
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void U_EXPORT2 unregister(const UnicodeString& ID);
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return a StringEnumeration over the IDs available at the time of the
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * call, including user-registered IDs.
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ec input-output error code
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a newly-created StringEnumeration over the transliterators
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * available at the time of the call. The caller should delete this object
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * when done using it.
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static StringEnumeration* U_EXPORT2 getAvailableIDs(UErrorCode& ec);
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the number of registered source specifiers.
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the number of registered source specifiers.
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static int32_t U_EXPORT2 countAvailableSources(void);
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return a registered source specifier.
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index which specifier to return, from 0 to n-1, where
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * n = countAvailableSources()
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result fill-in paramter to receive the source specifier.
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If index is out of range, result will be empty.
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return reference to result
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeString& U_EXPORT2 getAvailableSource(int32_t index,
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             UnicodeString& result);
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the number of registered target specifiers for a given
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * source specifier.
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source the given source specifier.
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the number of registered target specifiers for a given
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *         source specifier.
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static int32_t U_EXPORT2 countAvailableTargets(const UnicodeString& source);
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return a registered target specifier for a given source.
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index which specifier to return, from 0 to n-1, where
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * n = countAvailableTargets(source)
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source the source specifier
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result fill-in paramter to receive the target specifier.
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If source is invalid or if index is out of range, result will
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * be empty.
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return reference to result
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeString& U_EXPORT2 getAvailableTarget(int32_t index,
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             const UnicodeString& source,
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             UnicodeString& result);
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the number of registered variant specifiers for a given
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * source-target pair.
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source    the source specifiers.
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param target    the target specifiers.
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static int32_t U_EXPORT2 countAvailableVariants(const UnicodeString& source,
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          const UnicodeString& target);
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return a registered variant specifier for a given source-target
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * pair.
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index which specifier to return, from 0 to n-1, where
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * n = countAvailableVariants(source, target)
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source the source specifier
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param target the target specifier
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result fill-in paramter to receive the variant
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * specifier.  If source is invalid or if target is invalid or if
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * index is out of range, result will be empty.
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return reference to result
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeString& U_EXPORT2 getAvailableVariant(int32_t index,
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              const UnicodeString& source,
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              const UnicodeString& target,
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              UnicodeString& result);
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected:
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Non-mutexed internal method
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static int32_t _countAvailableSources(void);
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Non-mutexed internal method
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeString& _getAvailableSource(int32_t index,
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              UnicodeString& result);
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Non-mutexed internal method
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static int32_t _countAvailableTargets(const UnicodeString& source);
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Non-mutexed internal method
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeString& _getAvailableTarget(int32_t index,
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              const UnicodeString& source,
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              UnicodeString& result);
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Non-mutexed internal method
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static int32_t _countAvailableVariants(const UnicodeString& source,
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           const UnicodeString& target);
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Non-mutexed internal method
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeString& _getAvailableVariant(int32_t index,
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               const UnicodeString& source,
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               const UnicodeString& target,
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               UnicodeString& result);
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_INTERNAL_API */
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected:
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Set the ID of this transliterators.  Subclasses shouldn't do
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this, unless the underlying script behavior has changed.
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param id the new id t to be set.
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void setID(const UnicodeString& id);
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the class ID for this class.  This is useful only for
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * comparing to a return value from getDynamicClassID().
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Note that Transliterator is an abstract base class, and therefor
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * no fully constructed object will  have a dynamic
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCLassID that equals the UClassID returned from
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * TRansliterator::getStaticClassID().
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return       The class ID for class Transliterator.
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UClassID U_EXPORT2 getStaticClassID(void);
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a unique class ID <b>polymorphically</b>.  This method
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is to implement a simple version of RTTI, since not all C++
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * compilers support genuine RTTI.  Polymorphic operator==() and
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * clone() methods call this method.
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <p>Concrete subclasses of Transliterator must use the
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    UOBJECT_DEFINE_RTTI_IMPLEMENTATION macro from
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    uobject.h to provide the RTTI functions.
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return The class ID for this object. All objects of a given
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * class have the same class ID.  Objects of other classes have
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * different class IDs.
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UClassID getDynamicClassID(void) const = 0;
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UBool initializeRegistry(UErrorCode &status);
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_OBSOLETE_API
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the number of IDs currently registered with the system.
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * To retrieve the actual IDs, call getAvailableID(i) with
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * i from 0 to countAvailableIDs() - 1.
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the number of IDs currently registered with the system.
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @obsolete ICU 3.4 use getAvailableIDs() instead
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static int32_t U_EXPORT2 countAvailableIDs(void);
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the index-th available ID.  index must be between 0
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and countAvailableIDs() - 1, inclusive.  If index is out of
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * range, the result of getAvailableID(0) is returned.
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index the given ID index.
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return      the index-th available ID.  index must be between 0
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              and countAvailableIDs() - 1, inclusive.  If index is out of
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              range, the result of getAvailableID(0) is returned.
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @obsolete ICU 3.4 use getAvailableIDs() instead; this function
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is not thread safe, since it returns a reference to storage that
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * may become invalid if another thread calls unregister
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UnicodeString& U_EXPORT2 getAvailableID(int32_t index);
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_OBSOLETE_API */
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t Transliterator::getMaximumContextLength(void) const {
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return maximumContextLength;
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void Transliterator::setID(const UnicodeString& id) {
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ID = id;
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // NUL-terminate the ID string, which is a non-aliased copy.
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ID.append((UChar)0);
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ID.truncate(ID.length()-1);
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline Transliterator::Token Transliterator::integerToken(int32_t i) {
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Token t;
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    t.integer = i;
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return t;
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline Transliterator::Token Transliterator::pointerToken(void* p) {
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Token t;
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    t.pointer = p;
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return t;
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_INTERNAL_API */
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_TRANSLITERATION */
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1330