diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2018-10-18 21:02:17 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2018-10-23 12:23:40 +0200 |
commit | 7692be5d1571f2c02303aec1eb27432f634d0db2 (patch) | |
tree | 89c7e2f4fa6dacd5e6f883edf7e390020742982f | |
parent | 59c5754fa8225d8f1f674b2589d4be29e0716dd6 (diff) | |
download | qtlocation-mapboxgl-7692be5d1571f2c02303aec1eb27432f634d0db2.tar.gz |
[core] refactor util::toString to use RapidJSON's stringification
-rw-r--r-- | include/mbgl/util/string.hpp | 87 | ||||
-rw-r--r-- | platform/android/src/geojson/feature.cpp | 2 | ||||
-rw-r--r-- | platform/android/src/http_file_source.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/util/string.cpp | 62 |
4 files changed, 108 insertions, 47 deletions
diff --git a/include/mbgl/util/string.hpp b/include/mbgl/util/string.hpp index c44a84a53a..418e1872f3 100644 --- a/include/mbgl/util/string.hpp +++ b/include/mbgl/util/string.hpp @@ -1,27 +1,14 @@ #pragma once #include <string> -#include <cassert> #include <cstdlib> -#include <exception> +#include <type_traits> // Polyfill needed by Qt when building for Android with GCC #if defined(__ANDROID__) && defined(__GLIBCXX__) -// TODO: remove use std::to_string to avoid using <sstream> -#include <sstream> - namespace std { -template <typename T> -std::string to_string(T value) -{ - std::ostringstream oss; - oss << value; - - return oss.str(); -} - inline int stoi(const std::string &str) { return atoi(str.c_str()); @@ -38,44 +25,70 @@ inline float stof(const std::string &str) { namespace mbgl { namespace util { -template <class T> -inline std::string toString(T t) { - return std::to_string(t); +std::string toString(int64_t); +std::string toString(uint64_t); +std::string toString(int32_t); +std::string toString(uint32_t); +std::string toString(double, bool decimal = false); + +inline std::string toString(int16_t t) { + return toString(static_cast<int32_t>(t)); } -inline std::string toString(int8_t num) { - return std::to_string(int(num)); +inline std::string toString(uint16_t t) { + return toString(static_cast<uint32_t>(t)); } -inline std::string toString(uint8_t num) { - return std::to_string(unsigned(num)); +inline std::string toString(int8_t t) { + return toString(static_cast<int32_t>(t)); } -std::string toString(float, bool decimal = false); -std::string toString(double, bool decimal = false); -std::string toString(long double, bool decimal = false); +inline std::string toString(uint8_t t) { + return toString(static_cast<uint32_t>(t)); +} -std::string toHex(size_t); +template <typename = std::enable_if<!std::is_same<uint64_t, unsigned long>::value>> +inline std::string toString(unsigned long t) { + return toString(static_cast<uint64_t>(t)); +} -inline std::string toString(std::exception_ptr error) { - assert(error); +template <typename = std::enable_if<!std::is_same<uint64_t, unsigned long long>::value>> +inline std::string toString(unsigned long long t) { + return toString(static_cast<uint64_t>(t)); +} - if (!error) { - return "(null)"; - } +inline std::string toString(float t, bool decimal = false) { + return toString(static_cast<double>(t), decimal); +} - try { - std::rethrow_exception(error); - } catch (const std::exception& ex) { - return ex.what(); - } catch (...) { - return "Unknown exception type"; - } +inline std::string toString(long double t, bool decimal = false) { + return toString(static_cast<double>(t), decimal); } +std::string toString(std::exception_ptr); + +template <class T> +std::string toString(T) = delete; + +std::string toHex(size_t); + inline float stof(const std::string& str) { return std::stof(str); } } // namespace util } // namespace mbgl + +// Android's libstdc++ doesn't have std::to_string() +#if defined(__ANDROID__) && defined(__GLIBCXX__) + +namespace std { + +template <typename T> +inline std::string to_string(T value) { + return mbgl::util::toString(value); +} + +} // namespace std + +#endif diff --git a/platform/android/src/geojson/feature.cpp b/platform/android/src/geojson/feature.cpp index f0ed097842..767b145a89 100644 --- a/platform/android/src/geojson/feature.cpp +++ b/platform/android/src/geojson/feature.cpp @@ -33,7 +33,7 @@ class FeatureIdVisitor { public: template<class T> std::string operator()(const T& i) const { - return std::to_string(i); + return util::toString(i); } std::string operator()(const std::string& i) const { diff --git a/platform/android/src/http_file_source.cpp b/platform/android/src/http_file_source.cpp index e1b3493f0f..bb6fc90e45 100644 --- a/platform/android/src/http_file_source.cpp +++ b/platform/android/src/http_file_source.cpp @@ -151,9 +151,9 @@ void HTTPRequest::onResponse(jni::JNIEnv& env, int code, } response.error = std::make_unique<Error>(Error::Reason::RateLimit, "HTTP status code 429", http::parseRetryHeaders(retryAfter, xRateLimitReset)); } else if (code >= 500 && code < 600) { - response.error = std::make_unique<Error>(Error::Reason::Server, std::string{ "HTTP status code " } + std::to_string(code)); + response.error = std::make_unique<Error>(Error::Reason::Server, std::string{ "HTTP status code " } + util::toString(code)); } else { - response.error = std::make_unique<Error>(Error::Reason::Other, std::string{ "HTTP status code " } + std::to_string(code)); + response.error = std::make_unique<Error>(Error::Reason::Other, std::string{ "HTTP status code " } + util::toString(code)); } async.send(); diff --git a/src/mbgl/util/string.cpp b/src/mbgl/util/string.cpp index 06ccb56968..2f737e7436 100644 --- a/src/mbgl/util/string.cpp +++ b/src/mbgl/util/string.cpp @@ -1,19 +1,67 @@ #include <mbgl/util/string.hpp> -#include <mbgl/util/dtoa.hpp> + +#include <rapidjson/writer.h> +#include <rapidjson/stringbuffer.h> + +#include <cassert> namespace mbgl { namespace util { -std::string toString(float num, bool decimal) { - return dtoa(num, decimal); +std::string toString(int32_t t) { + rapidjson::StringBuffer s; + rapidjson::Writer<rapidjson::StringBuffer> writer(s); + writer.Int(t); + return s.GetString(); +} + +std::string toString(uint32_t t) { + rapidjson::StringBuffer s; + rapidjson::Writer<rapidjson::StringBuffer> writer(s); + writer.Uint(t); + return s.GetString(); } -std::string toString(double num, bool decimal) { - return dtoa(num, decimal); +std::string toString(int64_t t) { + rapidjson::StringBuffer s; + rapidjson::Writer<rapidjson::StringBuffer> writer(s); + writer.Int64(t); + return s.GetString(); } -std::string toString(long double num, bool decimal) { - return dtoa(num, decimal); +std::string toString(uint64_t t) { + rapidjson::StringBuffer s; + rapidjson::Writer<rapidjson::StringBuffer> writer(s); + writer.Uint64(t); + return s.GetString(); +} + +std::string toString(double t, bool decimal) { + rapidjson::StringBuffer s; + rapidjson::Writer<rapidjson::StringBuffer> writer(s); + writer.Double(t); + std::string data = s.GetString(); + if (!decimal && data.length() >= 3 && data[data.length() - 1] == '0' && data[data.length() - 2] == '.') { + // Remove trailing ".0" for integers + data.resize(data.length() - 2); + } + return data; +} + +std::string toString(std::exception_ptr error) { + assert(error); + + if (!error) { + return "(null)"; + } + + try { + std::rethrow_exception(error); + } catch (const std::exception& ex) { + return ex.what(); + } catch (...) { + return "Unknown exception type"; + } } namespace { |