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