move to shared pointers for queried layers passed to buckets

This commit is contained in:
Justin R. Miller
2015-03-08 16:12:44 -07:00
committed by John Firebaugh
parent a45ae199cf
commit 7361f8566b
7 changed files with 28 additions and 44 deletions

View File

@@ -5,6 +5,7 @@
#include <mbgl/style/value.hpp>
#include <mbgl/text/glyph.hpp>
#include <mbgl/util/optional.hpp>
#include <mbgl/util/ptr.hpp>
#include <mbgl/util/variant.hpp>
#include <mbgl/util/vec.hpp>
@@ -39,15 +40,10 @@ class GeometryTileLayer;
class GeometryTileFeature {
public:
virtual ~GeometryTileFeature();
virtual uint64_t getID() const = 0;
virtual GeometryFeatureType getType() const = 0;
virtual std::map<std::string, Value> getProperties() const = 0;
virtual GeometryCollection nextGeometry() = 0;
protected:
GeometryTileFeature();
};
std::ostream& operator<<(std::ostream&, const GeometryTileFeature& feature);
@@ -75,32 +71,20 @@ class GeometryFilteredTileLayer {
public:
class iterator {
public:
virtual ~iterator();
void operator++();
bool operator!=(const iterator&) const;
GeometryTileFeature& operator*() const;
protected:
iterator();
};
public:
virtual ~GeometryFilteredTileLayer();
virtual iterator begin() const = 0;
virtual iterator end() const = 0;
protected:
GeometryFilteredTileLayer();
};
std::ostream& operator<<(std::ostream&, const PositionedGlyph&);
class GeometryTileLayer {
public:
virtual ~GeometryTileLayer();
virtual const std::string getName() const = 0;
virtual uint32_t getExtent() const = 0;
virtual const std::vector<std::string> getKeys() const = 0;
@@ -108,19 +92,11 @@ public:
virtual const std::vector<Value> getValues() const = 0;
virtual const std::map<std::string, std::map<Value, Shaping>> getShaping() const = 0;
virtual std::unique_ptr<GeometryFilteredTileLayer> createFilteredTileLayer(const FilterExpression&) const = 0;
protected:
GeometryTileLayer();
};
class GeometryTile {
public:
virtual ~GeometryTile();
virtual std::map<std::string, const GeometryTileLayer> getLayers() const = 0;
protected:
GeometryTile();
virtual const util::ptr<const GeometryTileLayer> getLayer(const std::string&) const = 0;
};
}

View File

@@ -187,9 +187,8 @@ std::unique_ptr<Bucket> TileParser::createBucket(const StyleBucket &bucketDesc)
if (tile.id.z >= std::ceil(bucketDesc.max_zoom)) return nullptr;
if (bucketDesc.visibility == mbgl::VisibilityType::None) return nullptr;
auto layer_it = vectorTile.getLayers().find(bucketDesc.source_layer);
if (layer_it != vectorTile.getLayers().end()) {
const GeometryTileLayer& layer = layer_it->second;
const util::ptr<const GeometryTileLayer> layer = vectorTile.getLayer(bucketDesc.source_layer);
if (layer.get() != nullptr) {
if (bucketDesc.type == StyleLayerType::Fill) {
return createFillBucket(layer, bucketDesc);
} else if (bucketDesc.type == StyleLayerType::Line) {
@@ -213,9 +212,9 @@ std::unique_ptr<Bucket> TileParser::createBucket(const StyleBucket &bucketDesc)
}
template <class Bucket>
void TileParser::addBucketGeometries(Bucket& bucket, const GeometryTileLayer& layer, const FilterExpression &filter) {
void TileParser::addBucketGeometries(Bucket& bucket, const util::ptr<const GeometryTileLayer> layer, const FilterExpression &filter) {
std::unique_ptr<GeometryFilteredTileLayer> filtered_layer = layer.createFilteredTileLayer(filter);
std::unique_ptr<GeometryFilteredTileLayer> filtered_layer = layer->createFilteredTileLayer(filter);
for (auto feature_it = filtered_layer->begin(); feature_it != filtered_layer->end(); ++feature_it) {
@@ -230,7 +229,7 @@ void TileParser::addBucketGeometries(Bucket& bucket, const GeometryTileLayer& la
}
}
std::unique_ptr<Bucket> TileParser::createFillBucket(const GeometryTileLayer& layer,
std::unique_ptr<Bucket> TileParser::createFillBucket(const util::ptr<const GeometryTileLayer> layer,
const StyleBucket &bucket_desc) {
auto fill = parseStyleLayoutFill(bucket_desc, tile.id.z);
auto bucket = util::make_unique<FillBucket>(std::move(fill),
@@ -241,7 +240,7 @@ std::unique_ptr<Bucket> TileParser::createFillBucket(const GeometryTileLayer& la
return obsolete() ? nullptr : std::move(bucket);
}
std::unique_ptr<Bucket> TileParser::createLineBucket(const GeometryTileLayer& layer,
std::unique_ptr<Bucket> TileParser::createLineBucket(const util::ptr<const GeometryTileLayer> layer,
const StyleBucket &bucket_desc) {
auto line = parseStyleLayoutLine(bucket_desc, tile.id.z);
auto bucket = util::make_unique<LineBucket>(std::move(line),
@@ -252,7 +251,7 @@ std::unique_ptr<Bucket> TileParser::createLineBucket(const GeometryTileLayer& la
return obsolete() ? nullptr : std::move(bucket);
}
std::unique_ptr<Bucket> TileParser::createSymbolBucket(const GeometryTileLayer& layer,
std::unique_ptr<Bucket> TileParser::createSymbolBucket(const util::ptr<const GeometryTileLayer> layer,
const StyleBucket &bucket_desc) {
auto symbol = parseStyleLayoutSymbol(bucket_desc, tile.id.z);
auto bucket = util::make_unique<SymbolBucket>(std::move(symbol), *collision);

View File

@@ -53,11 +53,11 @@ private:
void parseStyleLayers(util::ptr<const StyleLayerGroup> group);
std::unique_ptr<Bucket> createBucket(const StyleBucket& bucketDesc);
std::unique_ptr<Bucket> createFillBucket(const GeometryTileLayer& layer, const StyleBucket& bucketDesc);
std::unique_ptr<Bucket> createLineBucket(const GeometryTileLayer& layer, const StyleBucket& bucketDesc);
std::unique_ptr<Bucket> createSymbolBucket(const GeometryTileLayer& layer, const StyleBucket& bucketDesc);
std::unique_ptr<Bucket> createFillBucket(const util::ptr<const GeometryTileLayer> layer, const StyleBucket& bucketDesc);
std::unique_ptr<Bucket> createLineBucket(const util::ptr<const GeometryTileLayer> layer, const StyleBucket& bucketDesc);
std::unique_ptr<Bucket> createSymbolBucket(const util::ptr<const GeometryTileLayer> layer, const StyleBucket& bucketDesc);
template <class Bucket> void addBucketGeometries(Bucket& bucket, const GeometryTileLayer& layer, const FilterExpression& filter);
template <class Bucket> void addBucketGeometries(Bucket& bucket, const util::ptr<const GeometryTileLayer> layer, const FilterExpression& filter);
private:
const VectorTile vectorTile;

View File

@@ -119,6 +119,14 @@ VectorTile& VectorTile::operator=(VectorTile&& other) {
return *this;
}
const util::ptr<const GeometryTileLayer> VectorTile::getLayer(const std::string& name) const {
auto layer_it = layers.find(name);
if (layer_it != layers.end()) {
return std::make_shared<const VectorTileLayer>(layer_it->second);
}
return nullptr;
}
VectorTileLayer::VectorTileLayer(pbf layer_pbf)
: feature_pbf(layer_pbf) {
while (layer_pbf.next()) {

View File

@@ -3,6 +3,7 @@
#include <mbgl/map/geometry_tile.hpp>
#include <mbgl/style/filter_expression.hpp>
#include <mbgl/util/ptr.hpp>
namespace mbgl {
@@ -82,7 +83,7 @@ public:
VectorTile(pbf);
VectorTile& operator=(VectorTile&&);
virtual std::map<std::string, const GeometryTileLayer> getLayers() const;
virtual const util::ptr<const GeometryTileLayer> getLayer(const std::string&) const;
private:
std::map<std::string, const VectorTileLayer> layers;

View File

@@ -49,7 +49,7 @@ void SymbolBucket::addGlyphsToAtlas(uint64_t tileid, const std::string stackname
glyphAtlas.addGlyphs(tileid, text, stackname, fontStack,face);
}
std::vector<SymbolFeature> SymbolBucket::processFeatures(const GeometryTileLayer& layer,
std::vector<SymbolFeature> SymbolBucket::processFeatures(const util::ptr<const GeometryTileLayer> layer,
const FilterExpression &filter,
GlyphStore &glyphStore,
const Sprite &sprite) {
@@ -66,7 +66,7 @@ std::vector<SymbolFeature> SymbolBucket::processFeatures(const GeometryTileLayer
// Determine and load glyph ranges
std::set<GlyphRange> ranges;
std::unique_ptr<GeometryFilteredTileLayer> filtered_layer = layer.createFilteredTileLayer(filter);
std::unique_ptr<GeometryFilteredTileLayer> filtered_layer = layer->createFilteredTileLayer(filter);
for (auto feature_it = filtered_layer->begin(); feature_it != filtered_layer->end(); ++feature_it) {
@@ -123,7 +123,7 @@ std::vector<SymbolFeature> SymbolBucket::processFeatures(const GeometryTileLayer
return features;
}
void SymbolBucket::addFeatures(const GeometryTileLayer& layer, const FilterExpression &filter,
void SymbolBucket::addFeatures(const util::ptr<const GeometryTileLayer> layer, const FilterExpression &filter,
const Tile::ID &id, SpriteAtlas &spriteAtlas, Sprite &sprite,
GlyphAtlas & glyphAtlas, GlyphStore &glyphStore) {
auto &layout = *styleLayout;

View File

@@ -65,7 +65,7 @@ public:
bool hasTextData() const;
bool hasIconData() const;
void addFeatures(const GeometryTileLayer& layer, const FilterExpression &filter,
void addFeatures(const util::ptr<const GeometryTileLayer> layer, const FilterExpression &filter,
const Tile::ID &id, SpriteAtlas &spriteAtlas, Sprite &sprite,
GlyphAtlas &glyphAtlas, GlyphStore &glyphStore);
@@ -78,7 +78,7 @@ public:
private:
std::vector<SymbolFeature> processFeatures(const GeometryTileLayer& layer, const FilterExpression &filter, GlyphStore &glyphStore, const Sprite &sprite);
std::vector<SymbolFeature> processFeatures(const util::ptr<const GeometryTileLayer> layer, const FilterExpression &filter, GlyphStore &glyphStore, const Sprite &sprite);
void addFeature(const std::vector<Coordinate> &line, const Shaping &shaping, const GlyphPositions &face, const Rect<uint16_t> &image);