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) 2002-2011, International Business Machines Corporation 6*0e209d39SAndroid Build Coastguard Worker * and others. All Rights Reserved. 7*0e209d39SAndroid Build Coastguard Worker ********************************************************************** 8*0e209d39SAndroid Build Coastguard Worker * Date Name Description 9*0e209d39SAndroid Build Coastguard Worker * 01/21/2002 aliu Creation. 10*0e209d39SAndroid Build Coastguard Worker ********************************************************************** 11*0e209d39SAndroid Build Coastguard Worker */ 12*0e209d39SAndroid Build Coastguard Worker 13*0e209d39SAndroid Build Coastguard Worker #ifndef STRREPL_H 14*0e209d39SAndroid Build Coastguard Worker #define STRREPL_H 15*0e209d39SAndroid Build Coastguard Worker 16*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 17*0e209d39SAndroid Build Coastguard Worker 18*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_TRANSLITERATION 19*0e209d39SAndroid Build Coastguard Worker 20*0e209d39SAndroid Build Coastguard Worker #include "unicode/unifunct.h" 21*0e209d39SAndroid Build Coastguard Worker #include "unicode/unirepl.h" 22*0e209d39SAndroid Build Coastguard Worker #include "unicode/unistr.h" 23*0e209d39SAndroid Build Coastguard Worker 24*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 25*0e209d39SAndroid Build Coastguard Worker 26*0e209d39SAndroid Build Coastguard Worker class TransliterationRuleData; 27*0e209d39SAndroid Build Coastguard Worker 28*0e209d39SAndroid Build Coastguard Worker /** 29*0e209d39SAndroid Build Coastguard Worker * A replacer that produces static text as its output. The text may 30*0e209d39SAndroid Build Coastguard Worker * contain transliterator stand-in characters that represent nested 31*0e209d39SAndroid Build Coastguard Worker * UnicodeReplacer objects, making it possible to encode a tree of 32*0e209d39SAndroid Build Coastguard Worker * replacers in a StringReplacer. A StringReplacer that contains such 33*0e209d39SAndroid Build Coastguard Worker * stand-ins is called a <em>complex</em> StringReplacer. A complex 34*0e209d39SAndroid Build Coastguard Worker * StringReplacer has a slower processing loop than a non-complex one. 35*0e209d39SAndroid Build Coastguard Worker * @author Alan Liu 36*0e209d39SAndroid Build Coastguard Worker */ 37*0e209d39SAndroid Build Coastguard Worker class StringReplacer : public UnicodeFunctor, public UnicodeReplacer { 38*0e209d39SAndroid Build Coastguard Worker 39*0e209d39SAndroid Build Coastguard Worker private: 40*0e209d39SAndroid Build Coastguard Worker 41*0e209d39SAndroid Build Coastguard Worker /** 42*0e209d39SAndroid Build Coastguard Worker * Output text, possibly containing stand-in characters that 43*0e209d39SAndroid Build Coastguard Worker * represent nested UnicodeReplacers. 44*0e209d39SAndroid Build Coastguard Worker */ 45*0e209d39SAndroid Build Coastguard Worker UnicodeString output; 46*0e209d39SAndroid Build Coastguard Worker 47*0e209d39SAndroid Build Coastguard Worker /** 48*0e209d39SAndroid Build Coastguard Worker * Cursor position. Value is ignored if hasCursor is false. 49*0e209d39SAndroid Build Coastguard Worker */ 50*0e209d39SAndroid Build Coastguard Worker int32_t cursorPos; 51*0e209d39SAndroid Build Coastguard Worker 52*0e209d39SAndroid Build Coastguard Worker /** 53*0e209d39SAndroid Build Coastguard Worker * True if this object outputs a cursor position. 54*0e209d39SAndroid Build Coastguard Worker */ 55*0e209d39SAndroid Build Coastguard Worker UBool hasCursor; 56*0e209d39SAndroid Build Coastguard Worker 57*0e209d39SAndroid Build Coastguard Worker /** 58*0e209d39SAndroid Build Coastguard Worker * A complex object contains nested replacers and requires more 59*0e209d39SAndroid Build Coastguard Worker * complex processing. StringReplacers are initially assumed to 60*0e209d39SAndroid Build Coastguard Worker * be complex. If no nested replacers are seen during processing, 61*0e209d39SAndroid Build Coastguard Worker * then isComplex is set to false, and future replacements are 62*0e209d39SAndroid Build Coastguard Worker * short circuited for better performance. 63*0e209d39SAndroid Build Coastguard Worker */ 64*0e209d39SAndroid Build Coastguard Worker UBool isComplex; 65*0e209d39SAndroid Build Coastguard Worker 66*0e209d39SAndroid Build Coastguard Worker /** 67*0e209d39SAndroid Build Coastguard Worker * Object that translates stand-in characters in 'output' to 68*0e209d39SAndroid Build Coastguard Worker * UnicodeReplacer objects. 69*0e209d39SAndroid Build Coastguard Worker */ 70*0e209d39SAndroid Build Coastguard Worker const TransliterationRuleData* data; 71*0e209d39SAndroid Build Coastguard Worker 72*0e209d39SAndroid Build Coastguard Worker public: 73*0e209d39SAndroid Build Coastguard Worker 74*0e209d39SAndroid Build Coastguard Worker /** 75*0e209d39SAndroid Build Coastguard Worker * Construct a StringReplacer that sets the emits the given output 76*0e209d39SAndroid Build Coastguard Worker * text and sets the cursor to the given position. 77*0e209d39SAndroid Build Coastguard Worker * @param theOutput text that will replace input text when the 78*0e209d39SAndroid Build Coastguard Worker * replace() method is called. May contain stand-in characters 79*0e209d39SAndroid Build Coastguard Worker * that represent nested replacers. 80*0e209d39SAndroid Build Coastguard Worker * @param theCursorPos cursor position that will be returned by 81*0e209d39SAndroid Build Coastguard Worker * the replace() method 82*0e209d39SAndroid Build Coastguard Worker * @param theData transliterator context object that translates 83*0e209d39SAndroid Build Coastguard Worker * stand-in characters to UnicodeReplacer objects 84*0e209d39SAndroid Build Coastguard Worker */ 85*0e209d39SAndroid Build Coastguard Worker StringReplacer(const UnicodeString& theOutput, 86*0e209d39SAndroid Build Coastguard Worker int32_t theCursorPos, 87*0e209d39SAndroid Build Coastguard Worker const TransliterationRuleData* theData); 88*0e209d39SAndroid Build Coastguard Worker 89*0e209d39SAndroid Build Coastguard Worker /** 90*0e209d39SAndroid Build Coastguard Worker * Construct a StringReplacer that sets the emits the given output 91*0e209d39SAndroid Build Coastguard Worker * text and does not modify the cursor. 92*0e209d39SAndroid Build Coastguard Worker * @param theOutput text that will replace input text when the 93*0e209d39SAndroid Build Coastguard Worker * replace() method is called. May contain stand-in characters 94*0e209d39SAndroid Build Coastguard Worker * that represent nested replacers. 95*0e209d39SAndroid Build Coastguard Worker * @param theData transliterator context object that translates 96*0e209d39SAndroid Build Coastguard Worker * stand-in characters to UnicodeReplacer objects 97*0e209d39SAndroid Build Coastguard Worker */ 98*0e209d39SAndroid Build Coastguard Worker StringReplacer(const UnicodeString& theOutput, 99*0e209d39SAndroid Build Coastguard Worker const TransliterationRuleData* theData); 100*0e209d39SAndroid Build Coastguard Worker 101*0e209d39SAndroid Build Coastguard Worker /** 102*0e209d39SAndroid Build Coastguard Worker * Copy constructor. 103*0e209d39SAndroid Build Coastguard Worker */ 104*0e209d39SAndroid Build Coastguard Worker StringReplacer(const StringReplacer& other); 105*0e209d39SAndroid Build Coastguard Worker 106*0e209d39SAndroid Build Coastguard Worker /** 107*0e209d39SAndroid Build Coastguard Worker * Destructor 108*0e209d39SAndroid Build Coastguard Worker */ 109*0e209d39SAndroid Build Coastguard Worker virtual ~StringReplacer(); 110*0e209d39SAndroid Build Coastguard Worker 111*0e209d39SAndroid Build Coastguard Worker /** 112*0e209d39SAndroid Build Coastguard Worker * Implement UnicodeFunctor 113*0e209d39SAndroid Build Coastguard Worker */ 114*0e209d39SAndroid Build Coastguard Worker virtual StringReplacer* clone() const override; 115*0e209d39SAndroid Build Coastguard Worker 116*0e209d39SAndroid Build Coastguard Worker /** 117*0e209d39SAndroid Build Coastguard Worker * UnicodeFunctor API. Cast 'this' to a UnicodeReplacer* pointer 118*0e209d39SAndroid Build Coastguard Worker * and return the pointer. 119*0e209d39SAndroid Build Coastguard Worker */ 120*0e209d39SAndroid Build Coastguard Worker virtual UnicodeReplacer* toReplacer() const override; 121*0e209d39SAndroid Build Coastguard Worker 122*0e209d39SAndroid Build Coastguard Worker /** 123*0e209d39SAndroid Build Coastguard Worker * UnicodeReplacer API 124*0e209d39SAndroid Build Coastguard Worker */ 125*0e209d39SAndroid Build Coastguard Worker virtual int32_t replace(Replaceable& text, 126*0e209d39SAndroid Build Coastguard Worker int32_t start, 127*0e209d39SAndroid Build Coastguard Worker int32_t limit, 128*0e209d39SAndroid Build Coastguard Worker int32_t& cursor) override; 129*0e209d39SAndroid Build Coastguard Worker 130*0e209d39SAndroid Build Coastguard Worker /** 131*0e209d39SAndroid Build Coastguard Worker * UnicodeReplacer API 132*0e209d39SAndroid Build Coastguard Worker */ 133*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& toReplacerPattern(UnicodeString& result, 134*0e209d39SAndroid Build Coastguard Worker UBool escapeUnprintable) const override; 135*0e209d39SAndroid Build Coastguard Worker 136*0e209d39SAndroid Build Coastguard Worker /** 137*0e209d39SAndroid Build Coastguard Worker * Implement UnicodeReplacer 138*0e209d39SAndroid Build Coastguard Worker */ 139*0e209d39SAndroid Build Coastguard Worker virtual void addReplacementSetTo(UnicodeSet& toUnionTo) const override; 140*0e209d39SAndroid Build Coastguard Worker 141*0e209d39SAndroid Build Coastguard Worker /** 142*0e209d39SAndroid Build Coastguard Worker * UnicodeFunctor API 143*0e209d39SAndroid Build Coastguard Worker */ 144*0e209d39SAndroid Build Coastguard Worker virtual void setData(const TransliterationRuleData*) override; 145*0e209d39SAndroid Build Coastguard Worker 146*0e209d39SAndroid Build Coastguard Worker /** 147*0e209d39SAndroid Build Coastguard Worker * ICU "poor man's RTTI", returns a UClassID for this class. 148*0e209d39SAndroid Build Coastguard Worker */ 149*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 150*0e209d39SAndroid Build Coastguard Worker 151*0e209d39SAndroid Build Coastguard Worker /** 152*0e209d39SAndroid Build Coastguard Worker * ICU "poor man's RTTI", returns a UClassID for the actual class. 153*0e209d39SAndroid Build Coastguard Worker */ 154*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 155*0e209d39SAndroid Build Coastguard Worker }; 156*0e209d39SAndroid Build Coastguard Worker 157*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 158*0e209d39SAndroid Build Coastguard Worker 159*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_TRANSLITERATION */ 160*0e209d39SAndroid Build Coastguard Worker 161*0e209d39SAndroid Build Coastguard Worker #endif 162*0e209d39SAndroid Build Coastguard Worker 163*0e209d39SAndroid Build Coastguard Worker //eof 164