summaryrefslogtreecommitdiff
path: root/deps/node/deps/icu-small/source/i18n/number_patternmodifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deps/node/deps/icu-small/source/i18n/number_patternmodifier.cpp')
-rw-r--r--deps/node/deps/icu-small/source/i18n/number_patternmodifier.cpp321
1 files changed, 0 insertions, 321 deletions
diff --git a/deps/node/deps/icu-small/source/i18n/number_patternmodifier.cpp b/deps/node/deps/icu-small/source/i18n/number_patternmodifier.cpp
deleted file mode 100644
index 4c61a0d3..00000000
--- a/deps/node/deps/icu-small/source/i18n/number_patternmodifier.cpp
+++ /dev/null
@@ -1,321 +0,0 @@
-// © 2017 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_FORMATTING
-
-#include "cstring.h"
-#include "number_patternmodifier.h"
-#include "unicode/dcfmtsym.h"
-#include "unicode/ucurr.h"
-#include "unicode/unistr.h"
-#include "number_microprops.h"
-
-using namespace icu;
-using namespace icu::number;
-using namespace icu::number::impl;
-
-
-AffixPatternProvider::~AffixPatternProvider() = default;
-
-
-MutablePatternModifier::MutablePatternModifier(bool isStrong)
- : fStrong(isStrong) {}
-
-void MutablePatternModifier::setPatternInfo(const AffixPatternProvider* patternInfo) {
- fPatternInfo = patternInfo;
-}
-
-void MutablePatternModifier::setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille) {
- fSignDisplay = signDisplay;
- this->perMilleReplacesPercent = perMille;
-}
-
-void MutablePatternModifier::setSymbols(const DecimalFormatSymbols* symbols,
- const CurrencySymbols* currencySymbols,
- const UNumberUnitWidth unitWidth, const PluralRules* rules) {
- U_ASSERT((rules != nullptr) == needsPlurals());
- fSymbols = symbols;
- fCurrencySymbols = currencySymbols;
- fUnitWidth = unitWidth;
- fRules = rules;
-}
-
-void MutablePatternModifier::setNumberProperties(int8_t signum, StandardPlural::Form plural) {
- fSignum = signum;
- fPlural = plural;
-}
-
-bool MutablePatternModifier::needsPlurals() const {
- UErrorCode statusLocal = U_ZERO_ERROR;
- return fPatternInfo->containsSymbolType(AffixPatternType::TYPE_CURRENCY_TRIPLE, statusLocal);
- // Silently ignore any error codes.
-}
-
-ImmutablePatternModifier* MutablePatternModifier::createImmutable(UErrorCode& status) {
- return createImmutableAndChain(nullptr, status);
-}
-
-ImmutablePatternModifier*
-MutablePatternModifier::createImmutableAndChain(const MicroPropsGenerator* parent, UErrorCode& status) {
-
- // TODO: Move StandardPlural VALUES to standardplural.h
- static const StandardPlural::Form STANDARD_PLURAL_VALUES[] = {
- StandardPlural::Form::ZERO,
- StandardPlural::Form::ONE,
- StandardPlural::Form::TWO,
- StandardPlural::Form::FEW,
- StandardPlural::Form::MANY,
- StandardPlural::Form::OTHER};
-
- auto pm = new AdoptingModifierStore();
- if (pm == nullptr) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return nullptr;
- }
-
- if (needsPlurals()) {
- // Slower path when we require the plural keyword.
- for (StandardPlural::Form plural : STANDARD_PLURAL_VALUES) {
- setNumberProperties(1, plural);
- pm->adoptModifier(1, plural, createConstantModifier(status));
- setNumberProperties(0, plural);
- pm->adoptModifier(0, plural, createConstantModifier(status));
- setNumberProperties(-1, plural);
- pm->adoptModifier(-1, plural, createConstantModifier(status));
- }
- if (U_FAILURE(status)) {
- delete pm;
- return nullptr;
- }
- return new ImmutablePatternModifier(pm, fRules, parent); // adopts pm
- } else {
- // Faster path when plural keyword is not needed.
- setNumberProperties(1, StandardPlural::Form::COUNT);
- pm->adoptModifierWithoutPlural(1, createConstantModifier(status));
- setNumberProperties(0, StandardPlural::Form::COUNT);
- pm->adoptModifierWithoutPlural(0, createConstantModifier(status));
- setNumberProperties(-1, StandardPlural::Form::COUNT);
- pm->adoptModifierWithoutPlural(-1, createConstantModifier(status));
- if (U_FAILURE(status)) {
- delete pm;
- return nullptr;
- }
- return new ImmutablePatternModifier(pm, nullptr, parent); // adopts pm
- }
-}
-
-ConstantMultiFieldModifier* MutablePatternModifier::createConstantModifier(UErrorCode& status) {
- NumberStringBuilder a;
- NumberStringBuilder b;
- insertPrefix(a, 0, status);
- insertSuffix(b, 0, status);
- if (fPatternInfo->hasCurrencySign()) {
- return new CurrencySpacingEnabledModifier(
- a, b, !fPatternInfo->hasBody(), fStrong, *fSymbols, status);
- } else {
- return new ConstantMultiFieldModifier(a, b, !fPatternInfo->hasBody(), fStrong);
- }
-}
-
-ImmutablePatternModifier::ImmutablePatternModifier(AdoptingModifierStore* pm, const PluralRules* rules,
- const MicroPropsGenerator* parent)
- : pm(pm), rules(rules), parent(parent) {}
-
-void ImmutablePatternModifier::processQuantity(DecimalQuantity& quantity, MicroProps& micros,
- UErrorCode& status) const {
- parent->processQuantity(quantity, micros, status);
- applyToMicros(micros, quantity);
-}
-
-void ImmutablePatternModifier::applyToMicros(MicroProps& micros, DecimalQuantity& quantity) const {
- if (rules == nullptr) {
- micros.modMiddle = pm->getModifierWithoutPlural(quantity.signum());
- } else {
- // TODO: Fix this. Avoid the copy.
- DecimalQuantity copy(quantity);
- copy.roundToInfinity();
- StandardPlural::Form plural = utils::getStandardPlural(rules, copy);
- micros.modMiddle = pm->getModifier(quantity.signum(), plural);
- }
-}
-
-const Modifier* ImmutablePatternModifier::getModifier(int8_t signum, StandardPlural::Form plural) const {
- if (rules == nullptr) {
- return pm->getModifierWithoutPlural(signum);
- } else {
- return pm->getModifier(signum, plural);
- }
-}
-
-
-/** Used by the unsafe code path. */
-MicroPropsGenerator& MutablePatternModifier::addToChain(const MicroPropsGenerator* parent) {
- fParent = parent;
- return *this;
-}
-
-void MutablePatternModifier::processQuantity(DecimalQuantity& fq, MicroProps& micros,
- UErrorCode& status) const {
- fParent->processQuantity(fq, micros, status);
- // The unsafe code path performs self-mutation, so we need a const_cast.
- // This method needs to be const because it overrides a const method in the parent class.
- auto nonConstThis = const_cast<MutablePatternModifier*>(this);
- if (needsPlurals()) {
- // TODO: Fix this. Avoid the copy.
- DecimalQuantity copy(fq);
- micros.rounder.apply(copy, status);
- nonConstThis->setNumberProperties(fq.signum(), utils::getStandardPlural(fRules, copy));
- } else {
- nonConstThis->setNumberProperties(fq.signum(), StandardPlural::Form::COUNT);
- }
- micros.modMiddle = this;
-}
-
-int32_t MutablePatternModifier::apply(NumberStringBuilder& output, int32_t leftIndex, int32_t rightIndex,
- UErrorCode& status) const {
- // The unsafe code path performs self-mutation, so we need a const_cast.
- // This method needs to be const because it overrides a const method in the parent class.
- auto nonConstThis = const_cast<MutablePatternModifier*>(this);
- int32_t prefixLen = nonConstThis->insertPrefix(output, leftIndex, status);
- int32_t suffixLen = nonConstThis->insertSuffix(output, rightIndex + prefixLen, status);
- // If the pattern had no decimal stem body (like #,##0.00), overwrite the value.
- int32_t overwriteLen = 0;
- if (!fPatternInfo->hasBody()) {
- overwriteLen = output.splice(
- leftIndex + prefixLen,
- rightIndex + prefixLen,
- UnicodeString(),
- 0,
- 0,
- UNUM_FIELD_COUNT,
- status);
- }
- CurrencySpacingEnabledModifier::applyCurrencySpacing(
- output,
- leftIndex,
- prefixLen,
- rightIndex + overwriteLen + prefixLen,
- suffixLen,
- *fSymbols,
- status);
- return prefixLen + overwriteLen + suffixLen;
-}
-
-int32_t MutablePatternModifier::getPrefixLength() const {
- // The unsafe code path performs self-mutation, so we need a const_cast.
- // This method needs to be const because it overrides a const method in the parent class.
- auto nonConstThis = const_cast<MutablePatternModifier*>(this);
-
- // Enter and exit CharSequence Mode to get the length.
- UErrorCode status = U_ZERO_ERROR; // status fails only with an iilegal argument exception
- nonConstThis->prepareAffix(true);
- int result = AffixUtils::unescapedCodePointCount(currentAffix, *this, status); // prefix length
- return result;
-}
-
-int32_t MutablePatternModifier::getCodePointCount() const {
- // The unsafe code path performs self-mutation, so we need a const_cast.
- // This method needs to be const because it overrides a const method in the parent class.
- auto nonConstThis = const_cast<MutablePatternModifier*>(this);
-
- // Render the affixes to get the length
- UErrorCode status = U_ZERO_ERROR; // status fails only with an iilegal argument exception
- nonConstThis->prepareAffix(true);
- int result = AffixUtils::unescapedCodePointCount(currentAffix, *this, status); // prefix length
- nonConstThis->prepareAffix(false);
- result += AffixUtils::unescapedCodePointCount(currentAffix, *this, status); // suffix length
- return result;
-}
-
-bool MutablePatternModifier::isStrong() const {
- return fStrong;
-}
-
-bool MutablePatternModifier::containsField(UNumberFormatFields field) const {
- (void)field;
- // This method is not currently used.
- U_ASSERT(false);
- return false;
-}
-
-void MutablePatternModifier::getParameters(Parameters& output) const {
- (void)output;
- // This method is not currently used.
- U_ASSERT(false);
-}
-
-bool MutablePatternModifier::semanticallyEquivalent(const Modifier& other) const {
- (void)other;
- // This method is not currently used.
- U_ASSERT(false);
- return false;
-}
-
-int32_t MutablePatternModifier::insertPrefix(NumberStringBuilder& sb, int position, UErrorCode& status) {
- prepareAffix(true);
- int length = AffixUtils::unescape(currentAffix, sb, position, *this, status);
- return length;
-}
-
-int32_t MutablePatternModifier::insertSuffix(NumberStringBuilder& sb, int position, UErrorCode& status) {
- prepareAffix(false);
- int length = AffixUtils::unescape(currentAffix, sb, position, *this, status);
- return length;
-}
-
-/** This method contains the heart of the logic for rendering LDML affix strings. */
-void MutablePatternModifier::prepareAffix(bool isPrefix) {
- PatternStringUtils::patternInfoToStringBuilder(
- *fPatternInfo, isPrefix, fSignum, fSignDisplay, fPlural, perMilleReplacesPercent, currentAffix);
-}
-
-UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const {
- UErrorCode localStatus = U_ZERO_ERROR;
- switch (type) {
- case AffixPatternType::TYPE_MINUS_SIGN:
- return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kMinusSignSymbol);
- case AffixPatternType::TYPE_PLUS_SIGN:
- return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPlusSignSymbol);
- case AffixPatternType::TYPE_PERCENT:
- return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPercentSymbol);
- case AffixPatternType::TYPE_PERMILLE:
- return fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPerMillSymbol);
- case AffixPatternType::TYPE_CURRENCY_SINGLE: {
- // UnitWidth ISO and HIDDEN overrides the singular currency symbol.
- if (fUnitWidth == UNumberUnitWidth::UNUM_UNIT_WIDTH_ISO_CODE) {
- return fCurrencySymbols->getIntlCurrencySymbol(localStatus);
- } else if (fUnitWidth == UNumberUnitWidth::UNUM_UNIT_WIDTH_HIDDEN) {
- return UnicodeString();
- } else if (fUnitWidth == UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW) {
- return fCurrencySymbols->getNarrowCurrencySymbol(localStatus);
- } else {
- return fCurrencySymbols->getCurrencySymbol(localStatus);
- }
- }
- case AffixPatternType::TYPE_CURRENCY_DOUBLE:
- return fCurrencySymbols->getIntlCurrencySymbol(localStatus);
- case AffixPatternType::TYPE_CURRENCY_TRIPLE:
- // NOTE: This is the code path only for patterns containing "¤¤¤".
- // Plural currencies set via the API are formatted in LongNameHandler.
- // This code path is used by DecimalFormat via CurrencyPluralInfo.
- U_ASSERT(fPlural != StandardPlural::Form::COUNT);
- return fCurrencySymbols->getPluralName(fPlural, localStatus);
- case AffixPatternType::TYPE_CURRENCY_QUAD:
- return UnicodeString(u"\uFFFD");
- case AffixPatternType::TYPE_CURRENCY_QUINT:
- return UnicodeString(u"\uFFFD");
- default:
- U_ASSERT(false);
- return UnicodeString();
- }
-}
-
-UnicodeString MutablePatternModifier::toUnicodeString() const {
- // Never called by AffixUtils
- U_ASSERT(false);
- return UnicodeString();
-}
-
-#endif /* #if !UCONFIG_NO_FORMATTING */