From d0dc3fdc0e59565a283599a058a837f6f0b2b8e3 Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 8 Apr 2024 08:59:35 +0000 Subject: [PATCH] Optimised performance for some components. --- include/fn/basicArithm.hpp | 6 ++++++ src/power/power.cpp | 31 ++++++++++++++++++++++++++++--- src/power/powerReport.cpp | 18 ++++++++++++++++++ src/power/powerReport.hpp | 6 +++++- 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/include/fn/basicArithm.hpp b/include/fn/basicArithm.hpp index 708c74304..109b45ab9 100644 --- a/include/fn/basicArithm.hpp +++ b/include/fn/basicArithm.hpp @@ -181,6 +181,12 @@ namespace steppable::__internals::arithmetic template void loop(const std::string_view& times, Pred predicate) { + // We're done already! + if (times == "0") + return; + if (times == "1") + return predicate("1"); + std::string current = "0"; auto result = compare(current, times, 0); diff --git a/src/power/power.cpp b/src/power/power.cpp index a8d24747e..5c80db796 100644 --- a/src/power/power.cpp +++ b/src/power/power.cpp @@ -40,7 +40,33 @@ namespace steppable::__internals::arithmetic { std::string power(const std::string_view _number, const std::string_view& _raiseTo, const int steps) { - std::string raiseTo = static_cast(_raiseTo); + std::string raiseTo = static_cast(_raiseTo), number = static_cast(_number); + + // Here, we attempt to give a quick answer, instead of doing pointless iterations. + if (number == "1") + { + if (steps == 2) + return "Since the number is 1, the result is 1."; + else if (steps == 1) + return "1"s + symbols::makeSuperscript(static_cast(raiseTo)) + " = 1"; + else + return "1"; + } + else if (number == "0") + { + if (steps == 2) + return "Since the number is 0, the result is 0."; + else if (steps == 1) + return "0"s + symbols::makeSuperscript(static_cast(raiseTo)) + " = 0"; + else + return "0"; + } + + auto numberNoTrailingZeros = removeTrailingZeros(number); + size_t numberTrailingZeros = number.length() - numberNoTrailingZeros.length(); + // Remove the zeros to reduce the workload. + number = numberNoTrailingZeros; + bool negative = false; if (compare(raiseTo, "0", 0) == "0") { @@ -48,8 +74,7 @@ namespace steppable::__internals::arithmetic raiseTo = raiseTo.substr(1); negative = true; } - std::string numberOrig = static_cast(_number), number = "1"; - return reportPower(_number, raiseTo, negative, steps); + return reportPower(number, raiseTo, numberTrailingZeros, negative, steps); } } // namespace steppable::__internals::arithmetic diff --git a/src/power/powerReport.cpp b/src/power/powerReport.cpp index 81c7aa4a2..eddf426c3 100644 --- a/src/power/powerReport.cpp +++ b/src/power/powerReport.cpp @@ -43,13 +43,28 @@ using namespace steppable::__internals::arithmetic; std::string reportPower(const std::string_view _number, const std::string_view& raiseTo, + const size_t numberTrailingZeros, const bool negative, const int steps) { std::stringstream ss; const auto numberOrig = static_cast(_number); + auto number = "1"s; + // Here, we attempt to give a quick answer, instead of doing pointless iterations. + if (numberOrig == "1") + goto finish; + else if (numberOrig == "0") + { + if (steps == 2) + return "Since the number is 0, the result is 0."; + else if (steps == 1) + return "0"s + makeSuperscript(static_cast(raiseTo)) + " = 0"; + else + return "0"; + } + loop(raiseTo, [&](const auto& i) { if (not negative) number = multiply(number, numberOrig, 0); @@ -69,6 +84,7 @@ std::string reportPower(const std::string_view _number, } }); +finish: if (negative) { if (steps == 2) @@ -88,5 +104,7 @@ std::string reportPower(const std::string_view _number, else if (steps == 0) ss << number; + loop(multiply(raiseTo, std::to_string(numberTrailingZeros), 0), [&](const auto& _) { ss << "0"; }); + return ss.str(); } diff --git a/src/power/powerReport.hpp b/src/power/powerReport.hpp index 8460f31da..0042ed41a 100644 --- a/src/power/powerReport.hpp +++ b/src/power/powerReport.hpp @@ -39,4 +39,8 @@ * * @return The formatted power report. */ -std::string reportPower(std::string_view _number, const std::string_view& raiseTo, bool negative, int steps); +std::string reportPower(const std::string_view _number, + const std::string_view& raiseTo, + const size_t numberTrailingZeros, + const bool negative, + const int steps); \ No newline at end of file