ladybird/Libraries/LibJS/Runtime/Intl/MathematicalValue.cpp
Andreas Kling 7025dd1fa7 Libraries: Parse JS strings from UTF-16
Thread UTF-16 string input through JSON, script parsing, Date parsing,
Intl option parsing, Temporal parsing, and the helper library boundaries
that feed those parsers. Preserve ASCII fast paths where the source data
is known to be ASCII.
2026-06-22 19:51:25 +02:00

106 lines
2.5 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 {
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;
}
}