
This proposal has been merged into the main ECMA-402 spec. See: https://github.com/tc39/ecma402/commit/4257160 Note this includes some editorial and normative changes made when the proposal was merged into the main spec, but are not in the proposal spec itself. In particular, the following AOs were changed: PartitionNumberRangePattern (normative) SetNumberFormatDigitOptions (editorial)
103 lines
2.6 KiB
C++
103 lines
2.6 KiB
C++
/*
|
|
* Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Checked.h>
|
|
#include <AK/String.h>
|
|
#include <AK/Variant.h>
|
|
#include <LibCrypto/BigInt/SignedBigInteger.h>
|
|
#include <LibJS/Runtime/BigInt.h>
|
|
#include <LibJS/Runtime/Value.h>
|
|
|
|
namespace JS::Intl {
|
|
|
|
// https://tc39.es/ecma402/#intl-mathematical-value
|
|
class MathematicalValue {
|
|
public:
|
|
enum class Symbol {
|
|
PositiveInfinity,
|
|
NegativeInfinity,
|
|
NegativeZero,
|
|
NotANumber,
|
|
};
|
|
|
|
MathematicalValue() = default;
|
|
|
|
explicit MathematicalValue(double value)
|
|
: m_value(value_from_number(value))
|
|
{
|
|
}
|
|
|
|
explicit MathematicalValue(Crypto::SignedBigInteger value)
|
|
: m_value(move(value))
|
|
{
|
|
}
|
|
|
|
explicit MathematicalValue(Symbol symbol)
|
|
: m_value(symbol)
|
|
{
|
|
}
|
|
|
|
MathematicalValue(Value value)
|
|
: m_value(value.is_number()
|
|
? value_from_number(value.as_double())
|
|
: ValueType(value.as_bigint().big_integer()))
|
|
{
|
|
}
|
|
|
|
bool is_number() const;
|
|
double as_number() const;
|
|
|
|
bool is_bigint() const;
|
|
Crypto::SignedBigInteger const& as_bigint() const;
|
|
|
|
bool is_mathematical_value() const;
|
|
bool is_positive_infinity() const;
|
|
bool is_negative_infinity() const;
|
|
bool is_negative_zero() const;
|
|
bool is_nan() const;
|
|
|
|
void negate();
|
|
|
|
MathematicalValue plus(Checked<i32> addition) const;
|
|
MathematicalValue plus(MathematicalValue const& addition) const;
|
|
|
|
MathematicalValue minus(Checked<i32> subtraction) const;
|
|
MathematicalValue minus(MathematicalValue const& subtraction) const;
|
|
|
|
MathematicalValue multiplied_by(Checked<i32> multiplier) const;
|
|
MathematicalValue multiplied_by(MathematicalValue const& multiplier) const;
|
|
|
|
MathematicalValue divided_by(Checked<i32> divisor) const;
|
|
MathematicalValue divided_by(MathematicalValue const& divisor) const;
|
|
|
|
MathematicalValue multiplied_by_power(Checked<i32> exponent) const;
|
|
MathematicalValue divided_by_power(Checked<i32> exponent) const;
|
|
|
|
bool modulo_is_zero(Checked<i32> mod) const;
|
|
|
|
ThrowCompletionOr<int> logarithmic_floor(VM&) const;
|
|
|
|
bool is_equal_to(MathematicalValue const&) const;
|
|
bool is_less_than(MathematicalValue const&) const;
|
|
|
|
bool is_negative() const;
|
|
bool is_positive() const;
|
|
bool is_zero() const;
|
|
|
|
ThrowCompletionOr<String> to_string(VM&) const;
|
|
Value to_value(VM&) const;
|
|
|
|
private:
|
|
using ValueType = Variant<double, Crypto::SignedBigInteger, Symbol>;
|
|
|
|
static ValueType value_from_number(double number);
|
|
|
|
ValueType m_value { 0.0 };
|
|
};
|
|
|
|
}
|