1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-28 08:07:44 +00:00

Calculator: Support chaining and repeating operations

The calculator now supports chaining (hitting "1+2+3=" shows "6"
instead of "5") and repeating ("2+2===" shows "8") operations. :^)
This commit is contained in:
Karol Baraniecki 2022-12-26 17:12:46 +01:00 committed by Andreas Kling
parent ef9fd6c286
commit 21cc8f65f5
5 changed files with 126 additions and 72 deletions

View file

@ -7,6 +7,7 @@
#pragma once
#include <AK/Optional.h>
#include <LibCrypto/BigFraction/BigFraction.h>
// This type implements the regular calculator
@ -36,11 +37,13 @@ public:
MemClear,
MemRecall,
MemSave,
MemAdd
MemAdd,
Equals
};
Crypto::BigFraction begin_operation(Operation, Crypto::BigFraction);
Crypto::BigFraction finish_operation(Crypto::BigFraction);
Optional<Crypto::BigFraction> operation_with_literal_argument(Operation, Crypto::BigFraction);
Optional<Crypto::BigFraction> operation_without_argument(Operation);
bool has_error() const { return m_has_error; }
@ -48,8 +51,16 @@ public:
void clear_error() { m_has_error = false; }
private:
Operation m_operation_in_progress { Operation::None };
Crypto::BigFraction m_saved_argument {};
Crypto::BigFraction m_mem {};
Crypto::BigFraction m_current_value {};
Operation m_binary_operation_in_progress { Operation::None };
Crypto::BigFraction m_binary_operation_saved_left_side {};
Operation m_previous_operation { Operation::None };
Crypto::BigFraction m_previous_binary_operation_right_side {};
bool m_has_error { false };
Crypto::BigFraction finish_binary_operation(Crypto::BigFraction const& left_side, Operation operation, Crypto::BigFraction const& right_side);
};