[core] Ensure that TileWorker can retain tileData after layout

This commit is contained in:
John Firebaugh
2016-08-26 13:11:33 -07:00
parent 5b8d90bf00
commit 21dc12ee93
7 changed files with 17 additions and 1 deletions

View File

@@ -40,6 +40,10 @@ optional<Value> AnnotationTileFeature::getValue(const std::string& key) const {
AnnotationTileLayer::AnnotationTileLayer(std::string name_)
: name(std::move(name_)) {}
std::unique_ptr<GeometryTileData> AnnotationTileData::clone() const {
return std::make_unique<AnnotationTileData>(*this);
}
const GeometryTileLayer* AnnotationTileData::getLayer(const std::string& name) const {
auto it = layers.find(name);
if (it != layers.end()) {

View File

@@ -56,6 +56,7 @@ private:
class AnnotationTileData : public GeometryTileData {
public:
std::unique_ptr<GeometryTileData> clone() const override;
const GeometryTileLayer* getLayer(const std::string&) const override;
std::unordered_map<std::string, AnnotationTileLayer> layers;

View File

@@ -55,6 +55,10 @@ public:
: features(std::move(features_)) {
}
std::unique_ptr<GeometryTileData> clone() const override {
return std::make_unique<GeoJSONTileData>(*this);
}
const GeometryTileLayer* getLayer(const std::string&) const override {
return this;
}

View File

@@ -66,6 +66,8 @@ void GeometryTile::setData(std::unique_ptr<const GeometryTileData> data_) {
workRequest.reset();
availableData = DataAvailability::All;
buckets.clear();
featureIndex.reset();
data.reset();
redoPlacement();
observer->onTileLoaded(*this, true);
return;

View File

@@ -51,6 +51,7 @@ public:
class GeometryTileData {
public:
virtual ~GeometryTileData() = default;
virtual std::unique_ptr<GeometryTileData> clone() const = 0;
virtual const GeometryTileLayer* getLayer(const std::string&) const = 0;
};

View File

@@ -95,7 +95,7 @@ TileParseResult TileWorker::prepareResult(const PlacementConfig& config) {
if (result.complete) {
featureIndex->setCollisionTile(placeLayers(config));
result.featureIndex = std::move(featureIndex);
result.tileData = std::move(tileData);
result.tileData = tileData->clone();
}
return std::move(result);

View File

@@ -59,6 +59,10 @@ class VectorTileData : public GeometryTileData {
public:
VectorTileData(std::shared_ptr<const std::string> data);
std::unique_ptr<GeometryTileData> clone() const override {
return std::make_unique<VectorTileData>(*this);
}
const GeometryTileLayer* getLayer(const std::string&) const override;
private: