// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #pragma once #include "CalculatorHistory.h" #include "Header Files/CalcEngine.h" #include "Header Files/Rational.h" #include "Header Files/ICalcDisplay.h" namespace CalculationManager { enum class Command; struct HISTORYITEM; enum class CalculatorMode { StandardMode, ScientificMode, ProgrammerMode, }; enum class CalculatorPrecision { StandardModePrecision = 16, ScientificModePrecision = 32, ProgrammerModePrecision = 64 }; // Numbering continues from the Enum Command from Command.h // with some gap to ensure there is no overlap of these ids // when static_cast is performed on these ids // they shouldn't fall in any number range greater than 80. So never // make the memory command ids go below 330 enum class MemoryCommand { MemorizeNumber = 330, MemorizedNumberLoad = 331, MemorizedNumberAdd = 332, MemorizedNumberSubtract = 333, MemorizedNumberClearAll = 334, MemorizedNumberClear = 335 }; class CalculatorManager sealed : public virtual ICalcDisplay { private: ICalcDisplay* const m_displayCallback; CCalcEngine* m_currentCalculatorEngine; std::unique_ptr m_scientificCalculatorEngine; std::unique_ptr m_standardCalculatorEngine; std::unique_ptr m_programmerCalculatorEngine; IResourceProvider* const m_resourceProvider; bool m_inHistoryItemLoadMode; std::vector m_memorizedNumbers; CalcEngine::Rational m_persistedPrimaryValue; bool m_isExponentialFormat; static const unsigned int m_maximumMemorySize = 100; // For persistence std::vector m_savedCommands; std::vector m_savedPrimaryValue; std::vector m_serializedMemory; std::vector m_currentSerializedMemory; Command m_currentDegreeMode; Command m_savedDegreeMode; unsigned char MapCommandForSerialize(Command command); unsigned int MapCommandForDeSerialize(unsigned char command); void SaveMemoryCommand(_In_ MemoryCommand command, _In_ unsigned int indexOfMemory); void MemorizedNumberSelect(_In_ unsigned int); void MemorizedNumberChanged(_In_ unsigned int); void LoadPersistedPrimaryValue(); static std::vector SerializeRational(CalcEngine::Rational const& rat); static CalcEngine::Rational DeSerializeRational(std::vector::const_iterator itr); static std::vector SerializeNumber(CalcEngine::Number const& num); static CalcEngine::Number DeSerializeNumber(std::vector::const_iterator itr); std::shared_ptr m_pStdHistory; std::shared_ptr m_pSciHistory; CalculatorHistory* m_pHistory; public: // ICalcDisplay void SetPrimaryDisplay(_In_ const std::wstring& displayString, _In_ bool isError) override; void SetIsInError(bool isError) override; void SetExpressionDisplay(_Inout_ std::shared_ptr>> const &tokens, _Inout_ std::shared_ptr>> const &commands) override; void SetMemorizedNumbers(_In_ const std::vector& memorizedNumbers) override; void OnHistoryItemAdded(_In_ unsigned int addedItemIndex) override; void SetParenDisplayText(const std::wstring& parenthesisCount); void DisplayPasteError(); void MaxDigitsReached() override; void BinaryOperatorReceived() override; void MemoryItemChanged(unsigned int indexOfMemory) override; CalculatorManager(ICalcDisplay* displayCallback, IResourceProvider* resourceProvider); ~CalculatorManager(); void Reset(bool clearMemory = true); void SetStandardMode(); void SetScientificMode(); void SetProgrammerMode(); void SendCommand(_In_ Command command); std::vector SerializeCommands(); void DeSerializeCommands(_In_ const std::vector& serializedData); void SerializeMemory(); std::vector GetSerializedMemory(); void DeSerializeMemory(const std::vector &serializedMemory); void SerializePrimaryDisplay(); std::vector GetSerializedPrimaryDisplay(); void DeSerializePrimaryDisplay(const std::vector &serializedPrimaryDisplay); Command SerializeSavedDegreeMode(); void MemorizeNumber(); void MemorizedNumberLoad(_In_ unsigned int); void MemorizedNumberAdd(_In_ unsigned int); void MemorizedNumberSubtract(_In_ unsigned int); void MemorizedNumberClear(_In_ unsigned int); void MemorizedNumberClearAll(); bool IsEngineRecording(); std::vector GetSavedCommands(){ return m_savedCommands; } void SetRadix(RADIX_TYPE iRadixType); void SetMemorizedNumbersString(); std::wstring GetResultForRadix(uint32_t radix, int32_t precision); void SetPrecision(int32_t precision); void UpdateMaxIntDigits(); wchar_t DecimalSeparator(); std::vector> const& GetHistoryItems(); std::vector> const& GetHistoryItems(_In_ CalculationManager::CALCULATOR_MODE mode); std::shared_ptr const& GetHistoryItem(_In_ unsigned int uIdx); bool RemoveHistoryItem(_In_ unsigned int uIdx); void ClearHistory(); const size_t MaxHistorySize() const { return m_pHistory->MaxHistorySize(); } CalculationManager::Command GetCurrentDegreeMode(); void SetHistory(_In_ CALCULATOR_MODE eMode, _In_ std::vector> const& history); void SetInHistoryItemLoadMode(_In_ bool isHistoryItemLoadMode); }; }