mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 12:07:45 +00:00
LibJS: Use a template for 'Value from integral number' constructors
This also allows constructing from other integral types like u64, which would have been ambiguous before (at least on i686): ``` error: call of overloaded 'Value(u64&)' is ambiguous note: candidate: 'JS::Value::Value(i32)' 175 | explicit Value(i32 value) | ^~~~~ note: candidate: 'JS::Value::Value(unsigned int)' 164 | explicit Value(unsigned value) | ^~~~~ note: candidate: 'JS::Value::Value(long unsigned int)' 153 | explicit Value(unsigned long value) | ^~~~~ note: candidate: 'JS::Value::Value(double)' 141 | explicit Value(double value) | ^~~~~ ```
This commit is contained in:
parent
c860d8f5be
commit
1132151f3d
1 changed files with 7 additions and 13 deletions
|
@ -132,7 +132,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
requires(SameAs<RemoveCVReference<T>, bool>) explicit Value(T value)
|
requires(IsSameIgnoringCV<T, bool>) explicit Value(T value)
|
||||||
: m_type(Type::Boolean)
|
: m_type(Type::Boolean)
|
||||||
{
|
{
|
||||||
m_value.as_bool = value;
|
m_value.as_bool = value;
|
||||||
|
@ -150,18 +150,12 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit Value(unsigned long value)
|
// NOTE: A couple of integral types are excluded here:
|
||||||
{
|
// - i32 has its own dedicated Value constructor
|
||||||
if (value > NumericLimits<i32>::max()) {
|
// - i64 cannot safely be cast to a double
|
||||||
m_value.as_double = static_cast<double>(value);
|
// - bool isn't a number type and has its own dedicated Value constructor
|
||||||
m_type = Type::Double;
|
template<typename T>
|
||||||
} else {
|
requires(IsIntegral<T> && !IsSameIgnoringCV<T, i32> && !IsSameIgnoringCV<T, i64> && !IsSameIgnoringCV<T, bool>) explicit Value(T value)
|
||||||
m_value.as_i32 = static_cast<i32>(value);
|
|
||||||
m_type = Type::Int32;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit Value(unsigned value)
|
|
||||||
{
|
{
|
||||||
if (value > NumericLimits<i32>::max()) {
|
if (value > NumericLimits<i32>::max()) {
|
||||||
m_value.as_double = static_cast<double>(value);
|
m_value.as_double = static_cast<double>(value);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue