summaryrefslogtreecommitdiff
path: root/deps/icu-small/source/i18n/number_decimfmtprops.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deps/icu-small/source/i18n/number_decimfmtprops.cpp')
-rw-r--r--deps/icu-small/source/i18n/number_decimfmtprops.cpp80
1 files changed, 61 insertions, 19 deletions
diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.cpp b/deps/icu-small/source/i18n/number_decimfmtprops.cpp
index cc57cfce6a..6754fe19ec 100644
--- a/deps/icu-small/source/i18n/number_decimfmtprops.cpp
+++ b/deps/icu-small/source/i18n/number_decimfmtprops.cpp
@@ -3,14 +3,29 @@
#include "unicode/utypes.h"
-#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT
+#if !UCONFIG_NO_FORMATTING
#include "number_decimfmtprops.h"
+#include "umutex.h"
using namespace icu;
using namespace icu::number;
using namespace icu::number::impl;
+
+namespace {
+
+char kRawDefaultProperties[sizeof(DecimalFormatProperties)];
+
+icu::UInitOnce gDefaultPropertiesInitOnce = U_INITONCE_INITIALIZER;
+
+void U_CALLCONV initDefaultProperties(UErrorCode&) {
+ new(kRawDefaultProperties) DecimalFormatProperties(); // set to the default instance
+}
+
+}
+
+
DecimalFormatProperties::DecimalFormatProperties() {
clear();
}
@@ -23,8 +38,10 @@ void DecimalFormatProperties::clear() {
decimalPatternMatchRequired = false;
decimalSeparatorAlwaysShown = false;
exponentSignAlwaysShown = false;
+ formatFailIfMoreThanMaxDigits = false;
formatWidth = -1;
groupingSize = -1;
+ groupingUsed = true;
magnitudeMultiplier = 0;
maximumFractionDigits = -1;
maximumIntegerDigits = -1;
@@ -34,7 +51,8 @@ void DecimalFormatProperties::clear() {
minimumGroupingDigits = -1;
minimumIntegerDigits = -1;
minimumSignificantDigits = -1;
- multiplier = 0;
+ multiplier = 1;
+ multiplierScale = 0;
negativePrefix.setToBogus();
negativePrefixPattern.setToBogus();
negativeSuffix.setToBogus();
@@ -43,9 +61,10 @@ void DecimalFormatProperties::clear() {
padString.setToBogus();
parseCaseSensitive = false;
parseIntegerOnly = false;
- parseLenient = false;
+ parseMode.nullify();
parseNoExponent = false;
parseToBigDecimal = false;
+ parseAllInput = UNUM_MAYBE;
positivePrefix.setToBogus();
positivePrefixPattern.setToBogus();
positiveSuffix.setToBogus();
@@ -56,47 +75,70 @@ void DecimalFormatProperties::clear() {
signAlwaysShown = false;
}
-bool DecimalFormatProperties::operator==(const DecimalFormatProperties &other) const {
+bool
+DecimalFormatProperties::_equals(const DecimalFormatProperties& other, bool ignoreForFastFormat) const {
bool eq = true;
+
+ // Properties that must be equal both normally and for fast-path formatting
eq = eq && compactStyle == other.compactStyle;
eq = eq && currency == other.currency;
eq = eq && currencyPluralInfo.fPtr.getAlias() == other.currencyPluralInfo.fPtr.getAlias();
eq = eq && currencyUsage == other.currencyUsage;
- eq = eq && decimalPatternMatchRequired == other.decimalPatternMatchRequired;
eq = eq && decimalSeparatorAlwaysShown == other.decimalSeparatorAlwaysShown;
eq = eq && exponentSignAlwaysShown == other.exponentSignAlwaysShown;
+ eq = eq && formatFailIfMoreThanMaxDigits == other.formatFailIfMoreThanMaxDigits;
eq = eq && formatWidth == other.formatWidth;
- eq = eq && groupingSize == other.groupingSize;
eq = eq && magnitudeMultiplier == other.magnitudeMultiplier;
- eq = eq && maximumFractionDigits == other.maximumFractionDigits;
- eq = eq && maximumIntegerDigits == other.maximumIntegerDigits;
eq = eq && maximumSignificantDigits == other.maximumSignificantDigits;
eq = eq && minimumExponentDigits == other.minimumExponentDigits;
- eq = eq && minimumFractionDigits == other.minimumFractionDigits;
eq = eq && minimumGroupingDigits == other.minimumGroupingDigits;
- eq = eq && minimumIntegerDigits == other.minimumIntegerDigits;
eq = eq && minimumSignificantDigits == other.minimumSignificantDigits;
eq = eq && multiplier == other.multiplier;
+ eq = eq && multiplierScale == other.multiplierScale;
eq = eq && negativePrefix == other.negativePrefix;
- eq = eq && negativePrefixPattern == other.negativePrefixPattern;
eq = eq && negativeSuffix == other.negativeSuffix;
- eq = eq && negativeSuffixPattern == other.negativeSuffixPattern;
eq = eq && padPosition == other.padPosition;
eq = eq && padString == other.padString;
- eq = eq && parseCaseSensitive == other.parseCaseSensitive;
- eq = eq && parseIntegerOnly == other.parseIntegerOnly;
- eq = eq && parseLenient == other.parseLenient;
- eq = eq && parseNoExponent == other.parseNoExponent;
- eq = eq && parseToBigDecimal == other.parseToBigDecimal;
eq = eq && positivePrefix == other.positivePrefix;
- eq = eq && positivePrefixPattern == other.positivePrefixPattern;
eq = eq && positiveSuffix == other.positiveSuffix;
- eq = eq && positiveSuffixPattern == other.positiveSuffixPattern;
eq = eq && roundingIncrement == other.roundingIncrement;
eq = eq && roundingMode == other.roundingMode;
eq = eq && secondaryGroupingSize == other.secondaryGroupingSize;
eq = eq && signAlwaysShown == other.signAlwaysShown;
+
+ if (ignoreForFastFormat) {
+ return eq;
+ }
+
+ // Properties ignored by fast-path formatting
+ // Formatting (special handling required):
+ eq = eq && groupingSize == other.groupingSize;
+ eq = eq && groupingUsed == other.groupingUsed;
+ eq = eq && minimumFractionDigits == other.minimumFractionDigits;
+ eq = eq && maximumFractionDigits == other.maximumFractionDigits;
+ eq = eq && maximumIntegerDigits == other.maximumIntegerDigits;
+ eq = eq && minimumIntegerDigits == other.minimumIntegerDigits;
+ eq = eq && negativePrefixPattern == other.negativePrefixPattern;
+ eq = eq && negativeSuffixPattern == other.negativeSuffixPattern;
+ eq = eq && positivePrefixPattern == other.positivePrefixPattern;
+ eq = eq && positiveSuffixPattern == other.positiveSuffixPattern;
+
+ // Parsing (always safe to ignore):
+ eq = eq && decimalPatternMatchRequired == other.decimalPatternMatchRequired;
+ eq = eq && parseCaseSensitive == other.parseCaseSensitive;
+ eq = eq && parseIntegerOnly == other.parseIntegerOnly;
+ eq = eq && parseMode == other.parseMode;
+ eq = eq && parseNoExponent == other.parseNoExponent;
+ eq = eq && parseToBigDecimal == other.parseToBigDecimal;
+ eq = eq && parseAllInput == other.parseAllInput;
+
return eq;
}
+bool DecimalFormatProperties::equalsDefaultExceptFastFormat() const {
+ UErrorCode localStatus = U_ZERO_ERROR;
+ umtx_initOnce(gDefaultPropertiesInitOnce, &initDefaultProperties, localStatus);
+ return _equals(*reinterpret_cast<DecimalFormatProperties*>(kRawDefaultProperties), true);
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */