155 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| // © 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 "number_decimfmtprops.h"
 | |
| #include "umutex.h"
 | |
| 
 | |
| using namespace icu;
 | |
| using namespace icu::number;
 | |
| using namespace icu::number::impl;
 | |
| 
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| alignas(DecimalFormatProperties)
 | |
| char kRawDefaultProperties[sizeof(DecimalFormatProperties)];
 | |
| 
 | |
| icu::UInitOnce gDefaultPropertiesInitOnce = U_INITONCE_INITIALIZER;
 | |
| 
 | |
| void U_CALLCONV initDefaultProperties(UErrorCode&) {
 | |
|     // can't fail, uses placement new into statically allocated space.
 | |
|     new(kRawDefaultProperties) DecimalFormatProperties(); // set to the default instance
 | |
| }
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| DecimalFormatProperties::DecimalFormatProperties() {
 | |
|     clear();
 | |
| }
 | |
| 
 | |
| void DecimalFormatProperties::clear() {
 | |
|     compactStyle.nullify();
 | |
|     currency.nullify();
 | |
|     currencyPluralInfo.fPtr.adoptInstead(nullptr);
 | |
|     currencyUsage.nullify();
 | |
|     decimalPatternMatchRequired = false;
 | |
|     decimalSeparatorAlwaysShown = false;
 | |
|     exponentSignAlwaysShown = false;
 | |
|     currencyAsDecimal = false;
 | |
|     formatFailIfMoreThanMaxDigits = false;
 | |
|     formatWidth = -1;
 | |
|     groupingSize = -1;
 | |
|     groupingUsed = true;
 | |
|     magnitudeMultiplier = 0;
 | |
|     maximumFractionDigits = -1;
 | |
|     maximumIntegerDigits = -1;
 | |
|     maximumSignificantDigits = -1;
 | |
|     minimumExponentDigits = -1;
 | |
|     minimumFractionDigits = -1;
 | |
|     minimumGroupingDigits = -1;
 | |
|     minimumIntegerDigits = -1;
 | |
|     minimumSignificantDigits = -1;
 | |
|     multiplier = 1;
 | |
|     multiplierScale = 0;
 | |
|     negativePrefix.setToBogus();
 | |
|     negativePrefixPattern.setToBogus();
 | |
|     negativeSuffix.setToBogus();
 | |
|     negativeSuffixPattern.setToBogus();
 | |
|     padPosition.nullify();
 | |
|     padString.setToBogus();
 | |
|     parseCaseSensitive = false;
 | |
|     parseIntegerOnly = false;
 | |
|     parseMode.nullify();
 | |
|     parseNoExponent = false;
 | |
|     parseToBigDecimal = false;
 | |
|     parseAllInput = UNUM_MAYBE;
 | |
|     positivePrefix.setToBogus();
 | |
|     positivePrefixPattern.setToBogus();
 | |
|     positiveSuffix.setToBogus();
 | |
|     positiveSuffixPattern.setToBogus();
 | |
|     roundingIncrement = 0.0;
 | |
|     roundingMode.nullify();
 | |
|     secondaryGroupingSize = -1;
 | |
|     signAlwaysShown = false;
 | |
| }
 | |
| 
 | |
| 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 && decimalSeparatorAlwaysShown == other.decimalSeparatorAlwaysShown;
 | |
|     eq = eq && exponentSignAlwaysShown == other.exponentSignAlwaysShown;
 | |
|     eq = eq && currencyAsDecimal == other.currencyAsDecimal;
 | |
|     eq = eq && formatFailIfMoreThanMaxDigits == other.formatFailIfMoreThanMaxDigits;
 | |
|     eq = eq && formatWidth == other.formatWidth;
 | |
|     eq = eq && magnitudeMultiplier == other.magnitudeMultiplier;
 | |
|     eq = eq && maximumSignificantDigits == other.maximumSignificantDigits;
 | |
|     eq = eq && minimumExponentDigits == other.minimumExponentDigits;
 | |
|     eq = eq && minimumGroupingDigits == other.minimumGroupingDigits;
 | |
|     eq = eq && minimumSignificantDigits == other.minimumSignificantDigits;
 | |
|     eq = eq && multiplier == other.multiplier;
 | |
|     eq = eq && multiplierScale == other.multiplierScale;
 | |
|     eq = eq && negativePrefix == other.negativePrefix;
 | |
|     eq = eq && negativeSuffix == other.negativeSuffix;
 | |
|     eq = eq && padPosition == other.padPosition;
 | |
|     eq = eq && padString == other.padString;
 | |
|     eq = eq && positivePrefix == other.positivePrefix;
 | |
|     eq = eq && positiveSuffix == other.positiveSuffix;
 | |
|     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);
 | |
| }
 | |
| 
 | |
| const DecimalFormatProperties& DecimalFormatProperties::getDefault() {
 | |
|     UErrorCode localStatus = U_ZERO_ERROR;
 | |
|     umtx_initOnce(gDefaultPropertiesInitOnce, &initDefaultProperties, localStatus);
 | |
|     return *reinterpret_cast<const DecimalFormatProperties*>(kRawDefaultProperties);
 | |
| }
 | |
| 
 | |
| #endif /* #if !UCONFIG_NO_FORMATTING */
 |