summaryrefslogtreecommitdiff
path: root/src/mbgl/tile
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 /src/mbgl/tile
parent6798d21eda03ecc2fb2c46c448a45713fc493f86 (diff)
downloadqtlocation-mapboxgl-852fef66ef4cbbe753527b42cf23c59de59399b3.tar.gz
[core] Force getGeometries() return const ref
Diffstat (limited to 'src/mbgl/tile')
-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
6 files changed, 24 insertions, 18 deletions
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 {