#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { namespace style { class LayerManagerBase : public LayerManager { public: LayerManagerBase(); private: void addLayerType(std::unique_ptr); // LayerManager overrides. std::unique_ptr createLayer(const std::string& type, const std::string& id, const conversion::Convertible& value, conversion::Error& error) noexcept final; std::vector> factories; std::map typeToFactory; }; LayerManagerBase::LayerManagerBase() { addLayerType(std::make_unique()); addLayerType(std::make_unique()); addLayerType(std::make_unique()); addLayerType(std::make_unique()); addLayerType(std::make_unique()); addLayerType(std::make_unique()); addLayerType(std::make_unique()); addLayerType(std::make_unique()); addLayerType(std::make_unique()); addLayerType(std::make_unique()); } void LayerManagerBase::addLayerType(std::unique_ptr factory) { std::string type{factory->getTypeInfo()->type}; if (!type.empty()) { typeToFactory.emplace(std::make_pair(std::move(type), factory.get())); } factories.emplace_back(std::move(factory)); } std::unique_ptr LayerManagerBase::createLayer(const std::string& type, const std::string& id, const conversion::Convertible& value, conversion::Error& error) noexcept { auto search = typeToFactory.find(type); if (search != typeToFactory.end()) { auto layer = search->second->createLayer(id, value); if (!layer) { error.message = "Error parsing a layer of type: " + type; } return layer; } error.message = "Unsupported layer type: " + type; return nullptr; } // static LayerManager* LayerManager::get() noexcept { static LayerManagerBase impl; return &impl; } } // namespace style } // namespace mbgl