diff --git a/core/AmUtils.cpp b/core/AmUtils.cpp index 45306851..e78ed9e7 100644 --- a/core/AmUtils.cpp +++ b/core/AmUtils.cpp @@ -54,67 +54,50 @@ #include -static char _int2str_lookup[] = { '0', '1', '2', '3', '4', '5', '6' , '7', '8', '9' }; +// helper template for compile-time max string length +template size_t maxStrLen; -string uint128ToStr(__uint128_t val) -{ - std::string result; +// max lengths for well known int types +template<> constexpr size_t maxStrLen<4> = 16; // int32: 4294967296 or -2147483648 +template<> constexpr size_t maxStrLen<8> = 32; // int64: 18446744073709551616 or -9223372036854775808 +template<> constexpr size_t maxStrLen<16> = 64; // int128: 340282366920938463463374607431768211456 or -170141183460469231731687303715884105728 + + +template +string num2str(T i) { /* support 0 values */ - if (val == 0) - return "0"; - while (val != 0) { - result.insert(result.begin(), '0' + (val % 10)); - val /= 10; - } - return result; -} + if (i == 0) + return "0"; -string int2str(unsigned long long val) -{ - char buffer[64] = {0}; - sprintf(buffer, "%llu", val); - return string((char*)(buffer)); -} + constexpr size_t maxlen = maxStrLen; -string int2str(unsigned int val) -{ - char buffer[64] = {0}; - int i=62; - lldiv_t d; + char buf[maxlen]; + size_t pos = maxlen - 1; - d.quot = val; - do{ - d = lldiv(d.quot,10); - buffer[i] = _int2str_lookup[d.rem]; - }while(--i && d.quot); + bool neg = false; + if (i < 0) { + neg = true; + i = -i; + } - return string((char*)(buffer+i+1)); -} + while (i != 0) { + buf[pos--] = '0' + (i % 10); + i /= 10; + } -template -string signed2str(T val, T (*abs_func) (T), DT (*div_func) (T, T)) -{ - char buffer[64] = {0,0}; - int i=62; - DT d; - - d.quot = abs_func(val); - do{ - d = div_func(d.quot,10); - buffer[i] = _int2str_lookup[d.rem]; - }while(--i && d.quot); - - if (i && (val<0)) { - buffer[i]='-'; - i--; - } + if (neg) + buf[pos--] = '-'; - return string((char*)(buffer+i+1)); + pos++; + return string(&buf[pos], maxlen - pos); } -string int2str(int val) { return signed2str(val, abs, div); } -string long2str(long int val) { return signed2str(val, labs, ldiv); } -string longlong2str(long long int val) { return signed2str(val, llabs, lldiv); } +string uint128ToStr(__uint128_t val) { return num2str<__uint128_t>(val); } +string int2str(unsigned long long val) { return num2str(val); } +string int2str(unsigned int val) { return num2str(val); } +string int2str(int val) { return num2str(val); } +string long2str(long int val) { return num2str(val); } +string longlong2str(long long int val) { return num2str(val); } static char _int2hex_lookup[] = { '0', '1', '2', '3', '4', '5', '6' , '7', '8', '9','A','B','C','D','E','F' }; static char _int2hex_lookup_l[] = { '0', '1', '2', '3', '4', '5', '6' , '7', '8', '9','a','b','c','d','e','f' };