You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
10 KiB
263 lines
10 KiB
// © 2016 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
/*
|
|
******************************************************************************
|
|
* Copyright (C) 1997-2015, International Business Machines
|
|
* Corporation and others. All Rights Reserved.
|
|
******************************************************************************
|
|
* file name: nfsubs.h
|
|
* encoding: UTF-8
|
|
* tab size: 8 (not used)
|
|
* indentation:4
|
|
*
|
|
* Modification history
|
|
* Date Name Comments
|
|
* 10/11/2001 Doug Ported from ICU4J
|
|
*/
|
|
|
|
#ifndef NFSUBS_H
|
|
#define NFSUBS_H
|
|
|
|
#include "unicode/utypes.h"
|
|
#include "unicode/uobject.h"
|
|
#include "nfrule.h"
|
|
|
|
#if U_HAVE_RBNF
|
|
|
|
#include "unicode/utypes.h"
|
|
#include "unicode/decimfmt.h"
|
|
#include "nfrs.h"
|
|
#include <float.h>
|
|
|
|
U_NAMESPACE_BEGIN
|
|
|
|
class NFSubstitution : public UObject {
|
|
int32_t pos;
|
|
const NFRuleSet* ruleSet;
|
|
DecimalFormat* numberFormat;
|
|
|
|
protected:
|
|
NFSubstitution(int32_t pos,
|
|
const NFRuleSet* ruleSet,
|
|
const UnicodeString& description,
|
|
UErrorCode& status);
|
|
|
|
/**
|
|
* Get the Ruleset of the object.
|
|
* @return the Ruleset of the object.
|
|
*/
|
|
const NFRuleSet* getRuleSet() const { return ruleSet; }
|
|
|
|
/**
|
|
* get the NumberFormat of this object.
|
|
* @return the numberformat of this object.
|
|
*/
|
|
const DecimalFormat* getNumberFormat() const { return numberFormat; }
|
|
|
|
public:
|
|
static NFSubstitution* makeSubstitution(int32_t pos,
|
|
const NFRule* rule,
|
|
const NFRule* predecessor,
|
|
const NFRuleSet* ruleSet,
|
|
const RuleBasedNumberFormat* rbnf,
|
|
const UnicodeString& description,
|
|
UErrorCode& status);
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
virtual ~NFSubstitution();
|
|
|
|
/**
|
|
* Return true if the given Format objects are semantically equal.
|
|
* Objects of different subclasses are considered unequal.
|
|
* @param rhs the object to be compared with.
|
|
* @return true if the given Format objects are semantically equal.
|
|
*/
|
|
virtual UBool operator==(const NFSubstitution& rhs) const;
|
|
|
|
/**
|
|
* Return true if the given Format objects are semantically unequal.
|
|
* Objects of different subclasses are considered unequal.
|
|
* @param rhs the object to be compared with.
|
|
* @return true if the given Format objects are semantically unequal.
|
|
*/
|
|
UBool operator!=(const NFSubstitution& rhs) const { return !operator==(rhs); }
|
|
|
|
/**
|
|
* Sets the substitution's divisor. Used by NFRule.setBaseValue().
|
|
* A no-op for all substitutions except multiplier and modulus
|
|
* substitutions.
|
|
* @param radix The radix of the divisor
|
|
* @param exponent The exponent of the divisor
|
|
*/
|
|
virtual void setDivisor(int32_t radix, int16_t exponent, UErrorCode& status);
|
|
|
|
/**
|
|
* Replaces result with the string describing the substitution.
|
|
* @param result Output param which will receive the string.
|
|
*/
|
|
virtual void toString(UnicodeString& result) const;
|
|
|
|
void setDecimalFormatSymbols(const DecimalFormatSymbols &newSymbols, UErrorCode& status);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// formatting
|
|
//-----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Performs a mathematical operation on the number, formats it using
|
|
* either ruleSet or decimalFormat, and inserts the result into
|
|
* toInsertInto.
|
|
* @param number The number being formatted.
|
|
* @param toInsertInto The string we insert the result into
|
|
* @param pos The position in toInsertInto where the owning rule's
|
|
* rule text begins (this value is added to this substitution's
|
|
* position to determine exactly where to insert the new text)
|
|
*/
|
|
virtual void doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t pos, int32_t recursionCount, UErrorCode& status) const;
|
|
|
|
/**
|
|
* Performs a mathematical operation on the number, formats it using
|
|
* either ruleSet or decimalFormat, and inserts the result into
|
|
* toInsertInto.
|
|
* @param number The number being formatted.
|
|
* @param toInsertInto The string we insert the result into
|
|
* @param pos The position in toInsertInto where the owning rule's
|
|
* rule text begins (this value is added to this substitution's
|
|
* position to determine exactly where to insert the new text)
|
|
*/
|
|
virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos, int32_t recursionCount, UErrorCode& status) const;
|
|
|
|
protected:
|
|
/**
|
|
* Subclasses override this function to perform some kind of
|
|
* mathematical operation on the number. The result of this operation
|
|
* is formatted using the rule set or DecimalFormat that this
|
|
* substitution refers to, and the result is inserted into the result
|
|
* string.
|
|
* @param The number being formatted
|
|
* @return The result of performing the opreration on the number
|
|
*/
|
|
virtual int64_t transformNumber(int64_t number) const = 0;
|
|
|
|
/**
|
|
* Subclasses override this function to perform some kind of
|
|
* mathematical operation on the number. The result of this operation
|
|
* is formatted using the rule set or DecimalFormat that this
|
|
* substitution refers to, and the result is inserted into the result
|
|
* string.
|
|
* @param The number being formatted
|
|
* @return The result of performing the opreration on the number
|
|
*/
|
|
virtual double transformNumber(double number) const = 0;
|
|
|
|
public:
|
|
//-----------------------------------------------------------------------
|
|
// parsing
|
|
//-----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Parses a string using the rule set or DecimalFormat belonging
|
|
* to this substitution. If there's a match, a mathematical
|
|
* operation (the inverse of the one used in formatting) is
|
|
* performed on the result of the parse and the value passed in
|
|
* and returned as the result. The parse position is updated to
|
|
* point to the first unmatched character in the string.
|
|
* @param text The string to parse
|
|
* @param parsePosition On entry, ignored, but assumed to be 0.
|
|
* On exit, this is updated to point to the first unmatched
|
|
* character (or 0 if the substitution didn't match)
|
|
* @param baseValue A partial parse result that should be
|
|
* combined with the result of this parse
|
|
* @param upperBound When searching the rule set for a rule
|
|
* matching the string passed in, only rules with base values
|
|
* lower than this are considered
|
|
* @param lenientParse If true and matching against rules fails,
|
|
* the substitution will also try matching the text against
|
|
* numerals using a default-costructed NumberFormat. If false,
|
|
* no extra work is done. (This value is false whenever the
|
|
* formatter isn't in lenient-parse mode, but is also false
|
|
* under some conditions even when the formatter _is_ in
|
|
* lenient-parse mode.)
|
|
* @return If there's a match, this is the result of composing
|
|
* baseValue with whatever was returned from matching the
|
|
* characters. This will be either a Long or a Double. If there's
|
|
* no match this is new Long(0) (not null), and parsePosition
|
|
* is left unchanged.
|
|
*/
|
|
virtual UBool doParse(const UnicodeString& text,
|
|
ParsePosition& parsePosition,
|
|
double baseValue,
|
|
double upperBound,
|
|
UBool lenientParse,
|
|
uint32_t nonNumericalExecutedRuleMask,
|
|
Formattable& result) const;
|
|
|
|
/**
|
|
* Derives a new value from the two values passed in. The two values
|
|
* are typically either the base values of two rules (the one containing
|
|
* the substitution and the one matching the substitution) or partial
|
|
* parse results derived in some other way. The operation is generally
|
|
* the inverse of the operation performed by transformNumber().
|
|
* @param newRuleValue The value produced by matching this substitution
|
|
* @param oldRuleValue The value that was passed to the substitution
|
|
* by the rule that owns it
|
|
* @return A third value derived from the other two, representing a
|
|
* partial parse result
|
|
*/
|
|
virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const = 0;
|
|
|
|
/**
|
|
* Calculates an upper bound when searching for a rule that matches
|
|
* this substitution. Rules with base values greater than or equal
|
|
* to upperBound are not considered.
|
|
* @param oldUpperBound The current upper-bound setting. The new
|
|
* upper bound can't be any higher.
|
|
* @return the upper bound when searching for a rule that matches
|
|
* this substitution.
|
|
*/
|
|
virtual double calcUpperBound(double oldUpperBound) const = 0;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// simple accessors
|
|
//-----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Returns the substitution's position in the rule that owns it.
|
|
* @return The substitution's position in the rule that owns it.
|
|
*/
|
|
int32_t getPos() const { return pos; }
|
|
|
|
/**
|
|
* Returns the character used in the textual representation of
|
|
* substitutions of this type. Used by toString().
|
|
* @return This substitution's token character.
|
|
*/
|
|
virtual UChar tokenChar() const = 0;
|
|
|
|
/**
|
|
* Returns true if this is a modulus substitution. (We didn't do this
|
|
* with instanceof partially because it causes source files to
|
|
* proliferate and partially because we have to port this to C++.)
|
|
* @return true if this object is an instance of ModulusSubstitution
|
|
*/
|
|
virtual UBool isModulusSubstitution() const;
|
|
|
|
private:
|
|
NFSubstitution(const NFSubstitution &other); // forbid copying of this class
|
|
NFSubstitution &operator=(const NFSubstitution &other); // forbid copying of this class
|
|
|
|
public:
|
|
static UClassID getStaticClassID(void);
|
|
virtual UClassID getDynamicClassID(void) const;
|
|
};
|
|
|
|
U_NAMESPACE_END
|
|
|
|
/* U_HAVE_RBNF */
|
|
#endif
|
|
|
|
// NFSUBS_H
|
|
#endif
|