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