std::string ToLeximitedHeader(u32 len) { std::ostringstream os; if (len < 9) os << len; else os << 9 << ToLeximitedHeader(DigitCount(len,10)) << len; return os.str(); }
std::string ToLeximitedNumber(u32 num) { //returns 10 when 'num' is zero u32 digits = (num == 0 ? 1 : DigitCount(num, 10)); std::ostringstream os; os << ToLeximitedHeader(digits) << num; return os.str(); } //ToLeximitedNumber (unsigned)
void IntToCharArray(int64 *Input, char *Output) { int64 tmp = *Input; char *NumCharPointer = Output + DigitCount(&tmp) - 1; while (tmp != 0) { *NumCharPointer-- = '0' + (tmp % 10); tmp = (tmp - *NumCharPointer) / 10; } }
std::string ToLeximitedNumber(s32 num) { //handles negative numbers //returns 'n' before a negative num, e.g., -3 -> n13 //returns '10' when 'num' is zero //returns 'n10' when 'num' is the biggest negative number bool useneg = false; u32 digits; if(num == 0) digits = 1; else if(num < 0) { // use 'n10' as a special code meaning 'max negative number' if (num == S32_MIN) { num = 0; digits = 1; } else { num = -num; digits = DigitCount((u32) num, 10); } useneg = true; } else //>0 { digits = DigitCount((u32) num, 10); } std::ostringstream os; if(useneg) os << "n"; os << ToLeximitedHeader(digits) << num; return os.str(); } //ToLeximitedNumber (signed)
void IntLexEncode(u32 num, char* output) { u32 digits = DigitCount(num, 26); output[digits] = 0; /* Off by one case for the lazy*/ if(!num) { output[0] = 'a'; output[1] = 0; } else { while(num) { output[--digits] = 'a' + num % 26; num /= 26; } } }
#include <ionCore.h> #include <catch.hpp> TEST_CASE("ionUtils::DigitCount", "") { CHECK(DigitCount(0) == 1); CHECK(DigitCount(1) == 1); CHECK(DigitCount(5) == 1); CHECK(DigitCount(9) == 1); CHECK(DigitCount(10) == 2); CHECK(DigitCount(11) == 2); CHECK(DigitCount(19) == 2); CHECK(DigitCount(20) == 2); CHECK(DigitCount(99) == 2); CHECK(DigitCount(100) == 3); CHECK(DigitCount(101) == 3); CHECK(DigitCount(1000) == 4); CHECK(DigitCount(1001) == 4); CHECK(DigitCount(9999) == 4); CHECK(DigitCount(10000) == 5); CHECK(DigitCount(10001) == 5); CHECK(DigitCount(34802) == 5); CHECK(DigitCount(2147483647) == 10); CHECK(DigitCount(-0) == 1); CHECK(DigitCount(-1) == 2); CHECK(DigitCount(-9) == 2); CHECK(DigitCount(-10) == 3); CHECK(DigitCount(-11) == 3);