diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2018-10-18 10:54:24 +0300 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2018-12-12 15:08:18 +0200 |
commit | 664ceb43980cb7d90a0d8b5fa1a48f83662322c9 (patch) | |
tree | d662d782fe4875a8a1b7f780a3d34f659f79acd3 | |
parent | 8a03d16990b6fdde0f117def3a1b4bb2c9c92d4c (diff) | |
download | qtlocation-mapboxgl-664ceb43980cb7d90a0d8b5fa1a48f83662322c9.tar.gz |
[core] Share GeoJSONData pointer as weak_ptr instead of raw ptr
-rw-r--r-- | src/mbgl/renderer/sources/render_geojson_source.cpp | 14 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_geojson_source.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/style/sources/geojson_source_impl.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/style/sources/geojson_source_impl.hpp | 4 |
4 files changed, 15 insertions, 15 deletions
diff --git a/src/mbgl/renderer/sources/render_geojson_source.cpp b/src/mbgl/renderer/sources/render_geojson_source.cpp index 0e265efff4..0099ebcf5e 100644 --- a/src/mbgl/renderer/sources/render_geojson_source.cpp +++ b/src/mbgl/renderer/sources/render_geojson_source.cpp @@ -33,23 +33,23 @@ void RenderGeoJSONSource::update(Immutable<style::Source::Impl> baseImpl_, enabled = needsRendering; - GeoJSONData* data_ = impl().getData(); + auto data_ = impl().getData().lock(); - if (data_ != data) { + if (data.lock() != data_) { data = data_; tilePyramid.cache.clear(); - if (data) { + if (data_) { const uint8_t maxZ = impl().getZoomRange().max; for (const auto& pair : tilePyramid.tiles) { if (pair.first.canonical.z <= maxZ) { - static_cast<GeoJSONTile*>(pair.second.get())->updateData(data->getTile(pair.first.canonical)); + static_cast<GeoJSONTile*>(pair.second.get())->updateData(data_->getTile(pair.first.canonical)); } } } } - if (!data) { + if (!data_) { tilePyramid.tiles.clear(); tilePyramid.renderTiles.clear(); return; @@ -63,8 +63,8 @@ void RenderGeoJSONSource::update(Immutable<style::Source::Impl> baseImpl_, util::tileSize, impl().getZoomRange(), optional<LatLngBounds>{}, - [&] (const OverscaledTileID& tileID) { - return std::make_unique<GeoJSONTile>(tileID, impl().id, parameters, data->getTile(tileID.canonical)); + [&, data_] (const OverscaledTileID& tileID) { + return std::make_unique<GeoJSONTile>(tileID, impl().id, parameters, data_->getTile(tileID.canonical)); }); } diff --git a/src/mbgl/renderer/sources/render_geojson_source.hpp b/src/mbgl/renderer/sources/render_geojson_source.hpp index 297fa09a29..6351c5f6f8 100644 --- a/src/mbgl/renderer/sources/render_geojson_source.hpp +++ b/src/mbgl/renderer/sources/render_geojson_source.hpp @@ -44,7 +44,7 @@ private: const style::GeoJSONSource::Impl& impl() const; TilePyramid tilePyramid; - style::GeoJSONData* data = nullptr; + std::weak_ptr<style::GeoJSONData> data; }; template <> diff --git a/src/mbgl/style/sources/geojson_source_impl.cpp b/src/mbgl/style/sources/geojson_source_impl.cpp index 10fd7cacea..24ac1d7976 100644 --- a/src/mbgl/style/sources/geojson_source_impl.cpp +++ b/src/mbgl/style/sources/geojson_source_impl.cpp @@ -75,7 +75,7 @@ GeoJSONSource::Impl::Impl(std::string id_, GeoJSONOptions options_) GeoJSONSource::Impl::Impl(const Impl& other, const GeoJSON& geoJSON) : Source::Impl(other), options(other.options) { - double scale = util::EXTENT / util::tileSize; + constexpr double scale = util::EXTENT / util::tileSize; if (options.cluster && geoJSON.is<mapbox::feature::feature_collection<double>>() @@ -84,7 +84,7 @@ GeoJSONSource::Impl::Impl(const Impl& other, const GeoJSON& geoJSON) clusterOptions.maxZoom = options.clusterMaxZoom; clusterOptions.extent = util::EXTENT; clusterOptions.radius = ::round(scale * options.clusterRadius); - data = std::make_unique<SuperclusterData>( + data = std::make_shared<SuperclusterData>( geoJSON.get<mapbox::feature::feature_collection<double>>(), clusterOptions); } else { mapbox::geojsonvt::Options vtOptions; @@ -93,7 +93,7 @@ GeoJSONSource::Impl::Impl(const Impl& other, const GeoJSON& geoJSON) vtOptions.buffer = ::round(scale * options.buffer); vtOptions.tolerance = scale * options.tolerance; vtOptions.lineMetrics = options.lineMetrics; - data = std::make_unique<GeoJSONVTData>(geoJSON, vtOptions); + data = std::make_shared<GeoJSONVTData>(geoJSON, vtOptions); } } @@ -103,8 +103,8 @@ Range<uint8_t> GeoJSONSource::Impl::getZoomRange() const { return { options.minzoom, options.maxzoom }; } -GeoJSONData* GeoJSONSource::Impl::getData() const { - return data.get(); +std::weak_ptr<GeoJSONData> GeoJSONSource::Impl::getData() const { + return data; } optional<std::string> GeoJSONSource::Impl::getAttribution() const { diff --git a/src/mbgl/style/sources/geojson_source_impl.hpp b/src/mbgl/style/sources/geojson_source_impl.hpp index 9984bbdd62..b88ab35ee0 100644 --- a/src/mbgl/style/sources/geojson_source_impl.hpp +++ b/src/mbgl/style/sources/geojson_source_impl.hpp @@ -31,13 +31,13 @@ public: ~Impl() final; Range<uint8_t> getZoomRange() const; - GeoJSONData* getData() const; + std::weak_ptr<GeoJSONData> getData() const; optional<std::string> getAttribution() const final; private: GeoJSONOptions options; - std::unique_ptr<GeoJSONData> data; + std::shared_ptr<GeoJSONData> data; }; } // namespace style |