mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:07:45 +00:00
Calculator: Make double construction and conversion private
At this point, the double conversions should really only be implementation details of the KeypadValue class. Therefore, the constructor-from double and conversion-operator-to double of KeypadValue are made private. Instead, the required functionality is provided by KeypadValue itself. The internal implementation is still done using doubles. However, this opens us up to the possibility of having loss-free square root, inversion and division in the future.
This commit is contained in:
parent
b2f0697afc
commit
4b2b0a4d0e
3 changed files with 25 additions and 6 deletions
|
@ -38,7 +38,7 @@ KeypadValue Calculator::begin_operation(Operation operation, KeypadValue argumen
|
||||||
m_has_error = true;
|
m_has_error = true;
|
||||||
return argument;
|
return argument;
|
||||||
}
|
}
|
||||||
res = KeypadValue { AK::sqrt((double)argument) };
|
res = argument.sqrt();
|
||||||
clear_operation();
|
clear_operation();
|
||||||
break;
|
break;
|
||||||
case Operation::Inverse:
|
case Operation::Inverse:
|
||||||
|
@ -46,7 +46,7 @@ KeypadValue Calculator::begin_operation(Operation operation, KeypadValue argumen
|
||||||
m_has_error = true;
|
m_has_error = true;
|
||||||
return argument;
|
return argument;
|
||||||
}
|
}
|
||||||
res = KeypadValue { 1.0 / (double)argument };
|
res = argument.invert();
|
||||||
clear_operation();
|
clear_operation();
|
||||||
break;
|
break;
|
||||||
case Operation::Percent:
|
case Operation::Percent:
|
||||||
|
@ -98,7 +98,7 @@ KeypadValue Calculator::finish_operation(KeypadValue argument)
|
||||||
m_has_error = true;
|
m_has_error = true;
|
||||||
return argument;
|
return argument;
|
||||||
}
|
}
|
||||||
res = KeypadValue { (double)m_saved_argument / (double)argument };
|
res = m_saved_argument / argument;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Operation::Sqrt:
|
case Operation::Sqrt:
|
||||||
|
|
|
@ -68,6 +68,21 @@ KeypadValue KeypadValue::operator-(void) const
|
||||||
return { -m_value, m_decimal_places };
|
return { -m_value, m_decimal_places };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KeypadValue KeypadValue::sqrt(void) const
|
||||||
|
{
|
||||||
|
return KeypadValue { AK::sqrt((double)(*this)) };
|
||||||
|
}
|
||||||
|
|
||||||
|
KeypadValue KeypadValue::invert(void) const
|
||||||
|
{
|
||||||
|
return KeypadValue { 1.0 / (double)(*this) };
|
||||||
|
}
|
||||||
|
|
||||||
|
KeypadValue KeypadValue::operator/(KeypadValue const& rhs)
|
||||||
|
{
|
||||||
|
return KeypadValue { (double)(*this) / (double)rhs };
|
||||||
|
}
|
||||||
|
|
||||||
bool KeypadValue::operator<(KeypadValue const& rhs)
|
bool KeypadValue::operator<(KeypadValue const& rhs)
|
||||||
{
|
{
|
||||||
return operator_helper<bool>(*this, rhs, [](KeypadValue const&, KeypadValue const&, i64 less_decimal_places_equalized, i64 more_decimal_places_equalized, bool lhs_is_less) {
|
return operator_helper<bool>(*this, rhs, [](KeypadValue const&, KeypadValue const&, i64 less_decimal_places_equalized, i64 more_decimal_places_equalized, bool lhs_is_less) {
|
||||||
|
@ -139,7 +154,7 @@ KeypadValue::KeypadValue(double d)
|
||||||
m_value = negative ? (-m_value) : m_value;
|
m_value = negative ? (-m_value) : m_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeypadValue::operator double()
|
KeypadValue::operator double() const
|
||||||
{
|
{
|
||||||
double res = (double)m_value / AK::pow(10.0, (double)m_decimal_places);
|
double res = (double)m_value / AK::pow(10.0, (double)m_decimal_places);
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -27,10 +27,14 @@ public:
|
||||||
bool operator>(KeypadValue const&);
|
bool operator>(KeypadValue const&);
|
||||||
bool operator==(KeypadValue const&);
|
bool operator==(KeypadValue const&);
|
||||||
|
|
||||||
explicit KeypadValue(double);
|
KeypadValue sqrt() const;
|
||||||
explicit operator double();
|
KeypadValue invert() const;
|
||||||
|
KeypadValue operator/(KeypadValue const&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
explicit KeypadValue(double);
|
||||||
|
explicit operator double() const;
|
||||||
|
|
||||||
template<typename T, typename F>
|
template<typename T, typename F>
|
||||||
T operator_helper(KeypadValue const& lhs, KeypadValue const& rhs, F callback);
|
T operator_helper(KeypadValue const& lhs, KeypadValue const& rhs, F callback);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue