Home | History | Annotate | Download | only in i18n
      1 /*
      2 **********************************************************************
      3 *   Copyright (C) 1999-2011, 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  */
     38 class U_I18N_API CompoundTransliterator : public Transliterator {
     39 
     40     Transliterator** trans;
     41 
     42     int32_t count;
     43 
     44     int32_t numAnonymousRBTs;
     45 
     46 public:
     47 
     48     /**
     49      * Constructs a new compound transliterator given an array of
     50      * transliterators.  The array of transliterators may be of any
     51      * length, including zero or one, however, useful compound
     52      * transliterators have at least two components.
     53      * @param transliterators array of <code>Transliterator</code>
     54      * objects
     55      * @param transliteratorCount The number of
     56      * <code>Transliterator</code> objects in transliterators.
     57      * @param adoptedFilter the filter.  Any character for which
     58      * <tt>filter.contains()</tt> returns <tt>false</tt> will not be
     59      * altered by this transliterator.  If <tt>filter</tt> is
     60      * <tt>null</tt> then no filtering is applied.
     61      */
     62     CompoundTransliterator(Transliterator* const transliterators[],
     63                            int32_t transliteratorCount,
     64                            UnicodeFilter* adoptedFilter = 0);
     65 
     66     /**
     67      * Constructs a new compound transliterator.
     68      * @param id compound ID
     69      * @param dir either UTRANS_FORWARD or UTRANS_REVERSE
     70      * @param adoptedFilter a global filter for this compound transliterator
     71      * or NULL
     72      */
     73     CompoundTransliterator(const UnicodeString& id,
     74                            UTransDirection dir,
     75                            UnicodeFilter* adoptedFilter,
     76                            UParseError& parseError,
     77                            UErrorCode& status);
     78 
     79     /**
     80      * Constructs a new compound transliterator in the FORWARD
     81      * direction with a NULL filter.
     82      */
     83     CompoundTransliterator(const UnicodeString& id,
     84                            UParseError& parseError,
     85                            UErrorCode& status);
     86     /**
     87      * Destructor.
     88      */
     89     virtual ~CompoundTransliterator();
     90 
     91     /**
     92      * Copy constructor.
     93      */
     94     CompoundTransliterator(const CompoundTransliterator&);
     95 
     96     /**
     97      * Transliterator API.
     98      */
     99     virtual Transliterator* clone(void) const;
    100 
    101     /**
    102      * Returns the number of transliterators in this chain.
    103      * @return number of transliterators in this chain.
    104      */
    105     virtual int32_t getCount(void) const;
    106 
    107     /**
    108      * Returns the transliterator at the given index in this chain.
    109      * @param idx index into chain, from 0 to <code>getCount() - 1</code>
    110      * @return transliterator at the given index
    111      */
    112     virtual const Transliterator& getTransliterator(int32_t idx) const;
    113 
    114     /**
    115      * Sets the transliterators.
    116      */
    117     void setTransliterators(Transliterator* const transliterators[],
    118                             int32_t count);
    119 
    120     /**
    121      * Adopts the transliterators.
    122      */
    123     void adoptTransliterators(Transliterator* adoptedTransliterators[],
    124                               int32_t count);
    125 
    126     /**
    127      * Override Transliterator:
    128      * Create a rule string that can be passed to createFromRules()
    129      * to recreate this transliterator.
    130      * @param result the string to receive the rules.  Previous
    131      * contents will be deleted.
    132      * @param escapeUnprintable if TRUE then convert unprintable
    133      * character to their hex escape representations, \uxxxx or
    134      * \Uxxxxxxxx.  Unprintable characters are those other than
    135      * U+000A, U+0020..U+007E.
    136      */
    137     virtual UnicodeString& toRules(UnicodeString& result,
    138                                    UBool escapeUnprintable) const;
    139 
    140  protected:
    141     /**
    142      * Implement Transliterator framework
    143      */
    144     virtual void handleGetSourceSet(UnicodeSet& result) const;
    145 
    146  public:
    147     /**
    148      * Override Transliterator framework
    149      */
    150     virtual UnicodeSet& getTargetSet(UnicodeSet& result) const;
    151 
    152 protected:
    153     /**
    154      * Implements {@link Transliterator#handleTransliterate}.
    155      */
    156     virtual void handleTransliterate(Replaceable& text, UTransPosition& idx,
    157                                      UBool incremental) const;
    158 
    159 public:
    160 
    161     /**
    162      * ICU "poor man's RTTI", returns a UClassID for the actual class.
    163      */
    164     virtual UClassID getDynamicClassID() const;
    165 
    166     /**
    167      * ICU "poor man's RTTI", returns a UClassID for this class.
    168      */
    169     static UClassID U_EXPORT2 getStaticClassID();
    170 
    171     /* @internal */
    172     static const UChar PASS_STRING[];
    173 
    174 private:
    175 
    176     friend class Transliterator;
    177     friend class TransliteratorAlias; // to access private ct
    178 
    179     /**
    180      * Assignment operator.
    181      */
    182     CompoundTransliterator& operator=(const CompoundTransliterator&);
    183 
    184     /**
    185      * Private constructor for Transliterator.
    186      */
    187     CompoundTransliterator(const UnicodeString& ID,
    188                            UVector& list,
    189                            UnicodeFilter* adoptedFilter,
    190                            int32_t numAnonymousRBTs,
    191                            UParseError& parseError,
    192                            UErrorCode& status);
    193 
    194     CompoundTransliterator(UVector& list,
    195                            UParseError& parseError,
    196                            UErrorCode& status);
    197 
    198     CompoundTransliterator(UVector& list,
    199                            int32_t anonymousRBTs,
    200                            UParseError& parseError,
    201                            UErrorCode& status);
    202 
    203     void init(const UnicodeString& id,
    204               UTransDirection direction,
    205               UBool fixReverseID,
    206               UErrorCode& status);
    207 
    208     void init(UVector& list,
    209               UTransDirection direction,
    210               UBool fixReverseID,
    211               UErrorCode& status);
    212 
    213     /**
    214      * Return the IDs of the given list of transliterators, concatenated
    215      * with ';' delimiting them.  Equivalent to the perlish expression
    216      * join(';', map($_.getID(), transliterators).
    217      */
    218     UnicodeString joinIDs(Transliterator* const transliterators[],
    219                           int32_t transCount);
    220 
    221     void freeTransliterators(void);
    222 
    223     void computeMaximumContextLength(void);
    224 };
    225 
    226 U_NAMESPACE_END
    227 
    228 #endif /* #if !UCONFIG_NO_TRANSLITERATION */
    229 
    230 #endif
    231