Produce JS-visible string results as UTF-16 at their source, including numeric formatting, BigInt and BigFraction formatting, URI encoding, console formatting, parser errors, regular expression errors, Intl and Temporal records, LibUnicode locale boundaries, and LibWeb bindings. Handle fractional radix formatting through the UTF-16 builder view.
116 lines
2.7 KiB
C++
116 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2022-2024, Tim Flynn <trflynn89@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibJS/Runtime/Intl/MathematicalValue.h>
|
|
|
|
namespace JS::Intl {
|
|
|
|
MathematicalValue::MathematicalValue(Value value)
|
|
{
|
|
if (value.is_number()) {
|
|
m_value = value_from_number(value.as_double());
|
|
return;
|
|
}
|
|
|
|
m_value = MUST(value.as_bigint().big_integer().to_base_utf16(10));
|
|
}
|
|
|
|
bool MathematicalValue::is_number() const
|
|
{
|
|
return m_value.has<double>();
|
|
}
|
|
|
|
double MathematicalValue::as_number() const
|
|
{
|
|
VERIFY(is_number());
|
|
return m_value.get<double>();
|
|
}
|
|
|
|
bool MathematicalValue::is_string() const
|
|
{
|
|
return m_value.has<Utf16String>();
|
|
}
|
|
|
|
Utf16String const& MathematicalValue::as_string() const
|
|
{
|
|
VERIFY(is_string());
|
|
return m_value.get<Utf16String>();
|
|
}
|
|
|
|
bool MathematicalValue::is_mathematical_value() const
|
|
{
|
|
return is_number() || is_string();
|
|
}
|
|
|
|
bool MathematicalValue::is_positive_infinity() const
|
|
{
|
|
if (is_mathematical_value())
|
|
return false;
|
|
return m_value.get<Symbol>() == Symbol::PositiveInfinity;
|
|
}
|
|
|
|
bool MathematicalValue::is_negative_infinity() const
|
|
{
|
|
if (is_mathematical_value())
|
|
return false;
|
|
return m_value.get<Symbol>() == Symbol::NegativeInfinity;
|
|
}
|
|
|
|
bool MathematicalValue::is_negative_zero() const
|
|
{
|
|
if (is_mathematical_value())
|
|
return false;
|
|
return m_value.get<Symbol>() == Symbol::NegativeZero;
|
|
}
|
|
|
|
bool MathematicalValue::is_nan() const
|
|
{
|
|
if (is_mathematical_value())
|
|
return false;
|
|
return m_value.get<Symbol>() == Symbol::NotANumber;
|
|
}
|
|
|
|
Unicode::NumberFormat::Value MathematicalValue::to_value() const
|
|
{
|
|
return m_value.visit(
|
|
[](double value) -> Unicode::NumberFormat::Value {
|
|
return value;
|
|
},
|
|
[](Utf16String const& value) -> Unicode::NumberFormat::Value {
|
|
return value;
|
|
},
|
|
[](auto symbol) -> Unicode::NumberFormat::Value {
|
|
switch (symbol) {
|
|
case Symbol::PositiveInfinity:
|
|
return js_infinity().as_double();
|
|
case Symbol::NegativeInfinity:
|
|
return js_negative_infinity().as_double();
|
|
case Symbol::NegativeZero:
|
|
return -0.0;
|
|
case Symbol::NotANumber:
|
|
return js_nan().as_double();
|
|
}
|
|
|
|
VERIFY_NOT_REACHED();
|
|
});
|
|
}
|
|
|
|
MathematicalValue::ValueType MathematicalValue::value_from_number(double number)
|
|
{
|
|
Value value(number);
|
|
|
|
if (value.is_positive_infinity())
|
|
return Symbol::PositiveInfinity;
|
|
if (value.is_negative_infinity())
|
|
return Symbol::NegativeInfinity;
|
|
if (value.is_negative_zero())
|
|
return Symbol::NegativeZero;
|
|
if (value.is_nan())
|
|
return Symbol::NotANumber;
|
|
return number;
|
|
}
|
|
|
|
}
|