From 73e259d6e7270ac3f0cff1197a711268113b3cfa Mon Sep 17 00:00:00 2001 From: WerWolv Date: Mon, 11 Jan 2021 00:27:00 +0100 Subject: [PATCH] Added engineering display mode to calculator --- plugins/libimhex/include/helpers/utils.hpp | 18 ++++++++++++++++++ source/views/view_tools.cpp | 12 +++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/plugins/libimhex/include/helpers/utils.hpp b/plugins/libimhex/include/helpers/utils.hpp index 9259ec107..ae6b8b944 100644 --- a/plugins/libimhex/include/helpers/utils.hpp +++ b/plugins/libimhex/include/helpers/utils.hpp @@ -158,6 +158,24 @@ namespace hex { return T(1) << bit_width(T(x - 1)); } + std::string toEngineeringString(double value) { + constexpr std::array prefixes = { "a", "f", "p", "n", "u", "m", "", "k", "M", "G", "T", "P", "E" }; + + int8_t prefixIndex = 6; + + while (prefixIndex != 0 && prefixIndex != 12 && (value >= 1000 || value < 1) && value != 0) { + if (value >= 1000) { + value /= 1000; + prefixIndex++; + } else if (value < 1) { + value *= 1000; + prefixIndex--; + } + } + + return std::to_string(value).substr(0, 5) + prefixes[prefixIndex]; + } + std::vector readFile(std::string_view path); #define SCOPE_EXIT(func) ScopeExit TOKEN_CONCAT(scopeGuard, __COUNTER__)([&] { func }) diff --git a/source/views/view_tools.cpp b/source/views/view_tools.cpp index 2c1d52a8b..cf2c0e298 100644 --- a/source/views/view_tools.cpp +++ b/source/views/view_tools.cpp @@ -195,7 +195,7 @@ namespace hex { else ImGui::NewLine(); - enum class MathDisplayType { Standard, Scientific, Programmer } mathDisplayType; + enum class MathDisplayType { Standard, Scientific, Engineering, Programmer } mathDisplayType; if (ImGui::BeginTabBar("##mathFormatTabBar")) { if (ImGui::BeginTabItem("Standard")) { mathDisplayType = MathDisplayType::Standard; @@ -205,6 +205,10 @@ namespace hex { mathDisplayType = MathDisplayType::Scientific; ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("Engineering")) { + mathDisplayType = MathDisplayType::Engineering; + ImGui::EndTabItem(); + } if (ImGui::BeginTabItem("Programmer")) { mathDisplayType = MathDisplayType::Programmer; ImGui::EndTabItem(); @@ -242,6 +246,9 @@ namespace hex { case MathDisplayType::Scientific: ImGui::Text("%.6Le", this->m_mathHistory[(this->m_mathHistory.size() - 1) - i]); break; + case MathDisplayType::Engineering: + ImGui::Text("%s", hex::toEngineeringString(this->m_mathHistory[(this->m_mathHistory.size() - 1) - i]).c_str()); + break; case MathDisplayType::Programmer: ImGui::Text("0x%llX (%llu)", u64(this->m_mathHistory[(this->m_mathHistory.size() - 1) - i]), @@ -279,6 +286,9 @@ namespace hex { case MathDisplayType::Scientific: ImGui::Text("%.6Le", value); break; + case MathDisplayType::Engineering: + ImGui::Text("%s", hex::toEngineeringString(value).c_str()); + break; case MathDisplayType::Programmer: ImGui::Text("0x%llX (%llu)", u64(value), u64(value)); break;