#ifndef MBGL_MAP_TILE_WORKER #define MBGL_MAP_TILE_WORKER #include #include #include #include #include #include #include #include #include #include namespace mbgl { class CollisionTile; class GeometryTile; class SpriteStore; class GlyphAtlas; class GlyphStore; class Bucket; class StyleLayer; class SymbolLayer; // 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 TileParseResultBuckets { public: TileData::State state = TileData::State::invalid; std::unordered_map> buckets; }; using TileParseResult = mapbox::util::variant< TileParseResultBuckets, // success std::exception_ptr>; // error class TileWorker : public util::noncopyable { public: TileWorker(TileID, std::string sourceID, SpriteStore&, GlyphAtlas&, GlyphStore&, const std::atomic&); ~TileWorker(); TileParseResult parseAllLayers(std::vector>, const GeometryTile&, PlacementConfig); TileParseResult parsePendingLayers(); void redoPlacement(const std::unordered_map>*, PlacementConfig); private: void parseLayer(const StyleLayer*, const GeometryTile&); void insertBucket(const std::string& name, std::unique_ptr); const TileID id; const std::string sourceID; SpriteStore& spriteStore; GlyphAtlas& glyphAtlas; GlyphStore& glyphStore; const std::atomic& state; bool partialParse = false; std::vector> layers; std::unique_ptr collisionTile; // Contains buckets that we couldn't parse so far due to missing resources. // They will be attempted on subsequent parses. std::list>> pending; // Temporary holder TileParseResultBuckets result; }; } // namespace mbgl #endif