/*
**********************************************************************
* Copyright (C) 1999, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Date Name Description
* 11/17/99 aliu Creation.
**********************************************************************
*/
#include "rbt_set.h"
#include "rbt_rule.h"
#include "unistr.h"
/* Note: There was an old implementation that indexed by first letter of
* key. Problem with this is that key may not have a meaningful first
* letter; e.g., {Lu}>*. One solution is to keep a separate vector of all
* rules whose intial key letter is a category variable. However, the
* problem is that they must be kept in order with respect to other rules.
* One solution -- add a sequence number to each rule. Do the usual
* first-letter lookup, and also a lookup from the spare bin with rules like
* {Lu}>*. Take the lower sequence number. This seems complex and not
* worth the trouble, but we may revisit this later. For documentation (or
* possible resurrection) the old code is included below, commented out
* with the remark "// OLD INDEXED IMPLEMENTATION". Under the old
* implementation, rules
is a Hashtable, not a Vector.
*/
/**
* Construct a new empty rule set.
*/
TransliterationRuleSet::TransliterationRuleSet() {
maxContextLength = 0;
}
/**
* Return the maximum context length.
* @return the length of the longest preceding context.
*/
int32_t TransliterationRuleSet::getMaximumContextLength() const {
return maxContextLength;
}
/**
* 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
*/
void TransliterationRuleSet::addRule(TransliterationRule* adoptedRule,
UErrorCode& status) {
// Build time, no checking : 3562 ms
// Build time, with checking: 6234 ms
if (U_FAILURE(status)) {
delete adoptedRule;
return;
}
for (int32_t i=0; iresult
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 translated 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.
*/
TransliterationRule*
TransliterationRuleSet::findMatch(const UnicodeString& text,
int32_t start, int32_t limit,
const UnicodeString& result,
int32_t cursor,
const TransliterationRuleData& data,
const UnicodeFilter* filter) const {
for (int32_t i=0; i0 <= 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.
*/
TransliterationRule*
TransliterationRuleSet::findMatch(const Replaceable& text,
int32_t start, int32_t limit,
int32_t cursor,
const TransliterationRuleData& data,
const UnicodeFilter* filter) const {
for (int32_t i=0; ifindMatch()
, 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.
*/
TransliterationRule*
TransliterationRuleSet::findIncrementalMatch(const Replaceable& text,
int32_t start,
int32_t limit, int32_t cursor,
const TransliterationRuleData& data,
bool_t& isPartial,
const UnicodeFilter* filter) const {
isPartial = FALSE;
for (int32_t i=0; i