#include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class SourceManagerDefault final : public SourceManager { public: SourceManagerDefault(); private: void addSourceType(std::unique_ptr); // SourceManager overrides. SourceFactory* getFactory(const std::string& type) noexcept final; SourceFactory* getFactory(const style::SourceTypeInfo*) noexcept final; std::vector> factories; std::map typeToFactory; }; SourceManagerDefault::SourceManagerDefault() { if (LayerManager::annotationsEnabled) { addSourceType(std::make_unique()); } #if !defined(MBGL_SOURCE_CUSTOM_GEOMETRY_DISABLE_ALL) addSourceType(std::make_unique()); #endif #if !defined(MBGL_SOURCE_GEOJSON_DISABLE_ALL) addSourceType(std::make_unique()); #endif #if !defined(MBGL_SOURCE_IMAGE_DISABLE_ALL) addSourceType(std::make_unique()); #endif #if !defined(MBGL_SOURCE_RASTER_DEM_DISABLE_ALL) addSourceType(std::make_unique()); #endif #if !defined(MBGL_SOURCE_RASTER_DISABLE_ALL) addSourceType(std::make_unique()); #endif #if !defined(MBGL_SOURCE_VECTOR_DISABLE_ALL) addSourceType(std::make_unique()); #endif } void SourceManagerDefault::addSourceType(std::unique_ptr factory) { std::string type{factory->getTypeInfo()->type}; if (!type.empty()) { typeToFactory.emplace(std::make_pair(std::move(type), factory.get())); } else { Log::Warning(Event::Setup, "Failure adding source factory. getTypeInfo() returned an empty type string."); } factories.emplace_back(std::move(factory)); } SourceFactory* SourceManagerDefault::getFactory(const mbgl::style::SourceTypeInfo* typeInfo) noexcept { assert(typeInfo); for (const auto& factory : factories) { if (factory->getTypeInfo() == typeInfo) { return factory.get(); } } assert(false); return nullptr; } SourceFactory* SourceManagerDefault::getFactory(const std::string& type) noexcept { auto search = typeToFactory.find(type); return (search != typeToFactory.end()) ? search->second : nullptr; } // static SourceManager* SourceManager::get() noexcept { static SourceManagerDefault instance; return &instance; } } // namespace mbgl