diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-05 02:20:12 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-05 02:20:12 +0300 |
commit | 54fd7526e6a1d2d161fda10bccd609ec078b8fa9 (patch) | |
tree | b2ef7a31891a0351f1053f6804a8abe4ff1ea895 /src/utils | |
parent | bc4957b24e6939f4e681e9412f9bbdd483a6bc35 (diff) | |
download | manaplus-54fd7526e6a1d2d161fda10bccd609ec078b8fa9.tar.gz manaplus-54fd7526e6a1d2d161fda10bccd609ec078b8fa9.tar.bz2 manaplus-54fd7526e6a1d2d161fda10bccd609ec078b8fa9.tar.xz manaplus-54fd7526e6a1d2d161fda10bccd609ec078b8fa9.zip |
Add fast versions for function toString for different types.
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/stringutils.cpp | 74 | ||||
-rw-r--r-- | src/utils/stringutils.h | 25 | ||||
-rw-r--r-- | src/utils/stringutils_unittest.cc | 20 |
3 files changed, 109 insertions, 10 deletions
diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp index b4e6e01b0..706135a56 100644 --- a/src/utils/stringutils.cpp +++ b/src/utils/stringutils.cpp @@ -709,6 +709,80 @@ std::string toStringPrint(const unsigned int val) return str; } +std::string toString(unsigned int num) +{ + char buf[30]; + buf[29] = '\0'; + size_t idx = 28; + do + buf[idx--] = static_cast<char>((num % 10) + '0'); + while(num /= 10); + return buf + idx + 1; +} + +std::string toString(size_t num) +{ + char buf[100]; + buf[99] = '\0'; + size_t idx = 98; + do + buf[idx--] = static_cast<char>((num % 10) + '0'); + while(num /= 10); + return buf + idx + 1; +} + +std::string toString(uint16_t num) +{ + char buf[10]; + buf[9] = '\0'; + size_t idx = 8; + do + buf[idx--] = static_cast<char>((num % 10) + '0'); + while(num /= 10); + return buf + idx + 1; +} + +std::string toString(unsigned char num) +{ + char buf[5]; + buf[4] = '\0'; + size_t idx = 3; + do + buf[idx--] = static_cast<char>((num % 10) + '0'); + while(num /= 10); + return buf + idx + 1; +} + +std::string toString(int num) +{ + char buf[30]; + bool useSign(false); + buf[29] = '\0'; + size_t idx = 28; + + if (num < 0) + { + useSign = true; + num = -num; + } + do + buf[idx--] = static_cast<char>((num % 10) + '0'); + while(num /= 10); + if (useSign) + buf[idx--] = '-'; + return buf + idx + 1; +} + +std::string toString(float num) +{ + return strprintf("%f", num); +} + +std::string toString(double num) +{ + return strprintf("%f", static_cast<float>(num)); +} + bool isDigit(const std::string &str) { if (str.empty()) diff --git a/src/utils/stringutils.h b/src/utils/stringutils.h index da75a42fa..cc479d80c 100644 --- a/src/utils/stringutils.h +++ b/src/utils/stringutils.h @@ -64,20 +64,25 @@ std::string &toUpper(std::string &str); */ unsigned int atox(const std::string &str) A_WARN_UNUSED; -template<typename T> std::string toString(const T &arg) A_WARN_UNUSED; - /** - * Converts the given value to a string using std::stringstream. + * Converts the given value to a string. * - * @param arg the value to convert to a string + * @param num the value to convert to a string * @return the string representation of arg */ -template<typename T> std::string toString(const T &arg) -{ - std::stringstream ss; - ss << arg; - return ss.str(); -} +std::string toString(unsigned int num); + +std::string toString(size_t num); + +std::string toString(unsigned char num); + +std::string toString(int num); + +std::string toString(uint16_t num); + +std::string toString(float num); + +std::string toString(double num); std::string toStringPrint(const unsigned int val); diff --git a/src/utils/stringutils_unittest.cc b/src/utils/stringutils_unittest.cc index f984167a6..4dca829d7 100644 --- a/src/utils/stringutils_unittest.cc +++ b/src/utils/stringutils_unittest.cc @@ -117,6 +117,26 @@ TEST_CASE("stringuntils ipToString 1") REQUIRE("219.255.210.73" == std::string(ipToString(1238564827))); } +TEST_CASE("stringuntils toString 1") +{ + REQUIRE(strprintf("%d", 0) == toString(0)); + REQUIRE(strprintf("%d", -1) == toString(-1)); + REQUIRE(strprintf("%d", 30000000) == toString(30000000)); + REQUIRE(strprintf("%d", -10000000) == toString(-10000000)); + REQUIRE(strprintf("%d", 30000000) == toString( + static_cast<signed int>(30000000))); + REQUIRE(strprintf("%d", 3000) == toString(static_cast<uint16_t>(3000))); + REQUIRE(strprintf("%d", 123) == toString(static_cast<unsigned char>(123))); +} + +TEST_CASE("stringuntils toString 2") +{ + for (int f = 0; f < 10000000; f += 123) + { + REQUIRE(strprintf("%d", f) == toString(f)); + } +} + TEST_CASE("stringuntils removeColors 1") { REQUIRE("" == removeColors("")); |