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