1/*
2***********************************************************************
3* Copyright (c) 2002-2007, International Business Machines Corporation
4* and others.  All Rights Reserved.
5***********************************************************************
6* Date        Name        Description
7* 06/06/2002  aliu        Creation.
8***********************************************************************
9*/
10#ifndef _ANYTRANS_H_
11#define _ANYTRANS_H_
12
13#include "unicode/utypes.h"
14
15#if !UCONFIG_NO_TRANSLITERATION
16
17#include "unicode/translit.h"
18#include "unicode/uscript.h"
19#include "uhash.h"
20
21U_NAMESPACE_BEGIN
22
23/**
24 * A transliterator named Any-T or Any-T/V, where T is the target
25 * script and V is the optional variant, that uses multiple
26 * transliterators, all going to T or T/V, all with script sources.
27 * The target must be a script.  It partitions text into runs of the
28 * same script, and then based on the script of each run,
29 * transliterates from that script to the given target or
30 * target/variant.  Adjacent COMMON or INHERITED script characters are
31 * included in each run.
32 *
33 * @author Alan Liu
34 */
35class AnyTransliterator : public Transliterator {
36
37    /**
38     * Cache mapping UScriptCode values to Transliterator*.
39     */
40    UHashtable* cache;
41
42    /**
43     * The target or target/variant string.
44     */
45    UnicodeString target;
46
47    /**
48     * The target script code.  Never USCRIPT_INVALID_CODE.
49     */
50    UScriptCode targetScript;
51
52public:
53
54    /**
55     * Destructor.
56     */
57    virtual ~AnyTransliterator();
58
59    /**
60     * Copy constructor.
61     */
62    AnyTransliterator(const AnyTransliterator&);
63
64    /**
65     * Transliterator API.
66     */
67    virtual Transliterator* clone() const;
68
69    /**
70     * Implements {@link Transliterator#handleTransliterate}.
71     */
72    virtual void handleTransliterate(Replaceable& text, UTransPosition& index,
73                                     UBool incremental) const;
74
75    /**
76     * ICU "poor man's RTTI", returns a UClassID for the actual class.
77     */
78    virtual UClassID getDynamicClassID() const;
79
80    /**
81     * ICU "poor man's RTTI", returns a UClassID for this class.
82     */
83    U_I18N_API static UClassID U_EXPORT2 getStaticClassID();
84
85private:
86
87    /**
88     * Private constructor
89     * @param id the ID of the form S-T or S-T/V, where T is theTarget
90     * and V is theVariant.  Must not be empty.
91     * @param theTarget the target name.  Must not be empty, and must
92     * name a script corresponding to theTargetScript.
93     * @param theVariant the variant name, or the empty string if
94     * there is no variant
95     * @param theTargetScript the script code corresponding to
96     * theTarget.
97     * @param ec error code, fails if the internal hashtable cannot be
98     * allocated
99     */
100    AnyTransliterator(const UnicodeString& id,
101                      const UnicodeString& theTarget,
102                      const UnicodeString& theVariant,
103                      UScriptCode theTargetScript,
104                      UErrorCode& ec);
105
106    /**
107     * Returns a transliterator from the given source to our target or
108     * target/variant.  Returns NULL if the source is the same as our
109     * target script, or if the source is USCRIPT_INVALID_CODE.
110     * Caches the result and returns the same transliterator the next
111     * time.  The caller does NOT own the result and must not delete
112     * it.
113     */
114    Transliterator* getTransliterator(UScriptCode source) const;
115
116    /**
117     * Registers standard transliterators with the system.  Called by
118     * Transliterator during initialization.
119     */
120    static void registerIDs();
121
122    friend class Transliterator; // for registerIDs()
123};
124
125U_NAMESPACE_END
126
127#endif /* #if !UCONFIG_NO_TRANSLITERATION */
128
129#endif
130