summaryrefslogtreecommitdiff
path: root/platform/default/layer_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/layer_manager.cpp')
-rw-r--r--platform/default/layer_manager.cpp46
1 files changed, 30 insertions, 16 deletions
diff --git a/platform/default/layer_manager.cpp b/platform/default/layer_manager.cpp
index 919bc9e64e..0a27c0b512 100644
--- a/platform/default/layer_manager.cpp
+++ b/platform/default/layer_manager.cpp
@@ -2,6 +2,7 @@
#include <mbgl/style/layers/symbol_layer.hpp>
#include <mbgl/style/layers/background_layer.hpp>
#include <mbgl/style/layers/circle_layer.hpp>
+#include <mbgl/style/layers/custom_layer.hpp>
#include <mbgl/style/layers/fill_extrusion_layer.hpp>
#include <mbgl/style/layers/fill_layer.hpp>
#include <mbgl/style/layers/heatmap_layer.hpp>
@@ -10,6 +11,7 @@
#include <mbgl/style/layers/raster_layer.hpp>
#include <mbgl/style/layers/symbol_layer.hpp>
+#include <map>
#include <memory>
#include <vector>
@@ -19,36 +21,48 @@ namespace style {
class LayerManagerBase : public LayerManager {
public:
LayerManagerBase();
+
private:
+ void addLayerType(std::unique_ptr<LayerFactory>);
// LayerManager overrides.
std::unique_ptr<Layer> createLayer(const std::string& type, const std::string& id, const conversion::Convertible& value, conversion::Error& error) noexcept final;
+
std::vector<std::unique_ptr<LayerFactory>> factories;
+ std::map<std::string, LayerFactory*> typeToFactory;
};
LayerManagerBase::LayerManagerBase() {
- factories.emplace_back(std::unique_ptr<LayerFactory>(new FillLayerFactory));
- factories.emplace_back(std::unique_ptr<LayerFactory>(new LineLayerFactory));
- factories.emplace_back(std::unique_ptr<LayerFactory>(new CircleLayerFactory));
- factories.emplace_back(std::unique_ptr<LayerFactory>(new SymbolLayerFactory));
- factories.emplace_back(std::unique_ptr<LayerFactory>(new RasterLayerFactory));
- factories.emplace_back(std::unique_ptr<LayerFactory>(new BackgroundLayerFactory));
- factories.emplace_back(std::unique_ptr<LayerFactory>(new HillshadeLayerFactory));
- factories.emplace_back(std::unique_ptr<LayerFactory>(new FillExtrusionLayerFactory));
- factories.emplace_back(std::unique_ptr<LayerFactory>(new HeatmapLayerFactory));
+ addLayerType(std::make_unique<FillLayerFactory>());
+ addLayerType(std::make_unique<LineLayerFactory>());
+ addLayerType(std::make_unique<CircleLayerFactory>());
+ addLayerType(std::make_unique<SymbolLayerFactory>());
+ addLayerType(std::make_unique<RasterLayerFactory>());
+ addLayerType(std::make_unique<BackgroundLayerFactory>());
+ addLayerType(std::make_unique<HillshadeLayerFactory>());
+ addLayerType(std::make_unique<FillExtrusionLayerFactory>());
+ addLayerType(std::make_unique<HeatmapLayerFactory>());
+ addLayerType(std::make_unique<CustomLayerFactory>());
+}
+
+void LayerManagerBase::addLayerType(std::unique_ptr<LayerFactory> 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<Layer> LayerManagerBase::createLayer(const std::string& type,
const std::string& id,
const conversion::Convertible& value,
conversion::Error& error) noexcept {
- for (const auto& factory: factories) {
- if (factory->supportsType(type)) {
- auto layer = factory->createLayer(id, value);
- if (!layer) {
- error.message = "Error parsing a layer of type: " + type;
- }
- return layer;
+ 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;