Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[core] Distance expression: Fix expression serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
zmiao committed Apr 21, 2020
1 parent 19f794a commit 7f669f7
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 12 deletions.
14 changes: 8 additions & 6 deletions src/mbgl/style/expression/distance.cpp
Expand Up @@ -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()) {
Expand All @@ -546,15 +548,15 @@ Value convertValue(const mapbox::geojson::rapidjson_value& v) {
return std::string(v.GetString());
}
if (v.IsArray()) {
std::vector<Value> result;
std::vector<mbgl::Value> result;
result.reserve(v.Size());
for (const auto& m : v.GetArray()) {
result.push_back(convertValue(m));
}
return result;
}
if (v.IsObject()) {
std::unordered_map<std::string, Value> result;
std::unordered_map<std::string, mbgl::Value> result;
for (const auto& m : v.GetObject()) {
result.emplace(m.name.GetString(), convertValue(m.value));
}
Expand Down Expand Up @@ -586,7 +588,7 @@ std::string getUnits(const mapbox::cheap_ruler::CheapRuler::Unit& unit) {
}

mbgl::Value Distance::serialize() const {
std::unordered_map<std::string, Value> serialized;
std::unordered_map<std::string, mbgl::Value> serialized;
rapidjson::CrtAllocator allocator;
const mapbox::geojson::rapidjson_value value = mapbox::geojson::convert(geoJSONSource, allocator);
if (value.IsObject()) {
Expand All @@ -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<mbgl::Value>{{getOperator(), *fromExpressionValue<mbgl::Value>(serialized), getUnits(unit)}};
return std::vector<mbgl::Value>{{getOperator(), serialized, getUnits(unit)}};
}

bool Distance::operator==(const Expression& e) const {
Expand Down
14 changes: 8 additions & 6 deletions src/mbgl/style/expression/within.cpp
Expand Up @@ -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()) {
Expand All @@ -275,15 +277,15 @@ Value valueConverter(const mapbox::geojson::rapidjson_value& v) {
return std::string(v.GetString());
}
if (v.IsArray()) {
std::vector<Value> result;
std::vector<mbgl::Value> result;
result.reserve(v.Size());
for (const auto& m : v.GetArray()) {
result.push_back(valueConverter(m));
}
return result;
}
if (v.IsObject()) {
std::unordered_map<std::string, Value> result;
std::unordered_map<std::string, mbgl::Value> result;
for (const auto& m : v.GetObject()) {
result.emplace(m.name.GetString(), valueConverter(m.value));
}
Expand All @@ -294,7 +296,7 @@ Value valueConverter(const mapbox::geojson::rapidjson_value& v) {
}

mbgl::Value Within::serialize() const {
std::unordered_map<std::string, Value> serialized;
std::unordered_map<std::string, mbgl::Value> serialized;
rapidjson::CrtAllocator allocator;
const mapbox::geojson::rapidjson_value value = mapbox::geojson::convert(geoJSONSource, allocator);
if (value.IsObject()) {
Expand All @@ -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<mbgl::Value>{{getOperator(), *fromExpressionValue<mbgl::Value>(serialized)}};
return std::vector<mbgl::Value>{{getOperator(), serialized}};
}

bool Within::operator==(const Expression& e) const {
Expand Down

0 comments on commit 7f669f7

Please sign in to comment.