summaryrefslogtreecommitdiff
path: root/platform/default/src/mbgl/sourcemanager/source_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/src/mbgl/sourcemanager/source_manager.cpp')
-rw-r--r--platform/default/src/mbgl/sourcemanager/source_manager.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/platform/default/src/mbgl/sourcemanager/source_manager.cpp b/platform/default/src/mbgl/sourcemanager/source_manager.cpp
new file mode 100644
index 0000000000..9af26fe4ef
--- /dev/null
+++ b/platform/default/src/mbgl/sourcemanager/source_manager.cpp
@@ -0,0 +1,87 @@
+#include <map>
+#include <mbgl/layermanager/layer_manager.hpp>
+#include <mbgl/sourcemanager/annotation_source_factory.hpp>
+#include <mbgl/sourcemanager/custom_geometry_source_factory.hpp>
+#include <mbgl/sourcemanager/geojson_source_factory.hpp>
+#include <mbgl/sourcemanager/image_source_factory.hpp>
+#include <mbgl/sourcemanager/raster_dem_source_factory.hpp>
+#include <mbgl/sourcemanager/raster_source_factory.hpp>
+#include <mbgl/sourcemanager/source_manager.hpp>
+#include <mbgl/sourcemanager/vector_source_factory.hpp>
+#include <mbgl/util/logging.hpp>
+#include <memory>
+#include <vector>
+
+namespace mbgl {
+
+class SourceManagerDefault final : public SourceManager {
+public:
+ SourceManagerDefault();
+
+private:
+ void addSourceType(std::unique_ptr<SourceFactory>);
+ // SourceManager overrides.
+ SourceFactory* getFactory(const std::string& type) noexcept final;
+ SourceFactory* getFactory(const style::SourceTypeInfo*) noexcept final;
+
+ std::vector<std::unique_ptr<SourceFactory>> factories;
+ std::map<std::string, SourceFactory*> typeToFactory;
+};
+
+SourceManagerDefault::SourceManagerDefault() {
+ if (LayerManager::annotationsEnabled) {
+ addSourceType(std::make_unique<AnnotationSourceFactory>());
+ }
+#if !defined(MBGL_SOURCE_CUSTOM_GEOMETRY_DISABLE_ALL)
+ addSourceType(std::make_unique<CustomGeometrySourceFactory>());
+#endif
+#if !defined(MBGL_SOURCE_GEOJSON_DISABLE_ALL)
+ addSourceType(std::make_unique<GeoJSONSourceFactory>());
+#endif
+#if !defined(MBGL_SOURCE_IMAGE_DISABLE_ALL)
+ addSourceType(std::make_unique<ImageSourceFactory>());
+#endif
+#if !defined(MBGL_SOURCE_RASTER_DEM_DISABLE_ALL)
+ addSourceType(std::make_unique<RasterDEMSourceFactory>());
+#endif
+#if !defined(MBGL_SOURCE_RASTER_DISABLE_ALL)
+ addSourceType(std::make_unique<RasterSourceFactory>());
+#endif
+#if !defined(MBGL_SOURCE_VECTOR_DISABLE_ALL)
+ addSourceType(std::make_unique<VectorSourceFactory>());
+#endif
+}
+
+void SourceManagerDefault::addSourceType(std::unique_ptr<SourceFactory> 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