summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2019-07-23 08:54:16 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-07-24 21:04:56 +0300
commit852fef66ef4cbbe753527b42cf23c59de59399b3 (patch)
tree8636a881439c7ebf0b53b6a3fdbdc4d4bbf5a40a
parent6798d21eda03ecc2fb2c46c448a45713fc493f86 (diff)
downloadqtlocation-mapboxgl-852fef66ef4cbbe753527b42cf23c59de59399b3.tar.gz
[core] Force getGeometries() return const ref
-rw-r--r--benchmark/src/mbgl/benchmark/stub_geometry_tile_feature.hpp2
-rw-r--r--src/mbgl/annotation/annotation_tile.cpp2
-rw-r--r--src/mbgl/annotation/annotation_tile.hpp2
-rw-r--r--src/mbgl/geometry/feature_index.cpp2
-rw-r--r--src/mbgl/layout/symbol_feature.hpp2
-rw-r--r--src/mbgl/renderer/layers/render_circle_layer.cpp2
-rw-r--r--src/mbgl/style/expression/expression.cpp4
-rw-r--r--src/mbgl/tile/geojson_tile_data.hpp18
-rw-r--r--src/mbgl/tile/geometry_tile.cpp2
-rw-r--r--src/mbgl/tile/geometry_tile_data.cpp2
-rw-r--r--src/mbgl/tile/geometry_tile_data.hpp2
-rw-r--r--src/mbgl/tile/vector_tile_data.cpp15
-rw-r--r--src/mbgl/tile/vector_tile_data.hpp3
-rw-r--r--test/src/mbgl/test/stub_geometry_tile_feature.hpp2
14 files changed, 34 insertions, 26 deletions
diff --git a/benchmark/src/mbgl/benchmark/stub_geometry_tile_feature.hpp b/benchmark/src/mbgl/benchmark/stub_geometry_tile_feature.hpp
index bff1a23ba8..b8f2ffb5b9 100644
--- a/benchmark/src/mbgl/benchmark/stub_geometry_tile_feature.hpp
+++ b/benchmark/src/mbgl/benchmark/stub_geometry_tile_feature.hpp
@@ -35,7 +35,7 @@ public:
return properties.count(key) ? properties.at(key) : optional<Value>();
}
- GeometryCollection getGeometries() const override {
+ const GeometryCollection& getGeometries() const override {
return geometry;
}
};
diff --git a/src/mbgl/annotation/annotation_tile.cpp b/src/mbgl/annotation/annotation_tile.cpp
index 6c3c9eb617..a410adc95e 100644
--- a/src/mbgl/annotation/annotation_tile.cpp
+++ b/src/mbgl/annotation/annotation_tile.cpp
@@ -58,7 +58,7 @@ FeatureIdentifier AnnotationTileFeature::getID() const {
return data->id;
}
-GeometryCollection AnnotationTileFeature::getGeometries() const {
+const GeometryCollection& AnnotationTileFeature::getGeometries() const {
return data->geometries;
}
diff --git a/src/mbgl/annotation/annotation_tile.hpp b/src/mbgl/annotation/annotation_tile.hpp
index 1e23fdf98a..741b598a8c 100644
--- a/src/mbgl/annotation/annotation_tile.hpp
+++ b/src/mbgl/annotation/annotation_tile.hpp
@@ -28,7 +28,7 @@ public:
FeatureType getType() const override;
optional<Value> getValue(const std::string&) const override;
FeatureIdentifier getID() const override;
- GeometryCollection getGeometries() const override;
+ const GeometryCollection& getGeometries() const override;
private:
std::shared_ptr<const AnnotationTileFeatureData> data;
diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp
index 3675e8bc6e..b76e02be3f 100644
--- a/src/mbgl/geometry/feature_index.cpp
+++ b/src/mbgl/geometry/feature_index.cpp
@@ -159,7 +159,7 @@ void FeatureIndex::addFeature(
continue;
}
- result[layerID].push_back(convertFeature(*geometryTileFeature, tileID));
+ result[layerID].emplace_back(convertFeature(*geometryTileFeature, tileID));
}
}
diff --git a/src/mbgl/layout/symbol_feature.hpp b/src/mbgl/layout/symbol_feature.hpp
index 72f613d4b6..2c952fc12a 100644
--- a/src/mbgl/layout/symbol_feature.hpp
+++ b/src/mbgl/layout/symbol_feature.hpp
@@ -20,7 +20,7 @@ public:
optional<Value> getValue(const std::string& key) const override { return feature->getValue(key); };
std::unordered_map<std::string,Value> getProperties() const override { return feature->getProperties(); };
FeatureIdentifier getID() const override { return feature->getID(); };
- GeometryCollection getGeometries() const override { return geometry; };
+ const GeometryCollection& getGeometries() const override { return geometry; };
friend bool operator < (const SymbolFeature& lhs, const SymbolFeature& rhs) {
return lhs.sortKey < rhs.sortKey;
diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp
index cf59319307..4f1620364f 100644
--- a/src/mbgl/renderer/layers/render_circle_layer.cpp
+++ b/src/mbgl/renderer/layers/render_circle_layer.cpp
@@ -167,7 +167,7 @@ bool RenderCircleLayer::queryIntersectsFeature(
projectQueryGeometry(translatedQueryGeometry, posMatrix, transformState.getSize());
auto transformedSize = alignWithMap ? size * pixelsToTileUnits : size;
- auto geometry = feature.getGeometries();
+ const auto& geometry = feature.getGeometries();
for (auto& ring : geometry) {
for (auto& point : ring) {
const GeometryCoordinate& transformedPoint = alignWithMap ? point : projectPoint(point, posMatrix, transformState.getSize());
diff --git a/src/mbgl/style/expression/expression.cpp b/src/mbgl/style/expression/expression.cpp
index 1e5b1581d2..4800f6aa7f 100644
--- a/src/mbgl/style/expression/expression.cpp
+++ b/src/mbgl/style/expression/expression.cpp
@@ -17,7 +17,7 @@ public:
}
PropertyMap getProperties() const override { return feature.properties; }
FeatureIdentifier getID() const override { return feature.id; }
- GeometryCollection getGeometries() const override { return {}; }
+ const GeometryCollection& getGeometries() const override { return geometry; }
optional<mbgl::Value> getValue(const std::string& key) const override {
auto it = feature.properties.find(key);
if (it != feature.properties.end()) {
@@ -25,6 +25,8 @@ public:
}
return optional<mbgl::Value>();
}
+
+ GeometryCollection geometry;
};
diff --git a/src/mbgl/tile/geojson_tile_data.hpp b/src/mbgl/tile/geojson_tile_data.hpp
index 3605af9690..21a65144d9 100644
--- a/src/mbgl/tile/geojson_tile_data.hpp
+++ b/src/mbgl/tile/geojson_tile_data.hpp
@@ -25,15 +25,17 @@ public:
return feature.id;
}
- GeometryCollection getGeometries() const override {
- GeometryCollection geometry = apply_visitor(ToGeometryCollection(), feature.geometry);
-
- // https://github.com/mapbox/geojson-vt-cpp/issues/44
- if (getType() == FeatureType::Polygon) {
- geometry = fixupPolygons(geometry);
+ const GeometryCollection& getGeometries() const override {
+ if (!geometry) {
+ geometry = apply_visitor(ToGeometryCollection(), feature.geometry);
+
+ // https://github.com/mapbox/geojson-vt-cpp/issues/44
+ if (getType() == FeatureType::Polygon) {
+ geometry = fixupPolygons(*geometry);
+ }
}
- return geometry;
+ return *geometry;
}
optional<Value> getValue(const std::string& key) const override {
@@ -43,6 +45,8 @@ public:
}
return optional<Value>();
}
+
+ mutable optional<GeometryCollection> geometry;
};
class GeoJSONTileLayer : public GeometryTileLayer {
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp
index 7f1bed49f4..a431ae423e 100644
--- a/src/mbgl/tile/geometry_tile.cpp
+++ b/src/mbgl/tile/geometry_tile.cpp
@@ -360,7 +360,7 @@ void GeometryTile::querySourceFeatures(
continue;
}
- result.push_back(convertFeature(*feature, id.canonical));
+ result.emplace_back(convertFeature(*feature, id.canonical));
}
}
}
diff --git a/src/mbgl/tile/geometry_tile_data.cpp b/src/mbgl/tile/geometry_tile_data.cpp
index 680f8d1497..2dda9ecae4 100644
--- a/src/mbgl/tile/geometry_tile_data.cpp
+++ b/src/mbgl/tile/geometry_tile_data.cpp
@@ -112,7 +112,7 @@ static Feature::geometry_type convertGeometry(const GeometryTileFeature& geometr
);
};
- GeometryCollection geometries = geometryTileFeature.getGeometries();
+ const GeometryCollection& geometries = geometryTileFeature.getGeometries();
switch (geometryTileFeature.getType()) {
case FeatureType::Unknown: {
diff --git a/src/mbgl/tile/geometry_tile_data.hpp b/src/mbgl/tile/geometry_tile_data.hpp
index 6ce67a532e..db3378a019 100644
--- a/src/mbgl/tile/geometry_tile_data.hpp
+++ b/src/mbgl/tile/geometry_tile_data.hpp
@@ -44,7 +44,7 @@ public:
virtual optional<Value> getValue(const std::string& key) const = 0;
virtual PropertyMap getProperties() const { return PropertyMap(); }
virtual FeatureIdentifier getID() const { return NullValue {}; }
- virtual GeometryCollection getGeometries() const = 0;
+ virtual const GeometryCollection& getGeometries() const = 0;
};
class GeometryTileLayer {
diff --git a/src/mbgl/tile/vector_tile_data.cpp b/src/mbgl/tile/vector_tile_data.cpp
index 2d47515e0f..926e596080 100644
--- a/src/mbgl/tile/vector_tile_data.cpp
+++ b/src/mbgl/tile/vector_tile_data.cpp
@@ -34,14 +34,15 @@ FeatureIdentifier VectorTileFeature::getID() const {
return feature.getID();
}
-GeometryCollection VectorTileFeature::getGeometries() const {
- const float scale = float(util::EXTENT) / feature.getExtent();
- auto lines = feature.getGeometries<GeometryCollection>(scale);
- if (feature.getVersion() >= 2 || feature.getType() != mapbox::vector_tile::GeomType::POLYGON) {
- return lines;
- } else {
- return fixupPolygons(lines);
+const GeometryCollection& VectorTileFeature::getGeometries() const {
+ if (!lines) {
+ const float scale = float(util::EXTENT) / feature.getExtent();
+ lines = feature.getGeometries<GeometryCollection>(scale);
+ if (feature.getVersion() < 2 && feature.getType() == mapbox::vector_tile::GeomType::POLYGON) {
+ lines = fixupPolygons(*lines);
+ }
}
+ return *lines;
}
VectorTileLayer::VectorTileLayer(std::shared_ptr<const std::string> data_,
diff --git a/src/mbgl/tile/vector_tile_data.hpp b/src/mbgl/tile/vector_tile_data.hpp
index 7c95121a37..525c7935e4 100644
--- a/src/mbgl/tile/vector_tile_data.hpp
+++ b/src/mbgl/tile/vector_tile_data.hpp
@@ -17,10 +17,11 @@ public:
optional<Value> getValue(const std::string& key) const override;
std::unordered_map<std::string, Value> getProperties() const override;
FeatureIdentifier getID() const override;
- GeometryCollection getGeometries() const override;
+ const GeometryCollection& getGeometries() const override;
private:
mapbox::vector_tile::feature feature;
+ mutable optional<GeometryCollection> lines;
};
class VectorTileLayer : public GeometryTileLayer {
diff --git a/test/src/mbgl/test/stub_geometry_tile_feature.hpp b/test/src/mbgl/test/stub_geometry_tile_feature.hpp
index ef21f8e937..e74988df2e 100644
--- a/test/src/mbgl/test/stub_geometry_tile_feature.hpp
+++ b/test/src/mbgl/test/stub_geometry_tile_feature.hpp
@@ -33,7 +33,7 @@ public:
return properties.count(key) ? properties.at(key) : optional<Value>();
}
- GeometryCollection getGeometries() const override {
+ const GeometryCollection& getGeometries() const override {
return geometry;
}
};