diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2017-06-20 12:17:07 -0700 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2017-06-21 17:18:08 -0700 |
commit | 7b90af5d3580bd57cd4280173c1d2b0ee542b89d (patch) | |
tree | 157ce600a1f6397c09ffcd39918e7347e0c70b39 /src/mbgl/tile | |
parent | 2cc330463d11a9767cbee4a028804e026c76d63b (diff) | |
download | qtlocation-mapboxgl-7b90af5d3580bd57cd4280173c1d2b0ee542b89d.tar.gz |
[core] always return owning pointers for GeometryTileData::getLayer()
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r-- | src/mbgl/tile/geojson_tile.cpp | 40 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_data.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/vector_tile_data.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/tile/vector_tile_data.hpp | 4 |
4 files changed, 31 insertions, 23 deletions
diff --git a/src/mbgl/tile/geojson_tile.cpp b/src/mbgl/tile/geojson_tile.cpp index 622d35d6d4..e9865e8272 100644 --- a/src/mbgl/tile/geojson_tile.cpp +++ b/src/mbgl/tile/geojson_tile.cpp @@ -51,8 +51,29 @@ public: } }; -class GeoJSONTileData : public GeometryTileData, - public GeometryTileLayer { +class GeoJSONTileLayer : public GeometryTileLayer { +public: + GeoJSONTileLayer(std::shared_ptr<const mapbox::geometry::feature_collection<int16_t>> features_) + : features(std::move(features_)) { + } + + std::size_t featureCount() const override { + return features->size(); + } + + std::unique_ptr<GeometryTileFeature> getFeature(std::size_t i) const override { + return std::make_unique<GeoJSONTileFeature>((*features)[i]); + } + + std::string getName() const override { + return ""; + } + +private: + std::shared_ptr<const mapbox::geometry::feature_collection<int16_t>> features; +}; + +class GeoJSONTileData : public GeometryTileData { public: GeoJSONTileData(mapbox::geometry::feature_collection<int16_t> features_) : features(std::make_shared<mapbox::geometry::feature_collection<int16_t>>( @@ -67,21 +88,10 @@ public: return std::make_unique<GeoJSONTileData>(features); } - const GeometryTileLayer* getLayer(const std::string&) const override { - return this; - } - - std::string getName() const override { - return ""; + std::unique_ptr<GeometryTileLayer> getLayer(const std::string&) const override { + return std::make_unique<GeoJSONTileLayer>(features); } - std::size_t featureCount() const override { - return features->size(); - } - - std::unique_ptr<GeometryTileFeature> getFeature(std::size_t i) const override { - return std::make_unique<GeoJSONTileFeature>((*features)[i]); - } private: std::shared_ptr<const mapbox::geometry::feature_collection<int16_t>> features; diff --git a/src/mbgl/tile/geometry_tile_data.hpp b/src/mbgl/tile/geometry_tile_data.hpp index 285f86cc7b..741c5149a9 100644 --- a/src/mbgl/tile/geometry_tile_data.hpp +++ b/src/mbgl/tile/geometry_tile_data.hpp @@ -59,7 +59,7 @@ class GeometryTileData { public: virtual ~GeometryTileData() = default; virtual std::unique_ptr<GeometryTileData> clone() const = 0; - virtual const GeometryTileLayer* getLayer(const std::string&) const = 0; + virtual std::unique_ptr<GeometryTileLayer> getLayer(const std::string&) const = 0; }; // classifies an array of rings into polygons with outer rings and holes diff --git a/src/mbgl/tile/vector_tile_data.cpp b/src/mbgl/tile/vector_tile_data.cpp index bb8392f6d9..2d4a01bda3 100644 --- a/src/mbgl/tile/vector_tile_data.cpp +++ b/src/mbgl/tile/vector_tile_data.cpp @@ -67,19 +67,17 @@ std::unique_ptr<GeometryTileData> VectorTileData::clone() const { return std::make_unique<VectorTileData>(data); } -const GeometryTileLayer* VectorTileData::getLayer(const std::string& name) const { +std::unique_ptr<GeometryTileLayer> VectorTileData::getLayer(const std::string& name) const { if (!parsed) { // We're parsing this lazily so that we can construct VectorTileData objects on the main // thread without incurring the overhead of parsing immediately. - for (const auto& pair : mapbox::vector_tile::buffer(*data).getLayers()) { - layers.emplace(pair.first, VectorTileLayer{ data, pair.second }); - } + layers = mapbox::vector_tile::buffer(*data).getLayers(); parsed = true; } auto it = layers.find(name); if (it != layers.end()) { - return &it->second; + return std::make_unique<VectorTileLayer>(data, it->second); } return nullptr; } diff --git a/src/mbgl/tile/vector_tile_data.hpp b/src/mbgl/tile/vector_tile_data.hpp index 5ecb591273..48beaf9d07 100644 --- a/src/mbgl/tile/vector_tile_data.hpp +++ b/src/mbgl/tile/vector_tile_data.hpp @@ -41,14 +41,14 @@ public: VectorTileData(std::shared_ptr<const std::string> data); std::unique_ptr<GeometryTileData> clone() const override; - const GeometryTileLayer* getLayer(const std::string& name) const override; + std::unique_ptr<GeometryTileLayer> getLayer(const std::string& name) const override; std::vector<std::string> layerNames() const; private: std::shared_ptr<const std::string> data; mutable bool parsed = false; - mutable std::unordered_map<std::string, VectorTileLayer> layers; + mutable std::map<std::string, const protozero::data_view> layers; }; } // namespace mbgl |