/* ********************************************************************** * Copyright (C) 1999, 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 "uvector.h" class Replaceable; class TransliterationRule; class TransliterationRuleData; class UnicodeFilter; class UnicodeString; /** * A set of rules for a RuleBasedTransliterator. This set encodes * the transliteration in one direction from one set of characters or short * strings to another. A RuleBasedTransliterator consists of up to * two such sets, one for the forward direction, and one for the reverse. * *

A TransliterationRuleSet has one important operation, that of * finding a matching rule at a given point in the text. This is accomplished * by the findMatch() method. * * @author Alan Liu */ class TransliterationRuleSet { /** * Vector of rules, in the order added. */ UVector rules; /** * Length of the longest preceding context */ int32_t maxContextLength; public: /** * Construct a new empty rule set. */ TransliterationRuleSet(); /** * Return the maximum context length. * @return the length of the longest preceding context. */ virtual int32_t getMaximumContextLength() const; /** * Add a rule to this set. Rules are added in order, and order is * significant. * *

Once freeze() is called, this method must not be called. * @param rule the rule to add */ virtual void addRule(TransliterationRule* adoptedRule, UErrorCode& status); /** * Free up space. Once this method is called, addRule() must NOT * be called again. */ virtual void freeze(); /** * Attempt to find a matching rule at the specified point in the text. The * text being matched occupies a virtual buffer consisting of the contents * of result concatenated to a substring of text. * The substring is specified by start and limit. * The value of cursor is an index into this virtual buffer, * from 0 to the length of the buffer. In terms of the parameters, * cursor must be between 0 and result.length() + limit - * start. * @param text the untranslated text * @param start the beginning index, inclusive; 0 <= start * <= limit. * @param limit the ending index, exclusive; start <= limit * <= text.length(). * @param result tranlated text * @param cursor position at which to translate next, an offset into result. * If greater than or equal to result.length(), represents offset start + * cursor - result.length() into text. * @param data a dictionary mapping variables to the sets they * represent (maps Character to UnicodeSet) * @param filter the filter. Any character for which * filter.isIn() returns false will not be * altered by this transliterator. If filter is * null then no filtering is applied. * @return the matching rule, or null if none found. */ virtual TransliterationRule* findMatch(const UnicodeString& text, int32_t start, int32_t limit, const UnicodeString& result, int32_t cursor, const TransliterationRuleData& data, const UnicodeFilter* filter) const; /** * Attempt to find a matching rule at the specified point in the text. * @param text the text, both translated and untranslated * @param start the beginning index, inclusive; 0 <= start * <= limit. * @param limit the ending index, exclusive; start <= limit * <= text.length(). * @param cursor position at which to translate next, representing offset * into text. This value must be between start and * limit. * @param data a dictionary mapping variables to the sets they * represent (maps Character to UnicodeSet) * @param filter the filter. Any character for which * filter.isIn() returns false will not be * altered by this transliterator. If filter is * null then no filtering is applied. * @return the matching rule, or null if none found. */ virtual TransliterationRule* findMatch(const Replaceable& text, int32_t start, int32_t limit, int32_t cursor, const TransliterationRuleData& data, const UnicodeFilter* filter) const; /** * Attempt to find a matching rule at the specified point in the text. * Unlike findMatch(), this method does an incremental match. * An incremental match requires that there be no partial matches that might * pre-empt the full match that is found. If there are partial matches, * then null is returned. A non-null result indicates that a full match has * been found, and that it cannot be pre-empted by a partial match * regardless of what additional text is added to the translation buffer. * @param text the text, both translated and untranslated * @param start the beginning index, inclusive; 0 <= start * <= limit. * @param limit the ending index, exclusive; start <= limit * <= text.length(). * @param cursor position at which to translate next, representing offset * into text. This value must be between start and * limit. * @param data a dictionary mapping variables to the sets they * represent (maps Character to UnicodeSet) * @param partial output parameter. partial[0] is set to * true if a partial match is returned. * @param filter the filter. Any character for which * filter.isIn() returns false will not be * altered by this transliterator. If filter is * null then no filtering is applied. * @return the matching rule, or null if none found, or if the text buffer * does not have enough text yet to unambiguously match a rule. */ virtual TransliterationRule* findIncrementalMatch(const Replaceable& text, int32_t start, int32_t limit, int32_t cursor, const TransliterationRuleData& data, bool_t& isPartial, const UnicodeFilter* filter) const; }; #endif