#pragma once
#if ENABLE(INTL)
#include "JSDestructibleObject.h"
#include <unicode/unum.h>
#include <unicode/upluralrules.h>
#include <unicode/uvernum.h>
#define JSC_ICU_HAS_PLURALRULES_KEYWORDS (U_ICU_VERSION_MAJOR_NUM >= 59)
#define JSC_ICU_HAS_PLURALRULES_WITH_FORMAT (U_ICU_VERSION_MAJOR_NUM >= 59)
namespace JSC {
class IntlPluralRulesConstructor;
class JSBoundFunction;
class IntlPluralRules final : public JSDestructibleObject {
public:
typedef JSDestructibleObject Base;
static IntlPluralRules* create(VM&, Structure*);
static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
DECLARE_INFO;
void initializePluralRules(ExecState&, JSValue locales, JSValue options);
JSValue select(ExecState&, double value);
JSObject* resolvedOptions(ExecState&);
protected:
IntlPluralRules(VM&, Structure*);
void finishCreation(VM&);
static void destroy(JSCell*);
static void visitChildren(JSCell*, SlotVisitor&);
private:
struct UPluralRulesDeleter {
void operator()(UPluralRules*) const;
};
struct UNumberFormatDeleter {
void operator()(UNumberFormat*) const;
};
bool m_initializedPluralRules { false };
std::unique_ptr<UPluralRules, UPluralRulesDeleter> m_pluralRules;
std::unique_ptr<UNumberFormat, UNumberFormatDeleter> m_numberFormat;
String m_locale;
UPluralType m_type { UPLURAL_TYPE_CARDINAL };
unsigned m_minimumIntegerDigits { 1 };
unsigned m_minimumFractionDigits { 0 };
unsigned m_maximumFractionDigits { 3 };
std::optional<unsigned> m_minimumSignificantDigits;
std::optional<unsigned> m_maximumSignificantDigits;
};
}
#endif // ENABLE(INTL)