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-2007, 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 * 06/06/2002 aliu Creation. 10*0e209d39SAndroid Build Coastguard Worker *********************************************************************** 11*0e209d39SAndroid Build Coastguard Worker */ 12*0e209d39SAndroid Build Coastguard Worker #ifndef _ANYTRANS_H_ 13*0e209d39SAndroid Build Coastguard Worker #define _ANYTRANS_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/uscript.h" 21*0e209d39SAndroid Build Coastguard Worker #include "uhash.h" 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 24*0e209d39SAndroid Build Coastguard Worker 25*0e209d39SAndroid Build Coastguard Worker /** 26*0e209d39SAndroid Build Coastguard Worker * A transliterator named Any-T or Any-T/V, where T is the target 27*0e209d39SAndroid Build Coastguard Worker * script and V is the optional variant, that uses multiple 28*0e209d39SAndroid Build Coastguard Worker * transliterators, all going to T or T/V, all with script sources. 29*0e209d39SAndroid Build Coastguard Worker * The target must be a script. It partitions text into runs of the 30*0e209d39SAndroid Build Coastguard Worker * same script, and then based on the script of each run, 31*0e209d39SAndroid Build Coastguard Worker * transliterates from that script to the given target or 32*0e209d39SAndroid Build Coastguard Worker * target/variant. Adjacent COMMON or INHERITED script characters are 33*0e209d39SAndroid Build Coastguard Worker * included in each run. 34*0e209d39SAndroid Build Coastguard Worker * 35*0e209d39SAndroid Build Coastguard Worker * @author Alan Liu 36*0e209d39SAndroid Build Coastguard Worker */ 37*0e209d39SAndroid Build Coastguard Worker class AnyTransliterator : public Transliterator { 38*0e209d39SAndroid Build Coastguard Worker 39*0e209d39SAndroid Build Coastguard Worker /** 40*0e209d39SAndroid Build Coastguard Worker * Cache mapping UScriptCode values to Transliterator*. 41*0e209d39SAndroid Build Coastguard Worker */ 42*0e209d39SAndroid Build Coastguard Worker UHashtable* cache; 43*0e209d39SAndroid Build Coastguard Worker 44*0e209d39SAndroid Build Coastguard Worker /** 45*0e209d39SAndroid Build Coastguard Worker * The target or target/variant string. 46*0e209d39SAndroid Build Coastguard Worker */ 47*0e209d39SAndroid Build Coastguard Worker UnicodeString target; 48*0e209d39SAndroid Build Coastguard Worker 49*0e209d39SAndroid Build Coastguard Worker /** 50*0e209d39SAndroid Build Coastguard Worker * The target script code. Never USCRIPT_INVALID_CODE. 51*0e209d39SAndroid Build Coastguard Worker */ 52*0e209d39SAndroid Build Coastguard Worker UScriptCode targetScript; 53*0e209d39SAndroid Build Coastguard Worker 54*0e209d39SAndroid Build Coastguard Worker public: 55*0e209d39SAndroid Build Coastguard Worker 56*0e209d39SAndroid Build Coastguard Worker /** 57*0e209d39SAndroid Build Coastguard Worker * Destructor. 58*0e209d39SAndroid Build Coastguard Worker */ 59*0e209d39SAndroid Build Coastguard Worker virtual ~AnyTransliterator(); 60*0e209d39SAndroid Build Coastguard Worker 61*0e209d39SAndroid Build Coastguard Worker /** 62*0e209d39SAndroid Build Coastguard Worker * Copy constructor. 63*0e209d39SAndroid Build Coastguard Worker */ 64*0e209d39SAndroid Build Coastguard Worker AnyTransliterator(const AnyTransliterator&); 65*0e209d39SAndroid Build Coastguard Worker 66*0e209d39SAndroid Build Coastguard Worker /** 67*0e209d39SAndroid Build Coastguard Worker * Transliterator API. 68*0e209d39SAndroid Build Coastguard Worker */ 69*0e209d39SAndroid Build Coastguard Worker virtual AnyTransliterator* clone() const override; 70*0e209d39SAndroid Build Coastguard Worker 71*0e209d39SAndroid Build Coastguard Worker /** 72*0e209d39SAndroid Build Coastguard Worker * Implements {@link Transliterator#handleTransliterate}. 73*0e209d39SAndroid Build Coastguard Worker */ 74*0e209d39SAndroid Build Coastguard Worker virtual void handleTransliterate(Replaceable& text, UTransPosition& index, 75*0e209d39SAndroid Build Coastguard Worker UBool incremental) const override; 76*0e209d39SAndroid Build Coastguard Worker 77*0e209d39SAndroid Build Coastguard Worker /** 78*0e209d39SAndroid Build Coastguard Worker * ICU "poor man's RTTI", returns a UClassID for the actual class. 79*0e209d39SAndroid Build Coastguard Worker */ 80*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 81*0e209d39SAndroid Build Coastguard Worker 82*0e209d39SAndroid Build Coastguard Worker /** 83*0e209d39SAndroid Build Coastguard Worker * ICU "poor man's RTTI", returns a UClassID for this class. 84*0e209d39SAndroid Build Coastguard Worker */ 85*0e209d39SAndroid Build Coastguard Worker U_I18N_API static UClassID U_EXPORT2 getStaticClassID(); 86*0e209d39SAndroid Build Coastguard Worker 87*0e209d39SAndroid Build Coastguard Worker private: 88*0e209d39SAndroid Build Coastguard Worker 89*0e209d39SAndroid Build Coastguard Worker /** 90*0e209d39SAndroid Build Coastguard Worker * Private constructor 91*0e209d39SAndroid Build Coastguard Worker * @param id the ID of the form S-T or S-T/V, where T is theTarget 92*0e209d39SAndroid Build Coastguard Worker * and V is theVariant. Must not be empty. 93*0e209d39SAndroid Build Coastguard Worker * @param theTarget the target name. Must not be empty, and must 94*0e209d39SAndroid Build Coastguard Worker * name a script corresponding to theTargetScript. 95*0e209d39SAndroid Build Coastguard Worker * @param theVariant the variant name, or the empty string if 96*0e209d39SAndroid Build Coastguard Worker * there is no variant 97*0e209d39SAndroid Build Coastguard Worker * @param theTargetScript the script code corresponding to 98*0e209d39SAndroid Build Coastguard Worker * theTarget. 99*0e209d39SAndroid Build Coastguard Worker * @param ec error code, fails if the internal hashtable cannot be 100*0e209d39SAndroid Build Coastguard Worker * allocated 101*0e209d39SAndroid Build Coastguard Worker */ 102*0e209d39SAndroid Build Coastguard Worker AnyTransliterator(const UnicodeString& id, 103*0e209d39SAndroid Build Coastguard Worker const UnicodeString& theTarget, 104*0e209d39SAndroid Build Coastguard Worker const UnicodeString& theVariant, 105*0e209d39SAndroid Build Coastguard Worker UScriptCode theTargetScript, 106*0e209d39SAndroid Build Coastguard Worker UErrorCode& ec); 107*0e209d39SAndroid Build Coastguard Worker 108*0e209d39SAndroid Build Coastguard Worker /** 109*0e209d39SAndroid Build Coastguard Worker * Returns a transliterator from the given source to our target or 110*0e209d39SAndroid Build Coastguard Worker * target/variant. Returns nullptr if the source is the same as our 111*0e209d39SAndroid Build Coastguard Worker * target script, or if the source is USCRIPT_INVALID_CODE. 112*0e209d39SAndroid Build Coastguard Worker * Caches the result and returns the same transliterator the next 113*0e209d39SAndroid Build Coastguard Worker * time. The caller does NOT own the result and must not delete 114*0e209d39SAndroid Build Coastguard Worker * it. 115*0e209d39SAndroid Build Coastguard Worker */ 116*0e209d39SAndroid Build Coastguard Worker Transliterator* getTransliterator(UScriptCode source) const; 117*0e209d39SAndroid Build Coastguard Worker 118*0e209d39SAndroid Build Coastguard Worker /** 119*0e209d39SAndroid Build Coastguard Worker * Registers standard transliterators with the system. Called by 120*0e209d39SAndroid Build Coastguard Worker * Transliterator during initialization. 121*0e209d39SAndroid Build Coastguard Worker */ 122*0e209d39SAndroid Build Coastguard Worker static void registerIDs(); 123*0e209d39SAndroid Build Coastguard Worker 124*0e209d39SAndroid Build Coastguard Worker friend class Transliterator; // for registerIDs() 125*0e209d39SAndroid Build Coastguard Worker }; 126*0e209d39SAndroid Build Coastguard Worker 127*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 128*0e209d39SAndroid Build Coastguard Worker 129*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_TRANSLITERATION */ 130*0e209d39SAndroid Build Coastguard Worker 131*0e209d39SAndroid Build Coastguard Worker #endif 132