#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class CollisionTile; class GeometryTileData; class SpriteStore; class GlyphAtlas; class GlyphStore; class Bucket; namespace style { class Layer; class SymbolLayer; } // namespace style // We're using this class to shuttle the resulting buckets from the worker thread to the MapContext // thread. This class is movable-only because the vector contains movable-only value elements. class TileParseResultData { public: bool complete = false; std::unordered_map> buckets; std::unique_ptr featureIndex; std::unique_ptr tileData; }; using TileParseResult = variant< TileParseResultData, // success std::exception_ptr>; // error class TileWorker : public util::noncopyable { public: TileWorker(OverscaledTileID, std::string sourceID, SpriteStore&, GlyphAtlas&, GlyphStore&, const util::Atomic&, const MapMode); ~TileWorker(); TileParseResult parseAllLayers(std::vector>, std::unique_ptr tileData, PlacementConfig); TileParseResult parsePendingLayers(PlacementConfig); std::unique_ptr redoPlacement(const std::unordered_map>*, PlacementConfig); private: TileParseResult prepareResult(const PlacementConfig& config); void parseLayer(const style::Layer*); void insertBucket(const std::string& name, std::unique_ptr); std::unique_ptr placeLayers(PlacementConfig); const OverscaledTileID id; const std::string sourceID; SpriteStore& spriteStore; GlyphAtlas& glyphAtlas; GlyphStore& glyphStore; const util::Atomic& obsolete; const MapMode mode; bool partialParse = false; std::vector> layers; std::unique_ptr featureIndex; std::unique_ptr tileData; // Contains buckets that we couldn't parse so far due to missing resources. // They will be attempted on subsequent parses. std::list>> pending; // Contains buckets that have been parsed, but still need placement. // They will be placed when all buckets have been parsed. std::unordered_map> placementPending; // Temporary holder TileParseResultData result; }; } // namespace mbgl