// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2007, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * Date Name Description * 11/17/99 aliu Creation. ********************************************************************** */ #ifndef RBT_SET_H #define RBT_SET_H #include "unicode/utypes.h" #if !UCONFIG_NO_TRANSLITERATION #include "unicode/uobject.h" #include "unicode/utrans.h" #include "uvector.h" U_NAMESPACE_BEGIN class Replaceable; class TransliterationRule; class TransliterationRuleData; class UnicodeFilter; class UnicodeString; class UnicodeSet; /** * A set of rules for a <code>RuleBasedTransliterator</code>. * @author Alan Liu */ class TransliterationRuleSet : public UMemory { /** * Vector of rules, in the order added. This is used while the * rule set is getting built. After that, freeze() reorders and * indexes the rules into rules[]. Any given rule is stored once * in ruleVector, and one or more times in rules[]. ruleVector * owns and deletes the rules. */ UVector* ruleVector; /** * Sorted and indexed table of rules. This is created by freeze() * from the rules in ruleVector. It contains alias pointers to * the rules in ruleVector. It is zero before freeze() is called * and non-zero thereafter. */ TransliterationRule** rules; /** * Index table. For text having a first character c, compute x = c&0xFF. * Now use rules[index[x]..index[x+1]-1]. This index table is created by * freeze(). Before freeze() is called it contains garbage. */ int32_t index[257]; /** * Length of the longest preceding context */ int32_t maxContextLength; public: /** * Construct a new empty rule set. * @param status Output parameter filled in with success or failure status. */ TransliterationRuleSet(UErrorCode& status); /** * Copy constructor. */ TransliterationRuleSet(const TransliterationRuleSet&); /** * Destructor. */ virtual ~TransliterationRuleSet(); /** * Change the data object that this rule belongs to. Used * internally by the TransliterationRuleData copy constructor. * @param data the new data value to be set. */ void setData(const TransliterationRuleData* data); /** * Return the maximum context length. * @return the length of the longest preceding context. */ virtual int32_t getMaximumContextLength(void) const; /** * Add a rule to this set. Rules are added in order, and order is * significant. The last call to this method must be followed by * a call to <code>freeze()</code> before the rule set is used. * This method must <em>not</em> be called after freeze() has been * called. * * @param adoptedRule the rule to add */ virtual void addRule(TransliterationRule* adoptedRule, UErrorCode& status); /** * Check this for masked rules and index it to optimize performance. * The sequence of operations is: (1) add rules to a set using * <code>addRule()</code>; (2) freeze the set using * <code>freeze()</code>; (3) use the rule set. If * <code>addRule()</code> is called after calling this method, it * invalidates this object, and this method must be called again. * That is, <code>freeze()</code> may be called multiple times, * although for optimal performance it shouldn't be. * @param parseError A pointer to UParseError to receive information about errors * occurred. * @param status Output parameter filled in with success or failure status. */ virtual void freeze(UParseError& parseError, UErrorCode& status); /** * Transliterate the given text with the given UTransPosition * indices. Return TRUE if the transliteration should continue * or FALSE if it should halt (because of a U_PARTIAL_MATCH match). * Note that FALSE is only ever returned if isIncremental is TRUE. * @param text the text to be transliterated * @param index the position indices, which will be updated * @param isIncremental if TRUE, assume new text may be inserted * at index.limit, and return FALSE if thre is a partial match. * @return TRUE unless a U_PARTIAL_MATCH has been obtained, * indicating that transliteration should stop until more text * arrives. */ UBool transliterate(Replaceable& text, UTransPosition& index, UBool isIncremental); /** * Create rule strings that represents this rule set. * @param result string to receive the rule strings. Current * contents will be deleted. * @param escapeUnprintable True, will escape the unprintable characters * @return A reference to 'result'. */ virtual UnicodeString& toRules(UnicodeString& result, UBool escapeUnprintable) const; /** * Return the set of all characters that may be modified * (getTarget=false) or emitted (getTarget=true) by this set. */ UnicodeSet& getSourceTargetSet(UnicodeSet& result, UBool getTarget) const; private: TransliterationRuleSet &operator=(const TransliterationRuleSet &other); // forbid copying of this class }; U_NAMESPACE_END #endif /* #if !UCONFIG_NO_TRANSLITERATION */ #endif