#pragma once #include #include #include #include #include #include namespace mbgl { class VectorTileLayer; using pbf_iter_type = protozero::pbf_reader::const_uint32_iterator; using packed_iter_type = std::pair; class VectorTileFeature : public GeometryTileFeature { public: VectorTileFeature(protozero::pbf_reader, const VectorTileLayer&); FeatureType getType() const override { return type; } optional getValue(const std::string&) const override; std::unordered_map getProperties() const override; optional getID() const override; GeometryCollection getGeometries() const override; private: const VectorTileLayer& layer; optional id; FeatureType type = FeatureType::Unknown; packed_iter_type tags_iter; packed_iter_type geometry_iter; }; class VectorTileLayer : public GeometryTileLayer { public: VectorTileLayer(protozero::pbf_reader); std::size_t featureCount() const override { return features.size(); } util::ptr getFeature(std::size_t) const override; std::string getName() const override; private: friend class VectorTile; friend class VectorTileFeature; std::string name; uint32_t version = 1; uint32_t extent = 4096; std::map keysMap; std::vector> keys; std::vector values; std::vector features; }; class VectorTile : public GeometryTile { public: VectorTile(std::shared_ptr data); util::ptr getLayer(const std::string&) const override; private: std::shared_ptr data; mutable bool parsed = false; mutable std::map> layers; }; } // namespace mbgl