diff --git a/src/mbgl/map/geometry_tile.hpp b/src/mbgl/map/geometry_tile.hpp index 5eb031667..fdca90520 100644 --- a/src/mbgl/map/geometry_tile.hpp +++ b/src/mbgl/map/geometry_tile.hpp @@ -73,7 +73,17 @@ protected: class GeometryFilteredTileLayer { public: - class iterator {}; + class iterator { + public: + virtual ~iterator(); + + void operator++(); + bool operator!=(const iterator&) const; + GeometryTileFeature& operator*() const; + + protected: + iterator(); + }; public: virtual ~GeometryFilteredTileLayer(); diff --git a/src/mbgl/map/tile_parser.cpp b/src/mbgl/map/tile_parser.cpp index dd97b62b3..c75a19b9d 100644 --- a/src/mbgl/map/tile_parser.cpp +++ b/src/mbgl/map/tile_parser.cpp @@ -217,14 +217,15 @@ void TileParser::addBucketGeometries(Bucket& bucket, const GeometryTileLayer& la std::unique_ptr filtered_layer = layer.createFilteredTileLayer(filter); - for (auto feature : *filtered_layer) { + for (auto feature_it = filtered_layer->begin(); feature_it != filtered_layer->end(); ++feature_it) { + if (obsolete()) return; - GeometryCollection geometry = feature.nextGeometry(); + GeometryCollection geometry = (*feature_it).nextGeometry(); while (geometry.size()) { bucket->addGeometry(geometry); - geometry = feature.nextGeometry(); + geometry = (*feature_it).nextGeometry(); } } } diff --git a/src/mbgl/map/vector_tile.cpp b/src/mbgl/map/vector_tile.cpp index d74a5922e..cdd93d4bb 100644 --- a/src/mbgl/map/vector_tile.cpp +++ b/src/mbgl/map/vector_tile.cpp @@ -241,6 +241,7 @@ bool FilteredVectorTileLayer::iterator::operator!=(const iterator& other) const return !(feature == other.feature); } -const VectorTileFeature& FilteredVectorTileLayer::iterator::operator*() const { - return feature; +VectorTileFeature& FilteredVectorTileLayer::iterator::operator*() const { + VectorTileFeature* f = const_cast(&feature); + return *f; } diff --git a/src/mbgl/map/vector_tile.hpp b/src/mbgl/map/vector_tile.hpp index fe154bc85..63efbab48 100644 --- a/src/mbgl/map/vector_tile.hpp +++ b/src/mbgl/map/vector_tile.hpp @@ -33,7 +33,7 @@ public: iterator(const FilteredVectorTileLayer&, const pbf&); void operator++(); bool operator!=(const iterator&) const; - const VectorTileFeature& operator*() const; + VectorTileFeature& operator*() const; private: const FilteredVectorTileLayer& parent; diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index 511add4de..50a0f3c55 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -68,12 +68,12 @@ std::vector SymbolBucket::processFeatures(const GeometryTileLayer std::unique_ptr filtered_layer = layer.createFilteredTileLayer(filter); - for (auto feature : *filtered_layer) { + for (auto feature_it = filtered_layer->begin(); feature_it != filtered_layer->end(); ++feature_it) { SymbolFeature ft; if (has_text) { - std::string u8string = util::replaceTokens(layout.text.field, feature.getProperties()); + std::string u8string = util::replaceTokens(layout.text.field, (*feature_it).getProperties()); if (layout.text.transform == TextTransformType::Uppercase) { u8string = platform::uppercase(u8string); @@ -92,14 +92,14 @@ std::vector SymbolBucket::processFeatures(const GeometryTileLayer } if (has_icon) { - ft.sprite = util::replaceTokens(layout.icon.image, feature.getProperties()); + ft.sprite = util::replaceTokens(layout.icon.image, (*feature_it).getProperties()); } if (ft.label.length() || ft.sprite.length()) { auto &multiline = ft.geometry; - GeometryCollection geometryCollection = feature.nextGeometry(); + GeometryCollection geometryCollection = (*feature_it).nextGeometry(); multiline.emplace_back(); for (auto& geometry : geometryCollection) { const GeometryLine& line = geometry.get();