1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   Copyright (c) 2001-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)*   08/10/2001  aliu        Creation.
8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifndef _TRANSREG_H
11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define _TRANSREG_H
12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h"
14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_TRANSLITERATION
16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/uobject.h"
18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/translit.h"
19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "hash.h"
20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "uvector.h"
21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_BEGIN
23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class TransliteratorEntry;
25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class TransliteratorSpec;
26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class UnicodeString;
27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//------------------------------------------------------------------
29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// TransliteratorAlias
30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//------------------------------------------------------------------
31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * A TransliteratorAlias object is returned by get() if the given ID
34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * actually translates into something else.  The caller then invokes
35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the create() method on the alias to create the actual
36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterator, and deletes the alias.
37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Why all the shenanigans?  To prevent circular calls between
39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the registry code and the transliterator code that deadlocks.
40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class TransliteratorAlias : public UMemory {
42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) public:
43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Construct a simple alias (type == SIMPLE)
45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param aliasID the given id.
46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorAlias(const UnicodeString& aliasID, const UnicodeSet* compoundFilter);
48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Construct a compound RBT alias (type == COMPOUND)
51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorAlias(const UnicodeString& ID, const UnicodeString& idBlocks,
53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        UVector* adoptedTransliterators,
54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        const UnicodeSet* compoundFilter);
55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Construct a rules alias (type = RULES)
58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorAlias(const UnicodeString& theID,
60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        const UnicodeString& rules,
61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        UTransDirection dir);
62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ~TransliteratorAlias();
64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The whole point of create() is that the caller must invoke
67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * it when the registry mutex is NOT held, to prevent deadlock.
68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * It may only be called once.
69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Note: Only call create() if isRuleBased() returns FALSE.
71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This method must be called *outside* of the TransliteratorRegistry
73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * mutex.
74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Transliterator* create(UParseError&, UErrorCode&);
76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return TRUE if this alias is rule-based.  If so, the caller
79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * must call parse() on it, then call TransliteratorRegistry::reget().
80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool isRuleBased() const;
82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * If isRuleBased() returns TRUE, then the caller must call this
85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * method, followed by TransliteratorRegistry::reget().  The latter
86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * method must be called inside the TransliteratorRegistry mutex.
87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Note: Only call parse() if isRuleBased() returns TRUE.
89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This method must be called *outside* of the TransliteratorRegistry
91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * mutex, because it can instantiate Transliterators embedded in
92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the rules via the "&Latin-Arabic()" syntax.
93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void parse(TransliteratorParser& parser,
95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)               UParseError& pe, UErrorCode& ec) const;
96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) private:
98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    // We actually come in three flavors:
99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    // 1. Simple alias
100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //    Here aliasID is the alias string.  Everything else is
101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //    null, zero, empty.
102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    // 2. CompoundRBT
103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //    Here ID is the ID, aliasID is the idBlock, trans is the
104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //    contained RBT, and idSplitPoint is the offet in aliasID
105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //    where the contained RBT goes.  compoundFilter is the
106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //    compound filter, and it is _not_ owned.
107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    // 3. Rules
108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //    Here ID is the ID, aliasID is the rules string.
109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //    idSplitPoint is the UTransDirection.
110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString ID;
111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString aliasesOrRules;
112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UVector* transes; // owned
113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UnicodeSet* compoundFilter; // alias
114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UTransDirection direction;
115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    enum { SIMPLE, COMPOUND, RULES } type;
116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorAlias(const TransliteratorAlias &other); // forbid copying of this class
118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorAlias &operator=(const TransliteratorAlias &other); // forbid copying of this class
119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * A registry of system transliterators.  This is the data structure
124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * that implements the mapping between transliterator IDs and the data
125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * or function pointers used to create the corresponding
126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * transliterators.  There is one instance of the registry that is
127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * created statically.
128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The registry consists of a dynamic component -- a hashtable -- and
130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * a static component -- locale resource bundles.  The dynamic store
131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * is semantically overlaid on the static store, so the static mapping
132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * can be dynamically overridden.
133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * This is an internal class that is only used by Transliterator.
135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Transliterator maintains one static instance of this class and
136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * delegates all registry-related operations to it.
137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @author Alan Liu
139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class TransliteratorRegistry : public UMemory {
141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) public:
143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Contructor
146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status Output param set to success/failure code.
147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorRegistry(UErrorCode& status);
149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Nonvirtual destructor -- this class is not subclassable.
152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ~TransliteratorRegistry();
154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //------------------------------------------------------------------
156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    // Basic public API
157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //------------------------------------------------------------------
158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Given a simple ID (forward direction, no inline filter, not
161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * compound) attempt to instantiate it from the registry.  Return
162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * 0 on failure.
163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a non-NULL aliasReturn value if the ID points to an alias.
165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * We cannot instantiate it ourselves because the alias may contain
166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * filters or compounds, which we do not understand.  Caller should
167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * make aliasReturn NULL before calling.
168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID          the given ID
169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param aliasReturn output param to receive TransliteratorAlias;
170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                    should be NULL on entry
171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param parseError  Struct to recieve information on position
172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                    of error if an error is encountered
173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status      Output param set to success/failure code.
174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Transliterator* get(const UnicodeString& ID,
176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        TransliteratorAlias*& aliasReturn,
177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        UErrorCode& status);
178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The caller must call this after calling get(), if [a] calling get()
181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * returns an alias, and [b] the alias is rule based.  In that
182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * situation the caller must call alias->parse() to do the parsing
183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * OUTSIDE THE REGISTRY MUTEX, then call this method to retry
184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * instantiating the transliterator.
185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Note: Another alias might be returned by this method.
187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This method (like all public methods of this class) must be called
189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * from within the TransliteratorRegistry mutex.
190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param aliasReturn output param to receive TransliteratorAlias;
192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                    should be NULL on entry
193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Transliterator* reget(const UnicodeString& ID,
195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                          TransliteratorParser& parser,
196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                          TransliteratorAlias*& aliasReturn,
197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                          UErrorCode& status);
198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Register a prototype (adopted).  This adds an entry to the
201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * dynamic store, or replaces an existing entry.  Any entry in the
202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * underlying static locale resource store is masked.
203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void put(Transliterator* adoptedProto,
205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UBool visible,
206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UErrorCode& ec);
207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Register an ID and a factory function pointer.  This adds an
210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * entry to the dynamic store, or replaces an existing entry.  Any
211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * entry in the underlying static locale resource store is masked.
212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void put(const UnicodeString& ID,
214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             Transliterator::Factory factory,
215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             Transliterator::Token context,
216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UBool visible,
217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UErrorCode& ec);
218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Register an ID and a resource name.  This adds an entry to the
221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * dynamic store, or replaces an existing entry.  Any entry in the
222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * underlying static locale resource store is masked.
223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void put(const UnicodeString& ID,
225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             const UnicodeString& resourceName,
226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UTransDirection dir,
227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UBool readonlyResourceAlias,
228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UBool visible,
229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UErrorCode& ec);
230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Register an ID and an alias ID.  This adds an entry to the
233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * dynamic store, or replaces an existing entry.  Any entry in the
234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * underlying static locale resource store is masked.
235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void put(const UnicodeString& ID,
237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             const UnicodeString& alias,
238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UBool readonlyAliasAlias,
239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UBool visible,
240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             UErrorCode& ec);
241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Unregister an ID.  This removes an entry from the dynamic store
244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * if there is one.  The static locale resource store is
245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * unaffected.
246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param ID    the given ID.
247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void remove(const UnicodeString& ID);
249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //------------------------------------------------------------------
251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    // Public ID and spec management
252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //------------------------------------------------------------------
253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a StringEnumeration over the IDs currently registered
256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * with the system.
257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    StringEnumeration* getAvailableIDs() const;
260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * == OBSOLETE - remove in ICU 3.4 ==
263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the number of IDs currently registered with the system.
264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * To retrieve the actual IDs, call getAvailableID(i) with
265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * i from 0 to countAvailableIDs() - 1.
266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the number of IDs currently registered with the system.
267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t countAvailableIDs(void) const;
270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * == OBSOLETE - remove in ICU 3.4 ==
273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the index-th available ID.  index must be between 0
274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * and countAvailableIDs() - 1, inclusive.  If index is out of
275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * range, the result of getAvailableID(0) is returned.
276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index the given index.
277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the index-th available ID.  index must be between 0
278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *         and countAvailableIDs() - 1, inclusive.  If index is out of
279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *         range, the result of getAvailableID(0) is returned.
280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @internal
281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UnicodeString& getAvailableID(int32_t index) const;
283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the number of registered source specifiers.
286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the number of registered source specifiers.
287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t countAvailableSources(void) const;
289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a registered source specifier.
292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index which specifier to return, from 0 to n-1, where
293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * n = countAvailableSources()
294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result fill-in paramter to receive the source specifier.
295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * If index is out of range, result will be empty.
296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return reference to result
297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString& getAvailableSource(int32_t index,
299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                      UnicodeString& result) const;
300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the number of registered target specifiers for a given
303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * source specifier.
304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param source the given source specifier.
305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the number of registered target specifiers for a given
306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *         source specifier.
307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t countAvailableTargets(const UnicodeString& source) const;
309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a registered target specifier for a given source.
312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index which specifier to return, from 0 to n-1, where
313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * n = countAvailableTargets(source)
314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param source the source specifier
315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result fill-in paramter to receive the target specifier.
316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * If source is invalid or if index is out of range, result will
317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * be empty.
318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return reference to result
319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString& getAvailableTarget(int32_t index,
321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                      const UnicodeString& source,
322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                      UnicodeString& result) const;
323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return the number of registered variant specifiers for a given
326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * source-target pair.  There is always at least one variant: If
327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * just source-target is registered, then the single variant
328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * NO_VARIANT is returned.  If source-target/variant is registered
329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * then that variant is returned.
330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param source the source specifiers
331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param target the target specifiers
332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return the number of registered variant specifiers for a given
333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *         source-target pair.
334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t countAvailableVariants(const UnicodeString& source,
336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                   const UnicodeString& target) const;
337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return a registered variant specifier for a given source-target
340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * pair.  If NO_VARIANT is one of the variants, then it will be
341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * at index 0.
342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param index which specifier to return, from 0 to n-1, where
343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * n = countAvailableVariants(source, target)
344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param source the source specifier
345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param target the target specifier
346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param result fill-in paramter to receive the variant
347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * specifier.  If source is invalid or if target is invalid or if
348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * index is out of range, result will be empty.
349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return reference to result
350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString& getAvailableVariant(int32_t index,
352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       const UnicodeString& source,
353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       const UnicodeString& target,
354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       UnicodeString& result) const;
355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) private:
357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //----------------------------------------------------------------
359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    // Private implementation
360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    //----------------------------------------------------------------
361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorEntry* find(const UnicodeString& ID);
363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorEntry* find(UnicodeString& source,
365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                UnicodeString& target,
366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                UnicodeString& variant);
367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorEntry* findInDynamicStore(const TransliteratorSpec& src,
369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                              const TransliteratorSpec& trg,
370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                              const UnicodeString& variant) const;
371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorEntry* findInStaticStore(const TransliteratorSpec& src,
373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                             const TransliteratorSpec& trg,
374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                             const UnicodeString& variant);
375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static TransliteratorEntry* findInBundle(const TransliteratorSpec& specToOpen,
377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                               const TransliteratorSpec& specToFind,
378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                               const UnicodeString& variant,
379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                               UTransDirection direction);
380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void registerEntry(const UnicodeString& source,
382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       const UnicodeString& target,
383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       const UnicodeString& variant,
384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       TransliteratorEntry* adopted,
385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       UBool visible);
386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void registerEntry(const UnicodeString& ID,
388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       TransliteratorEntry* adopted,
389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       UBool visible);
390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void registerEntry(const UnicodeString& ID,
392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       const UnicodeString& source,
393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       const UnicodeString& target,
394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       const UnicodeString& variant,
395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       TransliteratorEntry* adopted,
396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       UBool visible);
397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void registerSTV(const UnicodeString& source,
399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     const UnicodeString& target,
400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     const UnicodeString& variant);
401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void removeSTV(const UnicodeString& source,
403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                   const UnicodeString& target,
404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                   const UnicodeString& variant);
405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Transliterator* instantiateEntry(const UnicodeString& ID,
407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                     TransliteratorEntry *entry,
408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                     TransliteratorAlias*& aliasReturn,
409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                     UErrorCode& status);
410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * A StringEnumeration over the registered IDs in this object.
413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    class Enumeration : public StringEnumeration {
415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    public:
416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        Enumeration(const TransliteratorRegistry& reg);
417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        virtual ~Enumeration();
418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        virtual int32_t count(UErrorCode& status) const;
419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        virtual const UnicodeString* snext(UErrorCode& status);
420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        virtual void reset(UErrorCode& status);
421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        static UClassID U_EXPORT2 getStaticClassID();
422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        virtual UClassID getDynamicClassID() const;
423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    private:
424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        int32_t index;
425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        const TransliteratorRegistry& reg;
426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    };
427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    friend class Enumeration;
428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) private:
430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Dynamic registry mapping full IDs to Entry objects.  This
433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * contains both public and internal entities.  The visibility is
434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * controlled by whether an entry is listed in availableIDs and
435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * specDAG or not.
436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Hashtable registry;
438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * DAG of visible IDs by spec.  Hashtable: source => (Hashtable:
441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * target => (UVector: variant)) The UVector of variants is never
442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * empty.  For a source-target with no variant, the special
443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * variant NO_VARIANT (the empty string) is stored in slot zero of
444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the UVector.
445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Hashtable specDAG;
447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Vector of public full IDs.
450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UVector availableIDs;
452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorRegistry(const TransliteratorRegistry &other); // forbid copying of this class
454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    TransliteratorRegistry &operator=(const TransliteratorRegistry &other); // forbid copying of this class
455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_END
458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif /* #if !UCONFIG_NO_TRANSLITERATION */
460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//eof
463