From 50957fb9a348f9b2ac07bd7e209233521e808691 Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Sun, 27 Feb 2022 19:32:37 +0100 Subject: [PATCH] Abstracted Base10_2_X to work with arbitrary containers and digit-types --- Src/GeneralUtility.cpp | 14 -------------- Src/GeneralUtility.h | 17 ++++++++++++++++- Test/Base10_2_X.cpp | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/Src/GeneralUtility.cpp b/Src/GeneralUtility.cpp index bd2a906..c746d63 100644 --- a/Src/GeneralUtility.cpp +++ b/Src/GeneralUtility.cpp @@ -1,15 +1 @@ #include "GeneralUtility.h" -#include - -std::string GeneralUtility::Base10_2_X(const std::uint64_t &num, const std::string &set, const std::uint32_t minOutLen) { - // Convert num to a string - std::stringstream ss; - ss << num; - const std::string numStr = ss.str(); - - // Use BaseX_2_Y to convert to outbase - const std::string convertedNum = BaseX_2_Y(numStr, "0123456789", set, minOutLen); - - // return it - return convertedNum; -} diff --git a/Src/GeneralUtility.h b/Src/GeneralUtility.h index 3e22b4e..5d4453e 100644 --- a/Src/GeneralUtility.h +++ b/Src/GeneralUtility.h @@ -38,7 +38,8 @@ public: //! \param num The number to be converted //! \param set The desired set/base for the output to be in //! \return `num` in base `set` - static std::string Base10_2_X(const std::uint64_t& num, const std::string& set, const std::uint32_t minOutLen = 1); + template + static T_Container Base10_2_X(const std::uint64_t& num, const T_Container& set, const std::uint32_t minOutLen = 1); //! Will convert a number from an arbitrary base to another arbitrary base. //! \param num A string representation of a number @@ -218,4 +219,18 @@ T_ContainerOut GeneralUtility::BaseX_2_Y(const T_ContainerIn& num, const T_Conta return result; } +template +T_Container GeneralUtility::Base10_2_X(const std::uint64_t &num, const T_Container& set, const std::uint32_t minOutLen) { + // Convert num to a string + std::stringstream ss; + ss << num; + const std::string numStr = ss.str(); + + // Use BaseX_2_Y to convert to outbase + const T_Container convertedNum = BaseX_2_Y(numStr, "0123456789", set, minOutLen); + + // return it + return convertedNum; +} + #endif //GENERALUTILITY_GENERALUTILITY_H diff --git a/Test/Base10_2_X.cpp b/Test/Base10_2_X.cpp index 399a64d..0b932b0 100644 --- a/Test/Base10_2_X.cpp +++ b/Test/Base10_2_X.cpp @@ -75,3 +75,23 @@ TEST_CASE(__FILE__"/TestPadding", "[Base10_2_X]") // Verify REQUIRE(out == expected_out); } + +// Tests that conversion with more complex 'digits' works. Weird-ass usecase +TEST_CASE(__FILE__"/BaseWeird_to_10", "[Base10_2_X]") +{ + // Setup + + // Yes... That is actually our base... + const std::vector set = { "Banana", "Apple", "Peach", "Strawberry", "Tomato", "Cherry" }; + + const std::uint64_t in = 69; + + // Yes, that is a fucking number. It's 69 in whatever the fuck that base is + const std::vector expected_out = { "Apple", "Cherry", "Strawberry" }; + + // Exercise + const std::vector out = GeneralUtility::Base10_2_X(in, set); + + // Verify + REQUIRE(out == expected_out); +}