summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2018-10-18 21:02:17 +0200
committerKonstantin Käfer <mail@kkaefer.com>2018-10-22 11:53:45 +0200
commitf359d626a816825bc2224c3b4aa7428c6303d65b (patch)
tree89c7e2f4fa6dacd5e6f883edf7e390020742982f
parentaa28155b6dead0d2934e6c289c1b3dc76de64c74 (diff)
downloadqtlocation-mapboxgl-f359d626a816825bc2224c3b4aa7428c6303d65b.tar.gz
[core] refactor util::toString to use RapidJSON's stringification
-rw-r--r--include/mbgl/util/string.hpp87
-rw-r--r--platform/android/src/geojson/feature.cpp2
-rw-r--r--platform/android/src/http_file_source.cpp4
-rw-r--r--src/mbgl/util/string.cpp62
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 {