#pragma once
#include "IntlNumberFormat.h"
#include <unicode/unum.h>
#include <unicode/upluralrules.h>
#include <wtf/unicode/icu/ICUHelpers.h>
namespace JSC {
enum class RelevantExtensionKey : uint8_t;
class IntlPluralRules final : public JSNonFinalObject {
public:
using Base = JSNonFinalObject;
static constexpr bool needsDestruction = true;
static void destroy(JSCell* cell)
{
static_cast<IntlPluralRules*>(cell)->IntlPluralRules::~IntlPluralRules();
}
template<typename CellType, SubspaceAccess mode>
static IsoSubspace* subspaceFor(VM& vm)
{
return vm.intlPluralRulesSpace<mode>();
}
static IntlPluralRules* create(VM&, Structure*);
static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
DECLARE_INFO;
template<typename IntlType>
friend void setNumberFormatDigitOptions(JSGlobalObject*, IntlType*, JSObject*, unsigned minimumFractionDigitsDefault, unsigned maximumFractionDigitsDefault, IntlNotation);
void initializePluralRules(JSGlobalObject*, JSValue locales, JSValue options);
JSValue select(JSGlobalObject*, double value) const;
JSObject* resolvedOptions(JSGlobalObject*) const;
private:
IntlPluralRules(VM&, Structure*);
void finishCreation(VM&);
static void visitChildren(JSCell*, SlotVisitor&);
static Vector<String> localeData(const String&, RelevantExtensionKey);
enum class Type : bool { Cardinal, Ordinal };
using UPluralRulesDeleter = ICUDeleter<uplrules_close>;
using UNumberFormatDeleter = ICUDeleter<unum_close>;
std::unique_ptr<UPluralRules, UPluralRulesDeleter> m_pluralRules;
std::unique_ptr<UNumberFormat, UNumberFormatDeleter> m_numberFormat;
String m_locale;
unsigned m_minimumIntegerDigits { 1 };
unsigned m_minimumFractionDigits { 0 };
unsigned m_maximumFractionDigits { 3 };
unsigned m_minimumSignificantDigits { 0 };
unsigned m_maximumSignificantDigits { 0 };
IntlRoundingType m_roundingType { IntlRoundingType::FractionDigits };
Type m_type { Type::Cardinal };
};
}