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