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-2007, 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 RBT_H 13*0e209d39SAndroid Build Coastguard Worker #define RBT_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 #include "unicode/utypes.h" 21*0e209d39SAndroid Build Coastguard Worker #include "unicode/parseerr.h" 22*0e209d39SAndroid Build Coastguard Worker #include "unicode/udata.h" 23*0e209d39SAndroid Build Coastguard Worker 24*0e209d39SAndroid Build Coastguard Worker #define U_ICUDATA_TRANSLIT U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "translit" 25*0e209d39SAndroid Build Coastguard Worker 26*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 27*0e209d39SAndroid Build Coastguard Worker 28*0e209d39SAndroid Build Coastguard Worker class TransliterationRuleData; 29*0e209d39SAndroid Build Coastguard Worker 30*0e209d39SAndroid Build Coastguard Worker /** 31*0e209d39SAndroid Build Coastguard Worker * <code>RuleBasedTransliterator</code> is a transliterator 32*0e209d39SAndroid Build Coastguard Worker * built from a set of rules as defined for 33*0e209d39SAndroid Build Coastguard Worker * Transliterator::createFromRules(). 34*0e209d39SAndroid Build Coastguard Worker * See the C++ class Transliterator documentation for the rule syntax. 35*0e209d39SAndroid Build Coastguard Worker * 36*0e209d39SAndroid Build Coastguard Worker * @author Alan Liu 37*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 38*0e209d39SAndroid Build Coastguard Worker */ 39*0e209d39SAndroid Build Coastguard Worker class RuleBasedTransliterator : public Transliterator { 40*0e209d39SAndroid Build Coastguard Worker private: 41*0e209d39SAndroid Build Coastguard Worker /** 42*0e209d39SAndroid Build Coastguard Worker * The data object is immutable, so we can freely share it with 43*0e209d39SAndroid Build Coastguard Worker * other instances of RBT, as long as we do NOT own this object. 44*0e209d39SAndroid Build Coastguard Worker * TODO: data is no longer immutable. See bugs #1866, 2155 45*0e209d39SAndroid Build Coastguard Worker */ 46*0e209d39SAndroid Build Coastguard Worker TransliterationRuleData* fData; 47*0e209d39SAndroid Build Coastguard Worker 48*0e209d39SAndroid Build Coastguard Worker /** 49*0e209d39SAndroid Build Coastguard Worker * If true, we own the data object and must delete it. 50*0e209d39SAndroid Build Coastguard Worker */ 51*0e209d39SAndroid Build Coastguard Worker UBool isDataOwned; 52*0e209d39SAndroid Build Coastguard Worker 53*0e209d39SAndroid Build Coastguard Worker public: 54*0e209d39SAndroid Build Coastguard Worker 55*0e209d39SAndroid Build Coastguard Worker /** 56*0e209d39SAndroid Build Coastguard Worker * Constructs a new transliterator from the given rules. 57*0e209d39SAndroid Build Coastguard Worker * @param rules rules, separated by ';' 58*0e209d39SAndroid Build Coastguard Worker * @param direction either FORWARD or REVERSE. 59*0e209d39SAndroid Build Coastguard Worker * @exception IllegalArgumentException if rules are malformed. 60*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 61*0e209d39SAndroid Build Coastguard Worker */ 62*0e209d39SAndroid Build Coastguard Worker RuleBasedTransliterator(const UnicodeString& id, 63*0e209d39SAndroid Build Coastguard Worker const UnicodeString& rules, 64*0e209d39SAndroid Build Coastguard Worker UTransDirection direction, 65*0e209d39SAndroid Build Coastguard Worker UnicodeFilter* adoptedFilter, 66*0e209d39SAndroid Build Coastguard Worker UParseError& parseError, 67*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 68*0e209d39SAndroid Build Coastguard Worker 69*0e209d39SAndroid Build Coastguard Worker /** 70*0e209d39SAndroid Build Coastguard Worker * Constructs a new transliterator from the given rules. 71*0e209d39SAndroid Build Coastguard Worker * @param rules rules, separated by ';' 72*0e209d39SAndroid Build Coastguard Worker * @param direction either FORWARD or REVERSE. 73*0e209d39SAndroid Build Coastguard Worker * @exception IllegalArgumentException if rules are malformed. 74*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 75*0e209d39SAndroid Build Coastguard Worker */ 76*0e209d39SAndroid Build Coastguard Worker /*RuleBasedTransliterator(const UnicodeString& id, 77*0e209d39SAndroid Build Coastguard Worker const UnicodeString& rules, 78*0e209d39SAndroid Build Coastguard Worker UTransDirection direction, 79*0e209d39SAndroid Build Coastguard Worker UnicodeFilter* adoptedFilter, 80*0e209d39SAndroid Build Coastguard Worker UErrorCode& status);*/ 81*0e209d39SAndroid Build Coastguard Worker 82*0e209d39SAndroid Build Coastguard Worker /** 83*0e209d39SAndroid Build Coastguard Worker * Convenience constructor with no filter. 84*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 85*0e209d39SAndroid Build Coastguard Worker */ 86*0e209d39SAndroid Build Coastguard Worker /*RuleBasedTransliterator(const UnicodeString& id, 87*0e209d39SAndroid Build Coastguard Worker const UnicodeString& rules, 88*0e209d39SAndroid Build Coastguard Worker UTransDirection direction, 89*0e209d39SAndroid Build Coastguard Worker UErrorCode& status);*/ 90*0e209d39SAndroid Build Coastguard Worker 91*0e209d39SAndroid Build Coastguard Worker /** 92*0e209d39SAndroid Build Coastguard Worker * Convenience constructor with no filter and FORWARD direction. 93*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 94*0e209d39SAndroid Build Coastguard Worker */ 95*0e209d39SAndroid Build Coastguard Worker /*RuleBasedTransliterator(const UnicodeString& id, 96*0e209d39SAndroid Build Coastguard Worker const UnicodeString& rules, 97*0e209d39SAndroid Build Coastguard Worker UErrorCode& status);*/ 98*0e209d39SAndroid Build Coastguard Worker 99*0e209d39SAndroid Build Coastguard Worker /** 100*0e209d39SAndroid Build Coastguard Worker * Convenience constructor with FORWARD direction. 101*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 102*0e209d39SAndroid Build Coastguard Worker */ 103*0e209d39SAndroid Build Coastguard Worker /*RuleBasedTransliterator(const UnicodeString& id, 104*0e209d39SAndroid Build Coastguard Worker const UnicodeString& rules, 105*0e209d39SAndroid Build Coastguard Worker UnicodeFilter* adoptedFilter, 106*0e209d39SAndroid Build Coastguard Worker UErrorCode& status);*/ 107*0e209d39SAndroid Build Coastguard Worker private: 108*0e209d39SAndroid Build Coastguard Worker 109*0e209d39SAndroid Build Coastguard Worker friend class TransliteratorRegistry; // to access TransliterationRuleData convenience ctor 110*0e209d39SAndroid Build Coastguard Worker /** 111*0e209d39SAndroid Build Coastguard Worker * Convenience constructor. 112*0e209d39SAndroid Build Coastguard Worker * @param id the id for the transliterator. 113*0e209d39SAndroid Build Coastguard Worker * @param theData the rule data for the transliterator. 114*0e209d39SAndroid Build Coastguard Worker * @param adoptedFilter the filter for the transliterator 115*0e209d39SAndroid Build Coastguard Worker */ 116*0e209d39SAndroid Build Coastguard Worker RuleBasedTransliterator(const UnicodeString& id, 117*0e209d39SAndroid Build Coastguard Worker const TransliterationRuleData* theData, 118*0e209d39SAndroid Build Coastguard Worker UnicodeFilter* adoptedFilter = nullptr); 119*0e209d39SAndroid Build Coastguard Worker 120*0e209d39SAndroid Build Coastguard Worker 121*0e209d39SAndroid Build Coastguard Worker friend class Transliterator; // to access following ct 122*0e209d39SAndroid Build Coastguard Worker 123*0e209d39SAndroid Build Coastguard Worker /** 124*0e209d39SAndroid Build Coastguard Worker * Internal constructor. 125*0e209d39SAndroid Build Coastguard Worker * @param id the id for the transliterator. 126*0e209d39SAndroid Build Coastguard Worker * @param theData the rule data for the transliterator. 127*0e209d39SAndroid Build Coastguard Worker * @param isDataAdopted determine who will own the 'data' object. True, the caller should not delete 'data'. 128*0e209d39SAndroid Build Coastguard Worker */ 129*0e209d39SAndroid Build Coastguard Worker RuleBasedTransliterator(const UnicodeString& id, 130*0e209d39SAndroid Build Coastguard Worker TransliterationRuleData* data, 131*0e209d39SAndroid Build Coastguard Worker UBool isDataAdopted); 132*0e209d39SAndroid Build Coastguard Worker 133*0e209d39SAndroid Build Coastguard Worker public: 134*0e209d39SAndroid Build Coastguard Worker 135*0e209d39SAndroid Build Coastguard Worker /** 136*0e209d39SAndroid Build Coastguard Worker * Copy constructor. 137*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 138*0e209d39SAndroid Build Coastguard Worker */ 139*0e209d39SAndroid Build Coastguard Worker RuleBasedTransliterator(const RuleBasedTransliterator&); 140*0e209d39SAndroid Build Coastguard Worker 141*0e209d39SAndroid Build Coastguard Worker virtual ~RuleBasedTransliterator(); 142*0e209d39SAndroid Build Coastguard Worker 143*0e209d39SAndroid Build Coastguard Worker /** 144*0e209d39SAndroid Build Coastguard Worker * Implement Transliterator API. 145*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 146*0e209d39SAndroid Build Coastguard Worker */ 147*0e209d39SAndroid Build Coastguard Worker virtual RuleBasedTransliterator* clone() const override; 148*0e209d39SAndroid Build Coastguard Worker 149*0e209d39SAndroid Build Coastguard Worker protected: 150*0e209d39SAndroid Build Coastguard Worker /** 151*0e209d39SAndroid Build Coastguard Worker * Implements {@link Transliterator#handleTransliterate}. 152*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 153*0e209d39SAndroid Build Coastguard Worker */ 154*0e209d39SAndroid Build Coastguard Worker virtual void handleTransliterate(Replaceable& text, UTransPosition& offsets, 155*0e209d39SAndroid Build Coastguard Worker UBool isIncremental) const override; 156*0e209d39SAndroid Build Coastguard Worker 157*0e209d39SAndroid Build Coastguard Worker public: 158*0e209d39SAndroid Build Coastguard Worker /** 159*0e209d39SAndroid Build Coastguard Worker * Return a representation of this transliterator as source rules. 160*0e209d39SAndroid Build Coastguard Worker * These rules will produce an equivalent transliterator if used 161*0e209d39SAndroid Build Coastguard Worker * to construct a new transliterator. 162*0e209d39SAndroid Build Coastguard Worker * @param result the string to receive the rules. Previous 163*0e209d39SAndroid Build Coastguard Worker * contents will be deleted. 164*0e209d39SAndroid Build Coastguard Worker * @param escapeUnprintable if true then convert unprintable 165*0e209d39SAndroid Build Coastguard Worker * character to their hex escape representations, \uxxxx or 166*0e209d39SAndroid Build Coastguard Worker * \Uxxxxxxxx. Unprintable characters are those other than 167*0e209d39SAndroid Build Coastguard Worker * U+000A, U+0020..U+007E. 168*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 169*0e209d39SAndroid Build Coastguard Worker */ 170*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& toRules(UnicodeString& result, 171*0e209d39SAndroid Build Coastguard Worker UBool escapeUnprintable) const override; 172*0e209d39SAndroid Build Coastguard Worker 173*0e209d39SAndroid Build Coastguard Worker protected: 174*0e209d39SAndroid Build Coastguard Worker /** 175*0e209d39SAndroid Build Coastguard Worker * Implement Transliterator framework 176*0e209d39SAndroid Build Coastguard Worker */ 177*0e209d39SAndroid Build Coastguard Worker virtual void handleGetSourceSet(UnicodeSet& result) const override; 178*0e209d39SAndroid Build Coastguard Worker 179*0e209d39SAndroid Build Coastguard Worker public: 180*0e209d39SAndroid Build Coastguard Worker /** 181*0e209d39SAndroid Build Coastguard Worker * Override Transliterator framework 182*0e209d39SAndroid Build Coastguard Worker */ 183*0e209d39SAndroid Build Coastguard Worker virtual UnicodeSet& getTargetSet(UnicodeSet& result) const override; 184*0e209d39SAndroid Build Coastguard Worker 185*0e209d39SAndroid Build Coastguard Worker /** 186*0e209d39SAndroid Build Coastguard Worker * Return the class ID for this class. This is useful only for 187*0e209d39SAndroid Build Coastguard Worker * comparing to a return value from getDynamicClassID(). For example: 188*0e209d39SAndroid Build Coastguard Worker * <pre> 189*0e209d39SAndroid Build Coastguard Worker * . Base* polymorphic_pointer = createPolymorphicObject(); 190*0e209d39SAndroid Build Coastguard Worker * . if (polymorphic_pointer->getDynamicClassID() == 191*0e209d39SAndroid Build Coastguard Worker * . Derived::getStaticClassID()) ... 192*0e209d39SAndroid Build Coastguard Worker * </pre> 193*0e209d39SAndroid Build Coastguard Worker * @return The class ID for all objects of this class. 194*0e209d39SAndroid Build Coastguard Worker * @internal Use transliterator factory methods instead since this class will be removed in that release. 195*0e209d39SAndroid Build Coastguard Worker */ 196*0e209d39SAndroid Build Coastguard Worker U_I18N_API static UClassID U_EXPORT2 getStaticClassID(); 197*0e209d39SAndroid Build Coastguard Worker 198*0e209d39SAndroid Build Coastguard Worker /** 199*0e209d39SAndroid Build Coastguard Worker * Returns a unique class ID <b>polymorphically</b>. This method 200*0e209d39SAndroid Build Coastguard Worker * is to implement a simple version of RTTI, since not all C++ 201*0e209d39SAndroid Build Coastguard Worker * compilers support genuine RTTI. Polymorphic operator==() and 202*0e209d39SAndroid Build Coastguard Worker * clone() methods call this method. 203*0e209d39SAndroid Build Coastguard Worker * 204*0e209d39SAndroid Build Coastguard Worker * @return The class ID for this object. All objects of a given 205*0e209d39SAndroid Build Coastguard Worker * class have the same class ID. Objects of other classes have 206*0e209d39SAndroid Build Coastguard Worker * different class IDs. 207*0e209d39SAndroid Build Coastguard Worker */ 208*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 209*0e209d39SAndroid Build Coastguard Worker 210*0e209d39SAndroid Build Coastguard Worker private: 211*0e209d39SAndroid Build Coastguard Worker 212*0e209d39SAndroid Build Coastguard Worker void _construct(const UnicodeString& rules, 213*0e209d39SAndroid Build Coastguard Worker UTransDirection direction, 214*0e209d39SAndroid Build Coastguard Worker UParseError& parseError, 215*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 216*0e209d39SAndroid Build Coastguard Worker }; 217*0e209d39SAndroid Build Coastguard Worker 218*0e209d39SAndroid Build Coastguard Worker 219*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 220*0e209d39SAndroid Build Coastguard Worker 221*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_TRANSLITERATION */ 222*0e209d39SAndroid Build Coastguard Worker 223*0e209d39SAndroid Build Coastguard Worker #endif 224