// © 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 */
