1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Copyright (C) 1999-2008, International Business Machines
4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Corporation and others. All Rights Reserved.
5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   Date        Name        Description
7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   11/17/99    aliu        Creation.
8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifndef TRANSLIT_H
11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define TRANSLIT_H
12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h"
14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \file
17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \brief C++ API: Tranforms text from one format to another.
18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_TRANSLITERATION
21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/uobject.h"
23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/unistr.h"
24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/parseerr.h"
25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utrans.h" // UTransPosition, UTransDirection
26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/strenum.h"
27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_BEGIN
29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class UnicodeFilter;
31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class UnicodeSet;
32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class CompoundTransliterator;
33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class TransliteratorParser;
34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class NormalizationTransliterator;
35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class TransliteratorIDParser;
36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>Transliterator</code> is an abstract class that
40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterates text from one format to another.  The most common
41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * kind of transliterator is a script, or alphabet, transliterator.
42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * For example, a Russian to Latin transliterator changes Russian text
43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * written in Cyrillic characters to phonetically equivalent Latin
44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * characters.  It does not <em>translate</em> Russian to English!
45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Transliteration, unlike translation, operates on characters, without
46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * reference to the meanings of words and sentences.
47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>Although script conversion is its most common use, a
49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterator can actually perform a more general class of tasks.
50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * In fact, <code>Transliterator</code> defines a very general API
51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * which specifies only that a segment of the input text is replaced
52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * by new text.  The particulars of this conversion are determined
53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * entirely by subclasses of <code>Transliterator</code>.
54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p><b>Transliterators are stateless</b>
56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p><code>Transliterator</code> objects are <em>stateless</em>; they
58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * retain no information between calls to
59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>transliterate()</code>.  (However, this does <em>not</em>
60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * mean that threads may share transliterators without synchronizing
61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * them.  Transliterators are not immutable, so they must be
62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * synchronized when shared between threads.)  This might seem to
63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * limit the complexity of the transliteration operation.  In
64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * practice, subclasses perform complex transliterations by delaying
65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the replacement of text until it is known that no other
66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * replacements are possible.  In other words, although the
67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>Transliterator</code> objects are stateless, the source text
68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * itself embodies all the needed information, and delayed operation
69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * allows arbitrary complexity.
70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p><b>Batch transliteration</b>
72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>The simplest way to perform transliteration is all at once, on a
74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * string of existing text.  This is referred to as <em>batch</em>
75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliteration.  For example, given a string <code>input</code>
76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * and a transliterator <code>t</code>, the call
77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \htmlonly<blockquote>\endhtmlonly<code>String result = t.transliterate(input);
79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </code>\htmlonly</blockquote>\endhtmlonly
80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * will transliterate it and return the result.  Other methods allow
82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the client to specify a substring to be transliterated and to use
83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * {@link Replaceable } objects instead of strings, in order to
84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * preserve out-of-band information (such as text styles).
85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p><b>Keyboard transliteration</b>
87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>Somewhat more involved is <em>keyboard</em>, or incremental
89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliteration.  This is the transliteration of text that is
90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * arriving from some source (typically the user's keyboard) one
91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * character at a time, or in some other piecemeal fashion.
92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>In keyboard transliteration, a <code>Replaceable</code> buffer
94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * stores the text.  As text is inserted, as much as possible is
95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterated on the fly.  This means a GUI that displays the
96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * contents of the buffer may show text being modified as each new
97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * character arrives.
98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>Consider the simple <code>RuleBasedTransliterator</code>:
100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \htmlonly<blockquote>\endhtmlonly<code>
102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * th&gt;{theta}<br>
103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * t&gt;{tau}
104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </code>\htmlonly</blockquote>\endhtmlonly
105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * When the user types 't', nothing will happen, since the
107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterator is waiting to see if the next character is 'h'.  To
108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * remedy this, we introduce the notion of a cursor, marked by a '|'
109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * in the output string:
110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \htmlonly<blockquote>\endhtmlonly<code>
112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * t&gt;|{tau}<br>
113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * {tau}h&gt;{theta}
114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </code>\htmlonly</blockquote>\endhtmlonly
115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Now when the user types 't', tau appears, and if the next character
117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * is 'h', the tau changes to a theta.  This is accomplished by
118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * maintaining a cursor position (independent of the insertion point,
119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * and invisible in the GUI) across calls to
120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>transliterate()</code>.  Typically, the cursor will
121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * be coincident with the insertion point, but in a case like the one
122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * above, it will precede the insertion point.
123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>Keyboard transliteration methods maintain a set of three indices
125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * that are updated with each call to
126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>transliterate()</code>, including the cursor, start,
127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * and limit.  Since these indices are changed by the method, they are
128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * passed in an <code>int[]</code> array. The <code>START</code> index
129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * marks the beginning of the substring that the transliterator will
130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * look at.  It is advanced as text becomes committed (but it is not
131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the committed index; that's the <code>CURSOR</code>).  The
132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>CURSOR</code> index, described above, marks the point at
133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * which the transliterator last stopped, either because it reached
134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the end, or because it required more characters to disambiguate
135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * between possible inputs.  The <code>CURSOR</code> can also be
136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * explicitly set by rules in a <code>RuleBasedTransliterator</code>.
137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Any characters before the <code>CURSOR</code> index are frozen;
138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * future keyboard transliteration calls within this input sequence
139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * will not change them.  New text is inserted at the
140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>LIMIT</code> index, which marks the end of the substring that
141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the transliterator looks at.
142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>Because keyboard transliteration assumes that more characters
144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * are to arrive, it is conservative in its operation.  It only
145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterates when it can do so unambiguously.  Otherwise it waits
146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * for more characters to arrive.  When the client code knows that no
147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * more characters are forthcoming, perhaps because the user has
148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * performed some input termination operation, then it should call
149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>finishTransliteration()</code> to complete any
150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * pending transliterations.
151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p><b>Inverses</b>
153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>Pairs of transliterators may be inverses of one another.  For
155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * example, if transliterator <b>A</b> transliterates characters by
156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * incrementing their Unicode value (so "abc" -> "def"), and
157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterator <b>B</b> decrements character values, then <b>A</b>
158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * is an inverse of <b>B</b> and vice versa.  If we compose <b>A</b>
159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * with <b>B</b> in a compound transliterator, the result is the
160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * indentity transliterator, that is, a transliterator that does not
161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * change its input text.
162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The <code>Transliterator</code> method <code>getInverse()</code>
164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * returns a transliterator's inverse, if one exists, or
165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>null</code> otherwise.  However, the result of
166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>getInverse()</code> usually will <em>not</em> be a true
167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * mathematical inverse.  This is because true inverse transliterators
168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * are difficult to formulate.  For example, consider two
169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterators: <b>AB</b>, which transliterates the character 'A'
170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * to 'B', and <b>BA</b>, which transliterates 'B' to 'A'.  It might
171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * seem that these are exact inverses, since
172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \htmlonly<blockquote>\endhtmlonly"A" x <b>AB</b> -> "B"<br>
174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * "B" x <b>BA</b> -> "A"\htmlonly</blockquote>\endhtmlonly
175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * where 'x' represents transliteration.  However,
177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \htmlonly<blockquote>\endhtmlonly"ABCD" x <b>AB</b> -> "BBCD"<br>
179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * "BBCD" x <b>BA</b> -> "AACD"\htmlonly</blockquote>\endhtmlonly
180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * so <b>AB</b> composed with <b>BA</b> is not the
182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * identity. Nonetheless, <b>BA</b> may be usefully considered to be
183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <b>AB</b>'s inverse, and it is on this basis that
184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <b>AB</b><code>.getInverse()</code> could legitimately return
185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <b>BA</b>.
186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p><b>IDs and display names</b>
188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>A transliterator is designated by a short identifier string or
190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <em>ID</em>.  IDs follow the format <em>source-destination</em>,
191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * where <em>source</em> describes the entity being replaced, and
192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <em>destination</em> describes the entity replacing
193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <em>source</em>.  The entities may be the names of scripts,
194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * particular sequences of characters, or whatever else it is that the
195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterator converts to or from.  For example, a transliterator
196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * from Russian to Latin might be named "Russian-Latin".  A
197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterator from keyboard escape sequences to Latin-1 characters
198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * might be named "KeyboardEscape-Latin1".  By convention, system
199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * entity names are in English, with the initial letters of words
200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * capitalized; user entity names may follow any format so long as
201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * they do not contain dashes.
202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>In addition to programmatic IDs, transliterator objects have
204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * display names for presentation in user interfaces, returned by
205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * {@link #getDisplayName }.
206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p><b>Factory methods and registration</b>
208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>In general, client code should use the factory method
210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * {@link #createInstance } to obtain an instance of a
211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterator given its ID.  Valid IDs may be enumerated using
212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>getAvailableIDs()</code>.  Since transliterators are mutable,
213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * multiple calls to {@link #createInstance } with the same ID will
214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * return distinct objects.
215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>In addition to the system transliterators registered at startup,
217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * user transliterators may be registered by calling
218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>registerInstance()</code> at run time.  A registered instance
219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * acts a template; future calls to {@link #createInstance } with the ID
220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * of the registered object return clones of that object.  Thus any
221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * object passed to <tt>registerInstance()</tt> must implement
222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <tt>clone()</tt> propertly.  To register a transliterator subclass
223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * without instantiating it (until it is needed), users may call
224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * {@link #registerFactory }.  In this case, the objects are
225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * instantiated by invoking the zero-argument public constructor of
226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the class.
227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p><b>Subclassing</b>
229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Subclasses must implement the abstract method
231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>handleTransliterate()</code>.  <p>Subclasses should override
232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the <code>transliterate()</code> method taking a
233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>Replaceable</code> and the <code>transliterate()</code>
234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * method taking a <code>String</code> and <code>StringBuffer</code>
235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * if the performance of these methods can be improved over the
236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * performance obtained by the default implementations in this class.
237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @author Alan Liu
239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @stable ICU 2.0
240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class U_I18N_API Transliterator : public UObject {
242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)private:
244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Programmatic name, e.g., "Latin-Arabic".
247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString ID;
249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This transliterator's filter.  Any character for which
252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <tt>filter.contains()</tt> returns <tt>false</tt> will not be
253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * altered by this transliterator.  If <tt>filter</tt> is
254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <tt>null</tt> then no filtering is applied.
255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeFilter* filter;
257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t maximumContextLength;
259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) public:
261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * A context integer or pointer for a factory function, passed by
264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * value.
265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    union Token {
268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /**
269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * This token, interpreted as a 32-bit integer.
270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * @stable ICU 2.4
271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         */
272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        int32_t integer;
273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /**
274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * This token, interpreted as a native pointer.
275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * @stable ICU 2.4
276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         */
277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        void*   pointer;
278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    };
279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a token containing an integer.
282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a token containing an integer.
283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    inline static Token integerToken(int32_t);
286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a token containing a pointer.
289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a token containing a pointer.
290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    inline static Token pointerToken(void*);
293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * A function that creates and returns a Transliterator.  When
296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * invoked, it will be passed the ID string that is being
297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * instantiated, together with the context pointer that was passed
298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * in when the factory function was first registered.  Many
299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * factory functions will ignore both parameters, however,
300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * functions that are registered to more than one ID may use the
301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * ID or the context parameter to parameterize the transliterator
302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * they create.
303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID      the string identifier for this transliterator
304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param context a context pointer that will be stored and
305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                later passed to the factory function when an ID matching
306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                the registration ID is being instantiated with this factory.
307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    typedef Transliterator* (U_EXPORT2 *Factory)(const UnicodeString& ID, Token context);
310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)protected:
312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Default constructor.
315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID the string identifier for this transliterator
316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param adoptedFilter the filter.  Any character for which
317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <tt>filter.contains()</tt> returns <tt>false</tt> will not be
318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * altered by this transliterator.  If <tt>filter</tt> is
319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <tt>null</tt> then no filtering is applied.
320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Copy constructor.
326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Transliterator(const Transliterator&);
329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Assignment operator.
332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Transliterator& operator=(const Transliterator&);
335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Create a transliterator from a basic ID.  This is an ID
338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * containing only the forward direction source, target, and
339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * variant.
340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param id a basic ID of the form S-T or S-T/V.
341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param canon canonical ID to assign to the object, or
342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * NULL to leave the ID unchanged
343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a newly created Transliterator or null if the ID is
344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * invalid.
345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static Transliterator* createBasicInstance(const UnicodeString& id,
348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                               const UnicodeString* canon);
349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    friend class TransliteratorParser; // for parseID()
351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    friend class TransliteratorIDParser; // for createBasicInstance()
352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    friend class TransliteratorAlias; // for setID()
353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Destructor.
358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual ~Transliterator();
361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Implements Cloneable.
364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * All subclasses are encouraged to implement this method if it is
365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * possible and reasonable to do so.  Subclasses that are to be
366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * registered with the system using <tt>registerInstance()</tt>
367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * are required to implement this method.  If a subclass does not
368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * implement clone() properly and is registered with the system
369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * using registerInstance(), then the default clone() implementation
370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * will return null, and calls to createInstance() will fail.
371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a copy of the object.
373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #registerInstance
374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual Transliterator* clone() const;
377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Transliterates a segment of a string, with optional filtering.
380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the string to be transliterated
382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param start the beginning index, inclusive; <code>0 <= start
383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <= limit</code>.
384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param limit the ending index, exclusive; <code>start <= limit
385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <= text.length()</code>.
386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return The new limit index.  The text previously occupying <code>[start,
387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * limit)</code> has been transliterated, possibly to a string of a different
388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * length, at <code>[start, </code><em>new-limit</em><code>)</code>, where
389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <em>new-limit</em> is the return value. If the input offsets are out of bounds,
390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the returned value is -1 and the input string remains unchanged.
391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual int32_t transliterate(Replaceable& text,
394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                  int32_t start, int32_t limit) const;
395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Transliterates an entire string in place. Convenience method.
398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the string to be transliterated
399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void transliterate(Replaceable& text) const;
402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Transliterates the portion of the text buffer that can be
405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterated unambiguosly after new text has been inserted,
406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * typically as a result of a keyboard event.  The new text in
407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>insertion</code> will be inserted into <code>text</code>
408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * at <code>index.limit</code>, advancing
409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.limit</code> by <code>insertion.length()</code>.
410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Then the transliterator will try to transliterate characters of
411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>text</code> between <code>index.cursor</code> and
412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.limit</code>.  Characters before
413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.cursor</code> will not be changed.
414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>Upon return, values in <code>index</code> will be updated.
416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.start</code> will be advanced to the first
417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * character that future calls to this method will read.
418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.cursor</code> and <code>index.limit</code> will
419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * be adjusted to delimit the range of text that future calls to
420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * this method may change.
421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>Typical usage of this method begins with an initial call
423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * with <code>index.start</code> and <code>index.limit</code>
424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * set to indicate the portion of <code>text</code> to be
425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterated, and <code>index.cursor == index.start</code>.
426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Thereafter, <code>index</code> can be used without
427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * modification in future calls, provided that all changes to
428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>text</code> are made via this method.
429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>This method assumes that future calls may be made that will
431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * insert new text into the buffer.  As a result, it only performs
432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * unambiguous transliterations.  After the last call to this
433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * method, there may be untransliterated text that is waiting for
434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * more input to resolve an ambiguity.  In order to perform these
435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * pending transliterations, clients should call {@link
436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * #finishTransliteration } after the last call to this
437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * method has been made.
438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the buffer holding transliterated and untransliterated text
440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index an array of three integers.
441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <ul><li><code>index.start</code>: the beginning index,
443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * inclusive; <code>0 <= index.start <= index.limit</code>.
444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <li><code>index.limit</code>: the ending index, exclusive;
446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.start <= index.limit <= text.length()</code>.
447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>insertion</code> is inserted at
448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.limit</code>.
449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <li><code>index.cursor</code>: the next character to be
451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * considered for transliteration; <code>index.start <=
452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * index.cursor <= index.limit</code>.  Characters before
453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.cursor</code> will not be changed by future calls
454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * to this method.</ul>
455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param insertion text to be inserted and possibly
457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterated into the translation buffer at
458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.limit</code>.  If <code>null</code> then no text
459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * is inserted.
460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status    Output param to filled in with a success or an error.
461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #handleTransliterate
462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @exception IllegalArgumentException if <code>index</code>
463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * is invalid
464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see UTransPosition
465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void transliterate(Replaceable& text, UTransPosition& index,
468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                               const UnicodeString& insertion,
469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                               UErrorCode& status) const;
470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Transliterates the portion of the text buffer that can be
473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterated unambiguosly after a new character has been
474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * inserted, typically as a result of a keyboard event.  This is a
475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * convenience method.
476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the buffer holding transliterated and
477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * untransliterated text
478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index an array of three integers.
479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param insertion text to be inserted and possibly
480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterated into the translation buffer at
481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.limit</code>.
482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status    Output param to filled in with a success or an error.
483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const
484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void transliterate(Replaceable& text, UTransPosition& index,
487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                               UChar32 insertion,
488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                               UErrorCode& status) const;
489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Transliterates the portion of the text buffer that can be
492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterated unambiguosly.  This is a convenience method; see
493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * {@link
494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const }
495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * for details.
496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the buffer holding transliterated and
497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * untransliterated text
498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index an array of three integers.  See {@link
499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const }.
500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status    Output param to filled in with a success or an error.
501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #transliterate(Replaceable, int[], String)
502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void transliterate(Replaceable& text, UTransPosition& index,
505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                               UErrorCode& status) const;
506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Finishes any pending transliterations that were waiting for
509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * more characters.  Clients should call this method as the last
510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * call after a sequence of one or more calls to
511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>transliterate()</code>.
512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the buffer holding transliterated and
513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * untransliterated text.
514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index the array of indices previously passed to {@link
515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * #transliterate }
516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void finishTransliteration(Replaceable& text,
519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       UTransPosition& index) const;
520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)private:
522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This internal method does incremental transliteration.  If the
525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * 'insertion' is non-null then we append it to 'text' before
526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * proceeding.  This method calls through to the pure virtual
527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * framework method handleTransliterate() to do the actual
528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * work.
529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the buffer holding transliterated and
530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * untransliterated text
531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index an array of three integers.  See {@link
532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * #transliterate(Replaceable, int[], String)}.
533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param insertion text to be inserted and possibly
534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterated into the translation buffer at
535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>index.limit</code>.
536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status    Output param to filled in with a success or an error.
537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void _transliterate(Replaceable& text,
539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        UTransPosition& index,
540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        const UnicodeString* insertion,
541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        UErrorCode &status) const;
542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)protected:
544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Abstract method that concrete subclasses define to implement
547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * their transliteration algorithm.  This method handles both
548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * incremental and non-incremental transliteration.  Let
549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>originalStart</code> refer to the value of
550f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>pos.start</code> upon entry.
551f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
552f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <ul>
553f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <li>If <code>incremental</code> is false, then this method
554f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  should transliterate all characters between
555f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code>pos.start</code> and <code>pos.limit</code>. Upon return
556f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code>pos.start</code> must == <code> pos.limit</code>.</li>
557f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
558f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <li>If <code>incremental</code> is true, then this method
559f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  should transliterate all characters between
560f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code>pos.start</code> and <code>pos.limit</code> that can be
561f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  unambiguously transliterated, regardless of future insertions
562f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  of text at <code>pos.limit</code>.  Upon return,
563f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code>pos.start</code> should be in the range
564f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  [<code>originalStart</code>, <code>pos.limit</code>).
565f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code>pos.start</code> should be positioned such that
566f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  characters [<code>originalStart</code>, <code>
567f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  pos.start</code>) will not be changed in the future by this
568f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  transliterator and characters [<code>pos.start</code>,
569f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code>pos.limit</code>) are unchanged.</li>
570f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * </ul>
571f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
572f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>Implementations of this method should also obey the
573f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * following invariants:</p>
574f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
575f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <ul>
576f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <li> <code>pos.limit</code> and <code>pos.contextLimit</code>
577f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  should be updated to reflect changes in length of the text
578f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  between <code>pos.start</code> and <code>pos.limit</code>. The
579f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  difference <code> pos.contextLimit - pos.limit</code> should
580f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  not change.</li>
581f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
582f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <li><code>pos.contextStart</code> should not change.</li>
583f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
584f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <li>Upon return, neither <code>pos.start</code> nor
585f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code>pos.limit</code> should be less than
586f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code>originalStart</code>.</li>
587f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
588f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <li>Text before <code>originalStart</code> and text after
589f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code>pos.limit</code> should not change.</li>
590f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
591f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <li>Text before <code>pos.contextStart</code> and text after
592f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *  <code> pos.contextLimit</code> should be ignored.</li>
593f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * </ul>
594f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
595f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>Subclasses may safely assume that all characters in
596f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * [<code>pos.start</code>, <code>pos.limit</code>) are filtered.
597f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * In other words, the filter has already been applied by the time
598f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * this method is called.  See
599f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>filteredTransliterate()</code>.
600f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
601f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>This method is <b>not</b> for public consumption.  Calling
602f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * this method directly will transliterate
603f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * [<code>pos.start</code>, <code>pos.limit</code>) without
604f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * applying the filter. End user code should call <code>
605f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterate()</code> instead of this method. Subclass code
606f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * and wrapping transliterators should call
607f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>filteredTransliterate()</code> instead of this method.<p>
608f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
609f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the buffer holding transliterated and
610f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * untransliterated text
611f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
612f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param pos the indices indicating the start, limit, context
613f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * start, and context limit of the text.
614f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
615f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param incremental if true, assume more text may be inserted at
616f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>pos.limit</code> and act accordingly.  Otherwise,
617f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterate all text between <code>pos.start</code> and
618f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>pos.limit</code> and move <code>pos.start</code> up to
619f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>pos.limit</code>.
620f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
621f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #transliterate
622f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
623f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
624f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void handleTransliterate(Replaceable& text,
625f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                     UTransPosition& pos,
626f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                     UBool incremental) const = 0;
627f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
628f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
629f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
630f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Transliterate a substring of text, as specified by index, taking filters
631f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * into account.  This method is for subclasses that need to delegate to
632f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * another transliterator, such as CompoundTransliterator.
633f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the text to be transliterated
634f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index the position indices
635f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param incremental if TRUE, then assume more characters may be inserted
636f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * at index.limit, and postpone processing to accomodate future incoming
637f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * characters
638f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
639f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
640f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void filteredTransliterate(Replaceable& text,
641f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       UTransPosition& index,
642f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       UBool incremental) const;
643f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
644f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)private:
645f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
646f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
647f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Top-level transliteration method, handling filtering, incremental and
648f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * non-incremental transliteration, and rollback.  All transliteration
649f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * public API methods eventually call this method with a rollback argument
650f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * of TRUE.  Other entities may call this method but rollback should be
651f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * FALSE.
652f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
653f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>If this transliterator has a filter, break up the input text into runs
654f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * of unfiltered characters.  Pass each run to
655f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <subclass>.handleTransliterate().
656f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
657f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>In incremental mode, if rollback is TRUE, perform a special
658f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * incremental procedure in which several passes are made over the input
659f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * text, adding one character at a time, and committing successful
660f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterations as they occur.  Unsuccessful transliterations are rolled
661f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * back and retried with additional characters to give correct results.
662f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
663f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param text the text to be transliterated
664f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index the position indices
665f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param incremental if TRUE, then assume more characters may be inserted
666f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * at index.limit, and postpone processing to accomodate future incoming
667f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * characters
668f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param rollback if TRUE and if incremental is TRUE, then perform special
669f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * incremental processing, as described above, and undo partial
670f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterations where necessary.  If incremental is FALSE then this
671f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * parameter is ignored.
672f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
673f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void filteredTransliterate(Replaceable& text,
674f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       UTransPosition& index,
675f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       UBool incremental,
676f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       UBool rollback) const;
677f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
678f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
679f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
680f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
681f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the length of the longest context required by this transliterator.
682f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This is <em>preceding</em> context.  The default implementation supplied
683f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * by <code>Transliterator</code> returns zero; subclasses
684f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * that use preceding context should override this method to return the
685f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * correct value.  For example, if a transliterator translates "ddd" (where
686f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * d is any digit) to "555" when preceded by "(ddd)", then the preceding
687f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * context length is 5, the length of "(ddd)".
688f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
689f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return The maximum number of preceding context characters this
690f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterator needs to examine
691f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
692f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
693f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t getMaximumContextLength(void) const;
694f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
695f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)protected:
696f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
697f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
698f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Method for subclasses to use to set the maximum context length.
699f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param maxContextLength the new value to be set.
700f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #getMaximumContextLength
701f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
702f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
703f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void setMaximumContextLength(int32_t maxContextLength);
704f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
705f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
706f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
707f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
708f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns a programmatic identifier for this transliterator.
709f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * If this identifier is passed to <code>createInstance()</code>, it
710f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * will return this object, if it has been registered.
711f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a programmatic identifier for this transliterator.
712f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #registerInstance
713f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #registerFactory
714f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #getAvailableIDs
715f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
716f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
717f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual const UnicodeString& getID(void) const;
718f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
719f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
720f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns a name for this transliterator that is appropriate for
721f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * display to the user in the default locale.  See {@link
722f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * #getDisplayName } for details.
723f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID     the string identifier for this transliterator
724f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result Output param to receive the display name
725f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return       A reference to 'result'.
726f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
727f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
728f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
729f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                         UnicodeString& result);
730f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
731f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
732f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns a name for this transliterator that is appropriate for
733f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * display to the user in the given locale.  This name is taken
734f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * from the locale resource data in the standard manner of the
735f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>java.text</code> package.
736f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
737f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>If no localized names exist in the system resource bundles,
738f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * a name is synthesized using a localized
739f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>MessageFormat</code> pattern from the resource data.  The
740f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * arguments to this pattern are an integer followed by one or two
741f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * strings.  The integer is the number of strings, either 1 or 2.
742f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The strings are formed by splitting the ID for this
743f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterator at the first '-'.  If there is no '-', then the
744f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * entire ID forms the only string.
745f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID       the string identifier for this transliterator
746f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param inLocale the Locale in which the display name should be
747f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 localized.
748f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result   Output param to receive the display name
749f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return         A reference to 'result'.
750f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
751f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
752f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID,
753f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                         const Locale& inLocale,
754f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                         UnicodeString& result);
755f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
756f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
757f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the filter used by this transliterator, or <tt>NULL</tt>
758f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * if this transliterator uses no filter.
759f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the filter used by this transliterator, or <tt>NULL</tt>
760f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *         if this transliterator uses no filter.
761f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
762f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
763f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UnicodeFilter* getFilter(void) const;
764f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
765f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
766f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the filter used by this transliterator, or <tt>NULL</tt> if this
767f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterator uses no filter.  The caller must eventually delete the
768f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * result.  After this call, this transliterator's filter is set to
769f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <tt>NULL</tt>.
770f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the filter used by this transliterator, or <tt>NULL</tt> if this
771f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *         transliterator uses no filter.
772f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
773f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
774f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeFilter* orphanFilter(void);
775f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
776f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
777f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Changes the filter used by this transliterator.  If the filter
778f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * is set to <tt>null</tt> then no filtering will occur.
779f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
780f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>Callers must take care if a transliterator is in use by
781f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * multiple threads.  The filter should not be changed by one
782f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * thread while another thread may be transliterating.
783f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param adoptedFilter the new filter to be adopted.
784f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
785f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
786f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void adoptFilter(UnicodeFilter* adoptedFilter);
787f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
788f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
789f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns this transliterator's inverse.  See the class
790f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * documentation for details.  This implementation simply inverts
791f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the two entities in the ID and attempts to retrieve the
792f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * resulting transliterator.  That is, if <code>getID()</code>
793f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * returns "A-B", then this method will return the result of
794f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>createInstance("B-A")</code>, or <code>null</code> if that
795f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * call fails.
796f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
797f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>Subclasses with knowledge of their inverse may wish to
798f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * override this method.
799f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
800f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status Output param to filled in with a success or an error.
801f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a transliterator that is an inverse, not necessarily
802f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * exact, of this transliterator, or <code>null</code> if no such
803f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterator is registered.
804f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #registerInstance
805f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
806f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
807f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Transliterator* createInverse(UErrorCode& status) const;
808f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
809f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
810f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns a <code>Transliterator</code> object given its ID.
811f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The ID must be either a system transliterator ID or a ID registered
812f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * using <code>registerInstance()</code>.
813f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
814f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID a valid ID, as enumerated by <code>getAvailableIDs()</code>
815f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param dir        either FORWARD or REVERSE.
816f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param parseError Struct to recieve information on position
817f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                   of error if an error is encountered
818f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status     Output param to filled in with a success or an error.
819f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return A <code>Transliterator</code> object with the given ID
820f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #registerInstance
821f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #getAvailableIDs
822f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #getID
823f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
824f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
825f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
826f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                          UTransDirection dir,
827f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                          UParseError& parseError,
828f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                          UErrorCode& status);
829f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
830f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
831f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns a <code>Transliterator</code> object given its ID.
832f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The ID must be either a system transliterator ID or a ID registered
833f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * using <code>registerInstance()</code>.
834f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID a valid ID, as enumerated by <code>getAvailableIDs()</code>
835f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param dir        either FORWARD or REVERSE.
836f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status     Output param to filled in with a success or an error.
837f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return A <code>Transliterator</code> object with the given ID
838f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
839f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
840f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID,
841f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                          UTransDirection dir,
842f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                          UErrorCode& status);
843f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
844f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
845f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns a <code>Transliterator</code> object constructed from
846f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the given rule string.  This will be a RuleBasedTransliterator,
847f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * if the rule string contains only rules, or a
848f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * CompoundTransliterator, if it contains ID blocks, or a
849f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * NullTransliterator, if it contains ID blocks which parse as
850f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * empty for the given direction.
851f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID            the id for the transliterator.
852f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param rules         rules, separated by ';'
853f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param dir           either FORWARD or REVERSE.
854f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param parseError    Struct to recieve information on position
855f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                      of error if an error is encountered
856f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status        Output param set to success/failure code.
857f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
858f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
859f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static Transliterator* U_EXPORT2 createFromRules(const UnicodeString& ID,
860f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                           const UnicodeString& rules,
861f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                           UTransDirection dir,
862f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                           UParseError& parseError,
863f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                           UErrorCode& status);
864f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
865f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
866f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Create a rule string that can be passed to createFromRules()
867f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * to recreate this transliterator.
868f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result the string to receive the rules.  Previous
869f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * contents will be deleted.
870f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param escapeUnprintable if TRUE then convert unprintable
871f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * character to their hex escape representations, \\uxxxx or
872f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * \\Uxxxxxxxx.  Unprintable characters are those other than
873f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * U+000A, U+0020..U+007E.
874f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
875f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
876f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UnicodeString& toRules(UnicodeString& result,
877f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                   UBool escapeUnprintable) const;
878f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
879f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
880f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the number of elements that make up this transliterator.
881f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * For example, if the transliterator "NFD;Jamo-Latin;Latin-Greek"
882f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * were created, the return value of this method would be 3.
883f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
884f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>If this transliterator is not composed of other
885f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterators, then this method returns 1.
886f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the number of transliterators that compose this
887f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterator, or 1 if this transliterator is not composed of
888f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * multiple transliterators
889f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 3.0
890f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
891f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t countElements() const;
892f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
893f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
894f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return an element that makes up this transliterator.  For
895f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * example, if the transliterator "NFD;Jamo-Latin;Latin-Greek"
896f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * were created, the return value of this method would be one
897f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * of the three transliterator objects that make up that
898f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterator: [NFD, Jamo-Latin, Latin-Greek].
899f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
900f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>If this transliterator is not composed of other
901f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterators, then this method will return a reference to
902f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * this transliterator when given the index 0.
903f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index a value from 0..countElements()-1 indicating the
904f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterator to return
905f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ec input-output error code
906f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return one of the transliterators that makes up this
907f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterator, if this transliterator is made up of multiple
908f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * transliterators, otherwise a reference to this object if given
909f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * an index of 0
910f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 3.0
911f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
912f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const Transliterator& getElement(int32_t index, UErrorCode& ec) const;
913f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
914f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
915f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the set of all characters that may be modified in the
916f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * input text by this Transliterator.  This incorporates this
917f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * object's current filter; if the filter is changed, the return
918f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * value of this function will change.  The default implementation
919f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * returns an empty set.  Some subclasses may override {@link
920f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * #handleGetSourceSet } to return a more precise result.  The
921f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * return result is approximate in any case and is intended for
922f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * use by tests, tools, or utilities.
923f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result receives result set; previous contents lost
924f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a reference to result
925f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #getTargetSet
926f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #handleGetSourceSet
927f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
928f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
929f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeSet& getSourceSet(UnicodeSet& result) const;
930f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
931f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
932f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Framework method that returns the set of all characters that
933f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * may be modified in the input text by this Transliterator,
934f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * ignoring the effect of this object's filter.  The base class
935f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * implementation returns the empty set.  Subclasses that wish to
936f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * implement this should override this method.
937f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the set of characters that this transliterator may
938f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * modify.  The set may be modified, so subclasses should return a
939f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * newly-created object.
940f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result receives result set; previous contents lost
941f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #getSourceSet
942f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #getTargetSet
943f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
944f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
945f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual void handleGetSourceSet(UnicodeSet& result) const;
946f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
947f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
948f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns the set of all characters that may be generated as
949f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * replacement text by this transliterator.  The default
950f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * implementation returns the empty set.  Some subclasses may
951f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * override this method to return a more precise result.  The
952f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * return result is approximate in any case and is intended for
953f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * use by tests, tools, or utilities requiring such
954f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * meta-information.
955f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result receives result set; previous contents lost
956f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a reference to result
957f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #getTargetSet
958f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
959f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
960f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
961f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
962f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
963f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
964f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
965f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Registers a factory function that creates transliterators of
966f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * a given ID.
967f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param id the ID being registered
968f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param factory a function pointer that will be copied and
969f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * called later when the given ID is passed to createInstance()
970f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param context a context pointer that will be stored and
971f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * later passed to the factory function when an ID matching
972f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the registration ID is being instantiated with this factory.
973f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
974f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
975f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static void U_EXPORT2 registerFactory(const UnicodeString& id,
976f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                Factory factory,
977f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                Token context);
978f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
979f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
980f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Registers an instance <tt>obj</tt> of a subclass of
981f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>Transliterator</code> with the system.  When
982f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <tt>createInstance()</tt> is called with an ID string that is
983f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * equal to <tt>obj->getID()</tt>, then <tt>obj->clone()</tt> is
984f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * returned.
985f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
986f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * After this call the Transliterator class owns the adoptedObj
987f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * and will delete it.
988f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
989f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param adoptedObj an instance of subclass of
990f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>Transliterator</code> that defines <tt>clone()</tt>
991f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #createInstance
992f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #registerFactory
993f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #unregister
994f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
995f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
996f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static void U_EXPORT2 registerInstance(Transliterator* adoptedObj);
997f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
998f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
999f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Registers an ID string as an alias of another ID string.
1000f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * That is, after calling this function, <tt>createInstance(aliasID)</tt>
1001f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * will return the same thing as <tt>createInstance(realID)</tt>.
1002f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This is generally used to create shorter, more mnemonic aliases
1003f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * for long compound IDs.
1004f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1005f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param aliasID The new ID being registered.
1006f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param realID The ID that the new ID is to be an alias for.
1007f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This can be a compound ID and can include filters and should
1008f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * refer to transliterators that have already been registered with
1009f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the framework, although this isn't checked.
1010f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 3.6
1011f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1012f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     static void U_EXPORT2 registerAlias(const UnicodeString& aliasID,
1013f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                         const UnicodeString& realID);
1014f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1015f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)protected:
1016f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1017f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1018f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1019f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param id the ID being registered
1020f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param factory a function pointer that will be copied and
1021f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * called later when the given ID is passed to createInstance()
1022f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param context a context pointer that will be stored and
1023f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * later passed to the factory function when an ID matching
1024f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the registration ID is being instantiated with this factory.
1025f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1026f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static void _registerFactory(const UnicodeString& id,
1027f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                 Factory factory,
1028f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                 Token context);
1029f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1030f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1031f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1032f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1033f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static void _registerInstance(Transliterator* adoptedObj);
1034f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1035f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1036f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1037f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1038f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static void _registerAlias(const UnicodeString& aliasID, const UnicodeString& realID);
1039f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1040f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1041f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Register two targets as being inverses of one another.  For
1042f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * example, calling registerSpecialInverse("NFC", "NFD", true) causes
1043f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Transliterator to form the following inverse relationships:
1044f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1045f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <pre>NFC => NFD
1046f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Any-NFC => Any-NFD
1047f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * NFD => NFC
1048f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Any-NFD => Any-NFC</pre>
1049f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1050f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * (Without the special inverse registration, the inverse of NFC
1051f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * would be NFC-Any.)  Note that NFD is shorthand for Any-NFD, but
1052f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * that the presence or absence of "Any-" is preserved.
1053f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1054f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>The relationship is symmetrical; registering (a, b) is
1055f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * equivalent to registering (b, a).
1056f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1057f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>The relevant IDs must still be registered separately as
1058f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * factories or classes.
1059f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1060f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>Only the targets are specified.  Special inverses always
1061f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * have the form Any-Target1 <=> Any-Target2.  The target should
1062f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * have canonical casing (the casing desired to be produced when
1063f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * an inverse is formed) and should contain no whitespace or other
1064f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * extraneous characters.
1065f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1066f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param target the target against which to register the inverse
1067f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param inverseTarget the inverse of target, that is
1068f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Any-target.getInverse() => Any-inverseTarget
1069f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param bidirectional if true, register the reverse relation
1070f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * as well, that is, Any-inverseTarget.getInverse() => Any-target
1071f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1072f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1073f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static void _registerSpecialInverse(const UnicodeString& target,
1074f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        const UnicodeString& inverseTarget,
1075f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        UBool bidirectional);
1076f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1077f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
1078f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1079f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1080f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Unregisters a transliterator or class.  This may be either
1081f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * a system transliterator or a user transliterator or class.
1082f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Any attempt to construct an unregistered transliterator based
1083f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * on its ID will fail.
1084f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1085f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID the ID of the transliterator or class
1086f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the <code>Object</code> that was registered with
1087f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <code>ID</code>, or <code>null</code> if none was
1088f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #registerInstance
1089f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @see #registerFactory
1090f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
1091f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1092f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static void U_EXPORT2 unregister(const UnicodeString& ID);
1093f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1094f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
1095f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1096f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1097f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a StringEnumeration over the IDs available at the time of the
1098f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * call, including user-registered IDs.
1099f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ec input-output error code
1100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return a newly-created StringEnumeration over the transliterators
1101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * available at the time of the call. The caller should delete this object
1102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * when done using it.
1103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 3.0
1104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static StringEnumeration* U_EXPORT2 getAvailableIDs(UErrorCode& ec);
1106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the number of registered source specifiers.
1109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the number of registered source specifiers.
1110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
1111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static int32_t U_EXPORT2 countAvailableSources(void);
1113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a registered source specifier.
1116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index which specifier to return, from 0 to n-1, where
1117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * n = countAvailableSources()
1118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result fill-in paramter to receive the source specifier.
1119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * If index is out of range, result will be empty.
1120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return reference to result
1121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
1122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UnicodeString& U_EXPORT2 getAvailableSource(int32_t index,
1124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                             UnicodeString& result);
1125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the number of registered target specifiers for a given
1128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * source specifier.
1129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param source the given source specifier.
1130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the number of registered target specifiers for a given
1131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *         source specifier.
1132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
1133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static int32_t U_EXPORT2 countAvailableTargets(const UnicodeString& source);
1135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a registered target specifier for a given source.
1138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index which specifier to return, from 0 to n-1, where
1139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * n = countAvailableTargets(source)
1140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param source the source specifier
1141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result fill-in paramter to receive the target specifier.
1142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * If source is invalid or if index is out of range, result will
1143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * be empty.
1144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return reference to result
1145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
1146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UnicodeString& U_EXPORT2 getAvailableTarget(int32_t index,
1148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                             const UnicodeString& source,
1149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                             UnicodeString& result);
1150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the number of registered variant specifiers for a given
1153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * source-target pair.
1154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param source    the source specifiers.
1155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param target    the target specifiers.
1156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
1157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static int32_t U_EXPORT2 countAvailableVariants(const UnicodeString& source,
1159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                          const UnicodeString& target);
1160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a registered variant specifier for a given source-target
1163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * pair.
1164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index which specifier to return, from 0 to n-1, where
1165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * n = countAvailableVariants(source, target)
1166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param source the source specifier
1167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param target the target specifier
1168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result fill-in paramter to receive the variant
1169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * specifier.  If source is invalid or if target is invalid or if
1170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * index is out of range, result will be empty.
1171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return reference to result
1172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
1173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UnicodeString& U_EXPORT2 getAvailableVariant(int32_t index,
1175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                              const UnicodeString& source,
1176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                              const UnicodeString& target,
1177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                              UnicodeString& result);
1178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)protected:
1180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Non-mutexed internal method
1183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static int32_t _countAvailableSources(void);
1186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Non-mutexed internal method
1189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UnicodeString& _getAvailableSource(int32_t index,
1192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                              UnicodeString& result);
1193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Non-mutexed internal method
1196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static int32_t _countAvailableTargets(const UnicodeString& source);
1199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Non-mutexed internal method
1202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UnicodeString& _getAvailableTarget(int32_t index,
1205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                              const UnicodeString& source,
1206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                              UnicodeString& result);
1207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Non-mutexed internal method
1210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static int32_t _countAvailableVariants(const UnicodeString& source,
1213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                           const UnicodeString& target);
1214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Non-mutexed internal method
1217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
1218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UnicodeString& _getAvailableVariant(int32_t index,
1220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                               const UnicodeString& source,
1221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                               const UnicodeString& target,
1222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                               UnicodeString& result);
1223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)protected:
1225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Set the ID of this transliterators.  Subclasses shouldn't do
1228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * this, unless the underlying script behavior has changed.
1229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param id the new id t to be set.
1230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.4
1231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void setID(const UnicodeString& id);
1233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
1235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the class ID for this class.  This is useful only for
1238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * comparing to a return value from getDynamicClassID().
1239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Note that Transliterator is an abstract base class, and therefor
1240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * no fully constructed object will  have a dynamic
1241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * UCLassID that equals the UClassID returned from
1242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TRansliterator::getStaticClassID().
1243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return       The class ID for class Transliterator.
1244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
1245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UClassID U_EXPORT2 getStaticClassID(void);
1247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Returns a unique class ID <b>polymorphically</b>.  This method
1250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * is to implement a simple version of RTTI, since not all C++
1251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * compilers support genuine RTTI.  Polymorphic operator==() and
1252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * clone() methods call this method.
1253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * <p>Concrete subclasses of Transliterator must use the
1255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *    UOBJECT_DEFINE_RTTI_IMPLEMENTATION macro from
1256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *    uobject.h to provide the RTTI functions.
1257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return The class ID for this object. All objects of a given
1259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * class have the same class ID.  Objects of other classes have
1260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * different class IDs.
1261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 2.0
1262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UClassID getDynamicClassID(void) const = 0;
1264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)private:
1266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UBool initializeRegistry(UErrorCode &status);
1267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
1269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the number of IDs currently registered with the system.
1271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * To retrieve the actual IDs, call getAvailableID(i) with
1272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * i from 0 to countAvailableIDs() - 1.
1273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the number of IDs currently registered with the system.
1274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @obsolete ICU 3.4 use getAvailableIDs() instead
1275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static int32_t U_EXPORT2 countAvailableIDs(void);
1277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
1279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the index-th available ID.  index must be between 0
1280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * and countAvailableIDs() - 1, inclusive.  If index is out of
1281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * range, the result of getAvailableID(0) is returned.
1282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index the given ID index.
1283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return      the index-th available ID.  index must be between 0
1284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *              and countAvailableIDs() - 1, inclusive.  If index is out of
1285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *              range, the result of getAvailableID(0) is returned.
1286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @obsolete ICU 3.4 use getAvailableIDs() instead; this function
1287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * is not thread safe, since it returns a reference to storage that
1288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * may become invalid if another thread calls unregister
1289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static const UnicodeString& U_EXPORT2 getAvailableID(int32_t index);
1291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
1292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline int32_t Transliterator::getMaximumContextLength(void) const {
1294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return maximumContextLength;
1295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline void Transliterator::setID(const UnicodeString& id) {
1298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ID = id;
1299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    // NUL-terminate the ID string, which is a non-aliased copy.
1300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ID.append((UChar)0);
1301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ID.truncate(ID.length()-1);
1302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline Transliterator::Token Transliterator::integerToken(int32_t i) {
1305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Token t;
1306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    t.integer = i;
1307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return t;
1308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)inline Transliterator::Token Transliterator::pointerToken(void* p) {
1311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Token t;
1312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    t.pointer = p;
1313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return t;
1314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_END
1317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif /* #if !UCONFIG_NO_TRANSLITERATION */
1319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
1321