From 3a14e52f4c7c4b0ef823266b48793267e3b78b64 Mon Sep 17 00:00:00 2001 From: zmiao Date: Tue, 21 Apr 2020 20:19:51 +0300 Subject: [core] Distance expression: Fix expression serialization --- src/mbgl/style/expression/distance.cpp | 14 ++++++++------ src/mbgl/style/expression/within.cpp | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/mbgl/style/expression/distance.cpp b/src/mbgl/style/expression/distance.cpp index d2b35e0f6c..78d80dc649 100644 --- a/src/mbgl/style/expression/distance.cpp +++ b/src/mbgl/style/expression/distance.cpp @@ -535,8 +535,10 @@ ParseResult Distance::parse(const Convertible& value, ParsingContext& ctx) { return ParseResult(); } -Value convertValue(const mapbox::geojson::rapidjson_value& v) { - if (v.IsDouble() || v.IsInt() || v.IsUint() || v.IsInt64() || v.IsUint64()) { +mbgl::Value convertValue(const mapbox::geojson::rapidjson_value& v) { + if (v.IsNumber()) { + if (v.IsInt64()) return std::int64_t(v.GetInt64()); + if (v.IsUint64()) return std::uint64_t(v.GetUint64()); return v.GetDouble(); } if (v.IsBool()) { @@ -546,7 +548,7 @@ Value convertValue(const mapbox::geojson::rapidjson_value& v) { return std::string(v.GetString()); } if (v.IsArray()) { - std::vector result; + std::vector result; result.reserve(v.Size()); for (const auto& m : v.GetArray()) { result.push_back(convertValue(m)); @@ -554,7 +556,7 @@ Value convertValue(const mapbox::geojson::rapidjson_value& v) { return result; } if (v.IsObject()) { - std::unordered_map result; + std::unordered_map result; for (const auto& m : v.GetObject()) { result.emplace(m.name.GetString(), convertValue(m.value)); } @@ -586,7 +588,7 @@ std::string getUnits(const mapbox::cheap_ruler::CheapRuler::Unit& unit) { } mbgl::Value Distance::serialize() const { - std::unordered_map serialized; + std::unordered_map serialized; rapidjson::CrtAllocator allocator; const mapbox::geojson::rapidjson_value value = mapbox::geojson::convert(geoJSONSource, allocator); if (value.IsObject()) { @@ -597,7 +599,7 @@ mbgl::Value Distance::serialize() const { mbgl::Log::Error(mbgl::Event::General, "Failed to serialize 'distance' expression, converted rapidJSON is not an object"); } - return std::vector{{getOperator(), *fromExpressionValue(serialized), getUnits(unit)}}; + return std::vector{{getOperator(), serialized, getUnits(unit)}}; } bool Distance::operator==(const Expression& e) const { diff --git a/src/mbgl/style/expression/within.cpp b/src/mbgl/style/expression/within.cpp index c5ec53ba3a..2b8a6a65bf 100644 --- a/src/mbgl/style/expression/within.cpp +++ b/src/mbgl/style/expression/within.cpp @@ -264,8 +264,10 @@ ParseResult Within::parse(const Convertible& value, ParsingContext& ctx) { return ParseResult(); } -Value valueConverter(const mapbox::geojson::rapidjson_value& v) { - if (v.IsDouble() || v.IsInt() || v.IsUint() || v.IsInt64() || v.IsUint64()) { +mbgl::Value valueConverter(const mapbox::geojson::rapidjson_value& v) { + if (v.IsNumber()) { + if (v.IsInt64()) return std::int64_t(v.GetInt64()); + if (v.IsUint64()) return std::uint64_t(v.GetUint64()); return v.GetDouble(); } if (v.IsBool()) { @@ -275,7 +277,7 @@ Value valueConverter(const mapbox::geojson::rapidjson_value& v) { return std::string(v.GetString()); } if (v.IsArray()) { - std::vector result; + std::vector result; result.reserve(v.Size()); for (const auto& m : v.GetArray()) { result.push_back(valueConverter(m)); @@ -283,7 +285,7 @@ Value valueConverter(const mapbox::geojson::rapidjson_value& v) { return result; } if (v.IsObject()) { - std::unordered_map result; + std::unordered_map result; for (const auto& m : v.GetObject()) { result.emplace(m.name.GetString(), valueConverter(m.value)); } @@ -294,7 +296,7 @@ Value valueConverter(const mapbox::geojson::rapidjson_value& v) { } mbgl::Value Within::serialize() const { - std::unordered_map serialized; + std::unordered_map serialized; rapidjson::CrtAllocator allocator; const mapbox::geojson::rapidjson_value value = mapbox::geojson::convert(geoJSONSource, allocator); if (value.IsObject()) { @@ -305,7 +307,7 @@ mbgl::Value Within::serialize() const { mbgl::Log::Error(mbgl::Event::General, "Failed to serialize 'within' expression, converted rapidJSON is not an object"); } - return std::vector{{getOperator(), *fromExpressionValue(serialized)}}; + return std::vector{{getOperator(), serialized}}; } bool Within::operator==(const Expression& e) const { -- cgit v1.2.1