1999-11-20 00:40:50 +00:00
|
|
|
/*
|
2001-03-22 00:09:10 +00:00
|
|
|
* Copyright (C) {1999}, International Business Machines Corporation and others. All Rights Reserved.
|
1999-11-20 00:40:50 +00:00
|
|
|
**********************************************************************
|
|
|
|
* Date Name Description
|
|
|
|
* 11/17/99 aliu Creation.
|
|
|
|
**********************************************************************
|
|
|
|
*/
|
|
|
|
#ifndef RBT_SET_H
|
|
|
|
#define RBT_SET_H
|
|
|
|
|
|
|
|
#include "uvector.h"
|
2000-06-29 00:18:43 +00:00
|
|
|
#include "unicode/utrans.h"
|
1999-11-20 00:40:50 +00:00
|
|
|
|
|
|
|
class Replaceable;
|
|
|
|
class TransliterationRule;
|
|
|
|
class TransliterationRuleData;
|
|
|
|
class UnicodeFilter;
|
|
|
|
class UnicodeString;
|
|
|
|
|
|
|
|
/**
|
2001-07-25 19:11:02 +00:00
|
|
|
* A set of rules for a <code>RuleBasedTransliterator</code>.
|
1999-11-20 00:40:50 +00:00
|
|
|
* @author Alan Liu
|
|
|
|
*/
|
|
|
|
class TransliterationRuleSet {
|
|
|
|
/**
|
2000-01-13 07:28:08 +00:00
|
|
|
* Vector of rules, in the order added. This is only used while the rule
|
|
|
|
* set is getting built. After that, freeze() reorders and indexes the
|
2000-07-13 00:40:31 +00:00
|
|
|
* rules into rules[]. However, the vector is kept until destruction.
|
1999-11-20 00:40:50 +00:00
|
|
|
*/
|
2000-01-13 07:28:08 +00:00
|
|
|
UVector* ruleVector;
|
1999-11-20 00:40:50 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Length of the longest preceding context
|
|
|
|
*/
|
|
|
|
int32_t maxContextLength;
|
|
|
|
|
2000-01-13 07:28:08 +00:00
|
|
|
/**
|
|
|
|
* Sorted and indexed table of rules. This is created by freeze() from
|
|
|
|
* the rules in ruleVector.
|
|
|
|
*/
|
|
|
|
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().
|
|
|
|
*/
|
|
|
|
int32_t index[257];
|
|
|
|
|
1999-11-20 00:40:50 +00:00
|
|
|
public:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Construct a new empty rule set.
|
|
|
|
*/
|
2001-08-23 01:06:08 +00:00
|
|
|
TransliterationRuleSet(UErrorCode& status);
|
1999-11-20 00:40:50 +00:00
|
|
|
|
2000-06-30 23:26:07 +00:00
|
|
|
/**
|
|
|
|
* Copy constructor.
|
|
|
|
*/
|
2000-07-11 18:45:49 +00:00
|
|
|
TransliterationRuleSet(const TransliterationRuleSet&);
|
2000-06-30 23:26:07 +00:00
|
|
|
|
2000-01-13 07:28:08 +00:00
|
|
|
/**
|
|
|
|
* Destructor.
|
|
|
|
*/
|
|
|
|
virtual ~TransliterationRuleSet();
|
|
|
|
|
1999-11-20 00:40:50 +00:00
|
|
|
/**
|
|
|
|
* Return the maximum context length.
|
|
|
|
* @return the length of the longest preceding context.
|
|
|
|
*/
|
1999-12-22 22:57:04 +00:00
|
|
|
virtual int32_t getMaximumContextLength(void) const;
|
1999-11-20 00:40:50 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a rule to this set. Rules are added in order, and order is
|
2000-07-13 00:40:31 +00:00
|
|
|
* significant. The last call to this method must be followed by
|
|
|
|
* a call to <code>freeze()</code> before the rule set is used.
|
1999-11-20 00:40:50 +00:00
|
|
|
*
|
2000-01-13 07:28:08 +00:00
|
|
|
* @param adoptedRule the rule to add
|
1999-11-20 00:40:50 +00:00
|
|
|
*/
|
|
|
|
virtual void addRule(TransliterationRule* adoptedRule,
|
|
|
|
UErrorCode& status);
|
|
|
|
|
|
|
|
/**
|
2000-07-13 00:40:31 +00:00
|
|
|
* 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.
|
1999-11-20 00:40:50 +00:00
|
|
|
*/
|
2001-08-31 03:23:39 +00:00
|
|
|
virtual void freeze(UParseError& parseError, UErrorCode& status);
|
2001-07-25 19:11:02 +00:00
|
|
|
|
1999-11-20 00:40:50 +00:00
|
|
|
/**
|
2001-07-25 19:11:02 +00:00
|
|
|
* 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.
|
1999-11-20 00:40:50 +00:00
|
|
|
*/
|
2001-07-25 19:11:02 +00:00
|
|
|
UBool transliterate(Replaceable& text,
|
|
|
|
UTransPosition& index,
|
|
|
|
UBool isIncremental);
|
2001-06-12 18:02:16 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Create rule strings that represents this rule set.
|
|
|
|
* @param result string to receive the rule strings. Current
|
|
|
|
* contents will be deleted.
|
|
|
|
*/
|
|
|
|
virtual UnicodeString& toRules(UnicodeString& result,
|
|
|
|
UBool escapeUnprintable) const;
|
1999-11-20 00:40:50 +00:00
|
|
|
};
|
|
|
|
#endif
|