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