1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 **********************************************************************
5 *   Copyright (C) 1999-2011, International Business Machines
6 *   Corporation and others.  All Rights Reserved.
7 **********************************************************************
8 *   Date        Name        Description
9 *   11/17/99    aliu        Creation.
10 **********************************************************************
11 */
12 #ifndef CPDTRANS_H
13 #define CPDTRANS_H
14 
15 #include "unicode/utypes.h"
16 
17 #if !UCONFIG_NO_TRANSLITERATION
18 
19 #include "unicode/translit.h"
20 
21 U_NAMESPACE_BEGIN
22 
23 class U_COMMON_API UVector;
24 class TransliteratorRegistry;
25 
26 /**
27  * A transliterator that is composed of two or more other
28  * transliterator objects linked together.  For example, if one
29  * transliterator transliterates from script A to script B, and
30  * another transliterates from script B to script C, the two may be
31  * combined to form a new transliterator from A to C.
32  *
33  * <p>Composed transliterators may not behave as expected.  For
34  * example, inverses may not combine to form the identity
35  * transliterator.  See the class documentation for {@link
36  * Transliterator} for details.
37  *
38  * @author Alan Liu
39  */
40 class U_I18N_API CompoundTransliterator : public Transliterator {
41 
42     Transliterator** trans;
43 
44     int32_t count;
45 
46     int32_t numAnonymousRBTs;
47 
48 public:
49 
50     /**
51      * Constructs a new compound transliterator given an array of
52      * transliterators.  The array of transliterators may be of any
53      * length, including zero or one, however, useful compound
54      * transliterators have at least two components.
55      * @param transliterators array of <code>Transliterator</code>
56      * objects
57      * @param transliteratorCount The number of
58      * <code>Transliterator</code> objects in transliterators.
59      * @param adoptedFilter the filter.  Any character for which
60      * <tt>filter.contains()</tt> returns <tt>false</tt> will not be
61      * altered by this transliterator.  If <tt>filter</tt> is
62      * <tt>null</tt> then no filtering is applied.
63      */
64     CompoundTransliterator(Transliterator* const transliterators[],
65                            int32_t transliteratorCount,
66                            UnicodeFilter* adoptedFilter = 0);
67 
68     /**
69      * Constructs a new compound transliterator.
70      * @param id compound ID
71      * @param dir either UTRANS_FORWARD or UTRANS_REVERSE
72      * @param adoptedFilter a global filter for this compound transliterator
73      * or NULL
74      */
75     CompoundTransliterator(const UnicodeString& id,
76                            UTransDirection dir,
77                            UnicodeFilter* adoptedFilter,
78                            UParseError& parseError,
79                            UErrorCode& status);
80 
81     /**
82      * Constructs a new compound transliterator in the FORWARD
83      * direction with a NULL filter.
84      */
85     CompoundTransliterator(const UnicodeString& id,
86                            UParseError& parseError,
87                            UErrorCode& status);
88     /**
89      * Destructor.
90      */
91     virtual ~CompoundTransliterator();
92 
93     /**
94      * Copy constructor.
95      */
96     CompoundTransliterator(const CompoundTransliterator&);
97 
98     /**
99      * Transliterator API.
100      */
101     virtual CompoundTransliterator* clone() const;
102 
103     /**
104      * Returns the number of transliterators in this chain.
105      * @return number of transliterators in this chain.
106      */
107     virtual int32_t getCount(void) const;
108 
109     /**
110      * Returns the transliterator at the given index in this chain.
111      * @param idx index into chain, from 0 to <code>getCount() - 1</code>
112      * @return transliterator at the given index
113      */
114     virtual const Transliterator& getTransliterator(int32_t idx) const;
115 
116     /**
117      * Sets the transliterators.
118      */
119     void setTransliterators(Transliterator* const transliterators[],
120                             int32_t count);
121 
122     /**
123      * Adopts the transliterators.
124      */
125     void adoptTransliterators(Transliterator* adoptedTransliterators[],
126                               int32_t count);
127 
128     /**
129      * Override Transliterator:
130      * Create a rule string that can be passed to createFromRules()
131      * to recreate this transliterator.
132      * @param result the string to receive the rules.  Previous
133      * contents will be deleted.
134      * @param escapeUnprintable if true then convert unprintable
135      * character to their hex escape representations, \uxxxx or
136      * \Uxxxxxxxx.  Unprintable characters are those other than
137      * U+000A, U+0020..U+007E.
138      */
139     virtual UnicodeString& toRules(UnicodeString& result,
140                                    UBool escapeUnprintable) const;
141 
142  protected:
143     /**
144      * Implement Transliterator framework
145      */
146     virtual void handleGetSourceSet(UnicodeSet& result) const;
147 
148  public:
149     /**
150      * Override Transliterator framework
151      */
152     virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
153 
154 protected:
155     /**
156      * Implements {@link Transliterator#handleTransliterate}.
157      */
158     virtual void handleTransliterate(Replaceable& text, UTransPosition& idx,
159                                      UBool incremental) const;
160 
161 public:
162 
163     /**
164      * ICU "poor man's RTTI", returns a UClassID for the actual class.
165      */
166     virtual UClassID getDynamicClassID() const;
167 
168     /**
169      * ICU "poor man's RTTI", returns a UClassID for this class.
170      */
171     static UClassID U_EXPORT2 getStaticClassID();
172 
173     /* @internal */
174     static const UChar PASS_STRING[];
175 
176 private:
177 
178     friend class Transliterator;
179     friend class TransliteratorAlias; // to access private ct
180 
181     /**
182      * Assignment operator.
183      */
184     CompoundTransliterator& operator=(const CompoundTransliterator&);
185 
186     /**
187      * Private constructor for Transliterator.
188      */
189     CompoundTransliterator(const UnicodeString& ID,
190                            UVector& list,
191                            UnicodeFilter* adoptedFilter,
192                            int32_t numAnonymousRBTs,
193                            UParseError& parseError,
194                            UErrorCode& status);
195 
196     CompoundTransliterator(UVector& list,
197                            UParseError& parseError,
198                            UErrorCode& status);
199 
200     CompoundTransliterator(UVector& list,
201                            int32_t anonymousRBTs,
202                            UParseError& parseError,
203                            UErrorCode& status);
204 
205     void init(const UnicodeString& id,
206               UTransDirection direction,
207               UBool fixReverseID,
208               UErrorCode& status);
209 
210     void init(UVector& list,
211               UTransDirection direction,
212               UBool fixReverseID,
213               UErrorCode& status);
214 
215     /**
216      * Return the IDs of the given list of transliterators, concatenated
217      * with ';' delimiting them.  Equivalent to the perlish expression
218      * join(';', map($_.getID(), transliterators).
219      */
220     UnicodeString joinIDs(Transliterator* const transliterators[],
221                           int32_t transCount);
222 
223     void freeTransliterators(void);
224 
225     void computeMaximumContextLength(void);
226 };
227 
228 U_NAMESPACE_END
229 
230 #endif /* #if !UCONFIG_NO_TRANSLITERATION */
231 
232 #endif
233