From ffdeef3a26306e447f1cc52a8e14d42fb035611d Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Mon, 5 Nov 2018 19:49:40 +0200 Subject: Refer corresponding LayerFactory instance from the Layer::Impl --- include/mbgl/style/layer.hpp | 11 ++-- include/mbgl/style/layers/background_layer.hpp | 12 +++-- include/mbgl/style/layers/circle_layer.hpp | 12 +++-- include/mbgl/style/layers/custom_layer.hpp | 14 +++++ include/mbgl/style/layers/fill_extrusion_layer.hpp | 12 +++-- include/mbgl/style/layers/fill_layer.hpp | 12 +++-- include/mbgl/style/layers/heatmap_layer.hpp | 12 +++-- include/mbgl/style/layers/hillshade_layer.hpp | 12 +++-- include/mbgl/style/layers/layer.hpp.ejs | 12 +++-- include/mbgl/style/layers/line_layer.hpp | 12 +++-- include/mbgl/style/layers/raster_layer.hpp | 12 +++-- include/mbgl/style/layers/symbol_layer.hpp | 12 +++-- platform/default/layer_manager.cpp | 61 ++++++++++++++++++++++ platform/ios/config.cmake | 1 + platform/linux/config.cmake | 1 + platform/macos/config.cmake | 1 + platform/qt/qt.cmake | 3 ++ src/mbgl/style/layer.cpp | 58 -------------------- src/mbgl/style/layer_impl.hpp | 2 + src/mbgl/style/layers/background_layer.cpp | 21 +++++++- src/mbgl/style/layers/background_layer_impl.hpp | 1 + src/mbgl/style/layers/circle_layer.cpp | 21 +++++++- src/mbgl/style/layers/circle_layer_impl.hpp | 1 + src/mbgl/style/layers/custom_layer.cpp | 24 +++++++++ src/mbgl/style/layers/custom_layer_impl.cpp | 4 ++ src/mbgl/style/layers/custom_layer_impl.hpp | 1 + src/mbgl/style/layers/fill_extrusion_layer.cpp | 21 +++++++- .../style/layers/fill_extrusion_layer_impl.hpp | 1 + src/mbgl/style/layers/fill_layer.cpp | 21 +++++++- src/mbgl/style/layers/fill_layer_impl.hpp | 1 + src/mbgl/style/layers/heatmap_layer.cpp | 21 +++++++- src/mbgl/style/layers/heatmap_layer_impl.hpp | 1 + src/mbgl/style/layers/hillshade_layer.cpp | 21 +++++++- src/mbgl/style/layers/hillshade_layer_impl.hpp | 1 + src/mbgl/style/layers/layer.cpp.ejs | 21 +++++++- src/mbgl/style/layers/line_layer.cpp | 21 +++++++- src/mbgl/style/layers/line_layer_impl.hpp | 1 + src/mbgl/style/layers/raster_layer.cpp | 21 +++++++- src/mbgl/style/layers/raster_layer_impl.hpp | 1 + src/mbgl/style/layers/symbol_layer.cpp | 21 +++++++- src/mbgl/style/layers/symbol_layer_impl.hpp | 1 + 41 files changed, 407 insertions(+), 113 deletions(-) create mode 100644 platform/default/layer_manager.cpp diff --git a/include/mbgl/style/layer.hpp b/include/mbgl/style/layer.hpp index fd0824c03f..c2aaaa6f48 100644 --- a/include/mbgl/style/layer.hpp +++ b/include/mbgl/style/layer.hpp @@ -40,7 +40,7 @@ public: Layer& operator=(const Layer&) = delete; virtual ~Layer(); - + // Note: LayerType is deprecated, do not use it. LayerType getType() const; std::string getID() const; // Source @@ -82,11 +82,11 @@ public: // object here, so that separately-obtained references to this object share // identical platform-native peers. util::peer peer; + Layer(Immutable); protected: - Layer(Immutable); virtual Mutable mutableBaseImpl() const = 0; - LayerObserver* observer = nullptr; + LayerObserver* observer; }; /** @@ -97,10 +97,11 @@ protected: class LayerFactory { public: virtual ~LayerFactory() = default; - /// Returns the type of the layers, created by this factory. - virtual const char* type() const = 0; + /// Returns \c true if this factory can produce layers of the given type of the layers; returns \c false otherwise. + virtual bool supportsType(const std::string& type) const = 0; /// Returns a new Layer instance on success call; returns `nulltptr` otherwise. virtual std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) = 0; + protected: optional getSource(const conversion::Convertible& value) const; bool initSourceLayerAndFilter(Layer*, const conversion::Convertible& value) const; diff --git a/include/mbgl/style/layers/background_layer.hpp b/include/mbgl/style/layers/background_layer.hpp index 989ef54b21..61e95d2273 100644 --- a/include/mbgl/style/layers/background_layer.hpp +++ b/include/mbgl/style/layers/background_layer.hpp @@ -57,11 +57,17 @@ protected: }; class BackgroundLayerFactory : public LayerFactory { -protected: +public: + BackgroundLayerFactory(); // LayerFactory overrides. ~BackgroundLayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static BackgroundLayerFactory* get(); + +private: + static BackgroundLayerFactory* instance; }; } // namespace style diff --git a/include/mbgl/style/layers/circle_layer.hpp b/include/mbgl/style/layers/circle_layer.hpp index dd22275b85..92a6bbd92e 100644 --- a/include/mbgl/style/layers/circle_layer.hpp +++ b/include/mbgl/style/layers/circle_layer.hpp @@ -105,11 +105,17 @@ protected: }; class CircleLayerFactory : public LayerFactory { -protected: +public: + CircleLayerFactory(); // LayerFactory overrides. ~CircleLayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static CircleLayerFactory* get(); + +private: + static CircleLayerFactory* instance; }; } // namespace style diff --git a/include/mbgl/style/layers/custom_layer.hpp b/include/mbgl/style/layers/custom_layer.hpp index 4ae59dfae3..f58e41adf5 100644 --- a/include/mbgl/style/layers/custom_layer.hpp +++ b/include/mbgl/style/layers/custom_layer.hpp @@ -85,5 +85,19 @@ public: Mutable mutableBaseImpl() const final; }; +class CustomLayerFactory : public LayerFactory { +public: + CustomLayerFactory(); + // LayerFactory overrides. + ~CustomLayerFactory() override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static CustomLayerFactory* get(); + +private: + static CustomLayerFactory* instance; +}; + } // namespace style } // namespace mbgl diff --git a/include/mbgl/style/layers/fill_extrusion_layer.hpp b/include/mbgl/style/layers/fill_extrusion_layer.hpp index fcc66e782b..bc761f2bec 100644 --- a/include/mbgl/style/layers/fill_extrusion_layer.hpp +++ b/include/mbgl/style/layers/fill_extrusion_layer.hpp @@ -81,11 +81,17 @@ protected: }; class FillExtrusionLayerFactory : public LayerFactory { -protected: +public: + FillExtrusionLayerFactory(); // LayerFactory overrides. ~FillExtrusionLayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static FillExtrusionLayerFactory* get(); + +private: + static FillExtrusionLayerFactory* instance; }; } // namespace style diff --git a/include/mbgl/style/layers/fill_layer.hpp b/include/mbgl/style/layers/fill_layer.hpp index 0c36435ffc..7ef6727691 100644 --- a/include/mbgl/style/layers/fill_layer.hpp +++ b/include/mbgl/style/layers/fill_layer.hpp @@ -81,11 +81,17 @@ protected: }; class FillLayerFactory : public LayerFactory { -protected: +public: + FillLayerFactory(); // LayerFactory overrides. ~FillLayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static FillLayerFactory* get(); + +private: + static FillLayerFactory* instance; }; } // namespace style diff --git a/include/mbgl/style/layers/heatmap_layer.hpp b/include/mbgl/style/layers/heatmap_layer.hpp index 3f53877523..e38c6ab6e1 100644 --- a/include/mbgl/style/layers/heatmap_layer.hpp +++ b/include/mbgl/style/layers/heatmap_layer.hpp @@ -70,11 +70,17 @@ protected: }; class HeatmapLayerFactory : public LayerFactory { -protected: +public: + HeatmapLayerFactory(); // LayerFactory overrides. ~HeatmapLayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static HeatmapLayerFactory* get(); + +private: + static HeatmapLayerFactory* instance; }; } // namespace style diff --git a/include/mbgl/style/layers/hillshade_layer.hpp b/include/mbgl/style/layers/hillshade_layer.hpp index 3227505f5d..e1e9a4d0a1 100644 --- a/include/mbgl/style/layers/hillshade_layer.hpp +++ b/include/mbgl/style/layers/hillshade_layer.hpp @@ -75,11 +75,17 @@ protected: }; class HillshadeLayerFactory : public LayerFactory { -protected: +public: + HillshadeLayerFactory(); // LayerFactory overrides. ~HillshadeLayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static HillshadeLayerFactory* get(); + +private: + static HillshadeLayerFactory* instance; }; } // namespace style diff --git a/include/mbgl/style/layers/layer.hpp.ejs b/include/mbgl/style/layers/layer.hpp.ejs index b19b501713..6006352eee 100644 --- a/include/mbgl/style/layers/layer.hpp.ejs +++ b/include/mbgl/style/layers/layer.hpp.ejs @@ -73,11 +73,17 @@ protected: }; class <%- camelize(type) %>LayerFactory : public LayerFactory { -protected: +public: + <%- camelize(type) %>LayerFactory(); // LayerFactory overrides. ~<%- camelize(type) %>LayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static <%- camelize(type) %>LayerFactory* get(); + +private: + static <%- camelize(type) %>LayerFactory* instance; }; } // namespace style diff --git a/include/mbgl/style/layers/line_layer.hpp b/include/mbgl/style/layers/line_layer.hpp index 62cca8215d..de1ed8eef1 100644 --- a/include/mbgl/style/layers/line_layer.hpp +++ b/include/mbgl/style/layers/line_layer.hpp @@ -126,11 +126,17 @@ protected: }; class LineLayerFactory : public LayerFactory { -protected: +public: + LineLayerFactory(); // LayerFactory overrides. ~LineLayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static LineLayerFactory* get(); + +private: + static LineLayerFactory* instance; }; } // namespace style diff --git a/include/mbgl/style/layers/raster_layer.hpp b/include/mbgl/style/layers/raster_layer.hpp index 27057c6af7..5cf06a7d98 100644 --- a/include/mbgl/style/layers/raster_layer.hpp +++ b/include/mbgl/style/layers/raster_layer.hpp @@ -87,11 +87,17 @@ protected: }; class RasterLayerFactory : public LayerFactory { -protected: +public: + RasterLayerFactory(); // LayerFactory overrides. ~RasterLayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static RasterLayerFactory* get(); + +private: + static RasterLayerFactory* instance; }; } // namespace style diff --git a/include/mbgl/style/layers/symbol_layer.hpp b/include/mbgl/style/layers/symbol_layer.hpp index 6c0ec6ca6e..5dac5925dd 100644 --- a/include/mbgl/style/layers/symbol_layer.hpp +++ b/include/mbgl/style/layers/symbol_layer.hpp @@ -275,11 +275,17 @@ protected: }; class SymbolLayerFactory : public LayerFactory { -protected: +public: + SymbolLayerFactory(); // LayerFactory overrides. ~SymbolLayerFactory() override; - const char* type() const final; - std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) override; + bool supportsType(const std::string& type) const final; + std::unique_ptr createLayer(const std::string& id, const conversion::Convertible& value) final; + + static SymbolLayerFactory* get(); + +private: + static SymbolLayerFactory* instance; }; } // namespace style diff --git a/platform/default/layer_manager.cpp b/platform/default/layer_manager.cpp new file mode 100644 index 0000000000..e497c66729 --- /dev/null +++ b/platform/default/layer_manager.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { + +class LayerManagerBase : public LayerManager { +public: + LayerManagerBase(); +private: + // LayerManager overrides. + std::unique_ptr createLayer(const std::string& type, const std::string& id, const conversion::Convertible& value, conversion::Error& error) final; + std::vector> factories; +}; + +LayerManagerBase::LayerManagerBase() { + factories.emplace_back(std::unique_ptr(new FillLayerFactory)); + factories.emplace_back(std::unique_ptr(new LineLayerFactory)); + factories.emplace_back(std::unique_ptr(new CircleLayerFactory)); + factories.emplace_back(std::unique_ptr(new SymbolLayerFactory)); + factories.emplace_back(std::unique_ptr(new RasterLayerFactory)); + factories.emplace_back(std::unique_ptr(new BackgroundLayerFactory)); + factories.emplace_back(std::unique_ptr(new HillshadeLayerFactory)); + factories.emplace_back(std::unique_ptr(new FillExtrusionLayerFactory)); + factories.emplace_back(std::unique_ptr(new HeatmapLayerFactory)); +} + +std::unique_ptr LayerManagerBase::createLayer(const std::string& type, const std::string& id, const conversion::Convertible& value, conversion::Error& error) { + 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; + } + } + error.message = "Unsupported layer type: " + type; + return nullptr; +} + +// static +LayerManager* LayerManager::get() { + static LayerManagerBase impl; + return &impl; +} + +} // namespace style +} // namespace mbgl diff --git a/platform/ios/config.cmake b/platform/ios/config.cmake index 320ef7e73b..0bda7b3f40 100644 --- a/platform/ios/config.cmake +++ b/platform/ios/config.cmake @@ -34,6 +34,7 @@ macro(mbgl_platform_core) PRIVATE platform/darwin/src/nsthread.mm PRIVATE platform/darwin/src/string_nsstring.mm PRIVATE platform/default/bidi.cpp + PRIVATE platform/default/layer_manager.cpp PRIVATE platform/default/thread_local.cpp PRIVATE platform/default/utf.cpp diff --git a/platform/linux/config.cmake b/platform/linux/config.cmake index cfbf4ef8a2..984389e4e8 100644 --- a/platform/linux/config.cmake +++ b/platform/linux/config.cmake @@ -47,6 +47,7 @@ macro(mbgl_platform_core) PRIVATE platform/default/thread.cpp PRIVATE platform/default/bidi.cpp PRIVATE platform/default/collator.cpp + PRIVATE platform/default/layer_manager.cpp PRIVATE platform/default/local_glyph_rasterizer.cpp PRIVATE platform/default/thread_local.cpp PRIVATE platform/default/unaccent.cpp diff --git a/platform/macos/config.cmake b/platform/macos/config.cmake index 3b5b2a8529..e327ac5bfb 100644 --- a/platform/macos/config.cmake +++ b/platform/macos/config.cmake @@ -14,6 +14,7 @@ macro(mbgl_platform_core) PRIVATE platform/darwin/src/nsthread.mm PRIVATE platform/darwin/src/string_nsstring.mm PRIVATE platform/default/bidi.cpp + PRIVATE platform/default/layer_manager.cpp PRIVATE platform/default/thread_local.cpp PRIVATE platform/default/utf.cpp diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index 4e781866e6..e12e20708f 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -43,6 +43,9 @@ set(MBGL_QT_CORE_FILES PRIVATE platform/default/collator.cpp PRIVATE platform/default/unaccent.cpp PRIVATE platform/default/unaccent.hpp + + #Layer manager + PRIVATE platform/default/layer_manager.cpp ) set(MBGL_QT_FILESOURCE_FILES diff --git a/src/mbgl/style/layer.cpp b/src/mbgl/style/layer.cpp index 573e6125b4..e26a02686e 100644 --- a/src/mbgl/style/layer.cpp +++ b/src/mbgl/style/layer.cpp @@ -5,17 +5,6 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - namespace mbgl { namespace style { @@ -155,52 +144,5 @@ bool LayerFactory::initSourceLayerAndFilter(Layer* layer, const conversion::Conv return true; } -// TODO: Move the LayerManager implementation to the dedicated .cpp file per platform. -class LayerManagerImpl : public LayerManager { -public: - void addLayerFactory(LayerFactory* factory) { - factories.emplace(std::make_pair(factory->type(), std::unique_ptr(factory))); - } -private: - // LayerManager overrides. - std::unique_ptr createLayer(const std::string& type, const std::string& id, const conversion::Convertible& value, conversion::Error& error) final; - - std::unordered_map> factories; -}; - -std::unique_ptr LayerManagerImpl::createLayer(const std::string& type, const std::string& id, const conversion::Convertible& value, conversion::Error& error) { - auto search = factories.find(type); - if (search != factories.end()) { - if (auto layer = search->second->createLayer(id, value)) { - return layer; - } - error.message = "Error parsing a layer of type: " + type; - } else { - error.message = "Unsupported layer type: " + type; - } - return nullptr; -} - -// static -LayerManager* LayerManager::get() { - static LayerManager* instance = nullptr; - if (instance == nullptr) { - static LayerManagerImpl impl; - impl.addLayerFactory(new FillLayerFactory); - impl.addLayerFactory(new LineLayerFactory); - impl.addLayerFactory(new CircleLayerFactory); - impl.addLayerFactory(new SymbolLayerFactory); - impl.addLayerFactory(new RasterLayerFactory); - impl.addLayerFactory(new BackgroundLayerFactory); - impl.addLayerFactory(new HillshadeLayerFactory); - impl.addLayerFactory(new FillExtrusionLayerFactory); - impl.addLayerFactory(new HeatmapLayerFactory); - - instance = &impl; - } - return instance; -} - - } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/layer_impl.hpp b/src/mbgl/style/layer_impl.hpp index f350044925..f30db14cc9 100644 --- a/src/mbgl/style/layer_impl.hpp +++ b/src/mbgl/style/layer_impl.hpp @@ -41,6 +41,8 @@ public: // Utility function for automatic layer grouping. virtual void stringifyLayout(rapidjson::Writer&) const = 0; + virtual LayerFactory* getLayerFactory() const = 0; + const LayerType type; std::string id; std::string source; diff --git a/src/mbgl/style/layers/background_layer.cpp b/src/mbgl/style/layers/background_layer.cpp index b2db8332bc..8b3ce5ff68 100644 --- a/src/mbgl/style/layers/background_layer.cpp +++ b/src/mbgl/style/layers/background_layer.cpp @@ -42,6 +42,10 @@ std::unique_ptr BackgroundLayer::cloneRef(const std::string& id_) const { void BackgroundLayer::Impl::stringifyLayout(rapidjson::Writer&) const { } +LayerFactory* BackgroundLayer::Impl::getLayerFactory() const { + return BackgroundLayerFactory::get(); +} + // Layout properties @@ -270,10 +274,23 @@ Mutable BackgroundLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +BackgroundLayerFactory* BackgroundLayerFactory::instance = nullptr; + +BackgroundLayerFactory::BackgroundLayerFactory() { + assert(!instance); + instance = this; +} + BackgroundLayerFactory::~BackgroundLayerFactory() = default; -const char* BackgroundLayerFactory::type() const { - return "background"; +// static +BackgroundLayerFactory* BackgroundLayerFactory::get() { + assert(instance); + return instance; +} + +bool BackgroundLayerFactory::supportsType(const std::string& type) const { + return type == "background"; } std::unique_ptr BackgroundLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/background_layer_impl.hpp b/src/mbgl/style/layers/background_layer_impl.hpp index 248a751027..d48f0f62c8 100644 --- a/src/mbgl/style/layers/background_layer_impl.hpp +++ b/src/mbgl/style/layers/background_layer_impl.hpp @@ -13,6 +13,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; BackgroundPaintProperties::Transitionable paint; }; diff --git a/src/mbgl/style/layers/circle_layer.cpp b/src/mbgl/style/layers/circle_layer.cpp index eda4a9644e..01a71df6d3 100644 --- a/src/mbgl/style/layers/circle_layer.cpp +++ b/src/mbgl/style/layers/circle_layer.cpp @@ -42,6 +42,10 @@ std::unique_ptr CircleLayer::cloneRef(const std::string& id_) const { void CircleLayer::Impl::stringifyLayout(rapidjson::Writer&) const { } +LayerFactory* CircleLayer::Impl::getLayerFactory() const { + return CircleLayerFactory::get(); +} + // Layout properties @@ -687,10 +691,23 @@ Mutable CircleLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +CircleLayerFactory* CircleLayerFactory::instance = nullptr; + +CircleLayerFactory::CircleLayerFactory() { + assert(!instance); + instance = this; +} + CircleLayerFactory::~CircleLayerFactory() = default; -const char* CircleLayerFactory::type() const { - return "circle"; +// static +CircleLayerFactory* CircleLayerFactory::get() { + assert(instance); + return instance; +} + +bool CircleLayerFactory::supportsType(const std::string& type) const { + return type == "circle"; } std::unique_ptr CircleLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/circle_layer_impl.hpp b/src/mbgl/style/layers/circle_layer_impl.hpp index 4b148cdc42..8390feb97e 100644 --- a/src/mbgl/style/layers/circle_layer_impl.hpp +++ b/src/mbgl/style/layers/circle_layer_impl.hpp @@ -13,6 +13,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; CirclePaintProperties::Transitionable paint; }; diff --git a/src/mbgl/style/layers/custom_layer.cpp b/src/mbgl/style/layers/custom_layer.cpp index 90b97104a0..060e455217 100644 --- a/src/mbgl/style/layers/custom_layer.cpp +++ b/src/mbgl/style/layers/custom_layer.cpp @@ -39,5 +39,29 @@ Mutable CustomLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +CustomLayerFactory* CustomLayerFactory::instance = nullptr; + +CustomLayerFactory::CustomLayerFactory() { + assert(!instance); + instance = this; +} + +CustomLayerFactory::~CustomLayerFactory() = default; + +// static +CustomLayerFactory* CustomLayerFactory::get() { + assert(instance); + return instance; +} + +bool CustomLayerFactory::supportsType(const std::string&) const { + return false; +} + +std::unique_ptr CustomLayerFactory::createLayer(const std::string&, const conversion::Convertible&) { + assert(false); + return nullptr; +} + } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/layers/custom_layer_impl.cpp b/src/mbgl/style/layers/custom_layer_impl.cpp index 05c41623c4..ce8d5263dd 100644 --- a/src/mbgl/style/layers/custom_layer_impl.cpp +++ b/src/mbgl/style/layers/custom_layer_impl.cpp @@ -16,5 +16,9 @@ bool CustomLayer::Impl::hasLayoutDifference(const Layer::Impl&) const { void CustomLayer::Impl::stringifyLayout(rapidjson::Writer&) const { } +LayerFactory* CustomLayer::Impl::getLayerFactory() const { + return CustomLayerFactory::get(); +} + } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/layers/custom_layer_impl.hpp b/src/mbgl/style/layers/custom_layer_impl.hpp index a41962c276..ad39478df9 100644 --- a/src/mbgl/style/layers/custom_layer_impl.hpp +++ b/src/mbgl/style/layers/custom_layer_impl.hpp @@ -18,6 +18,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; std::shared_ptr host; }; diff --git a/src/mbgl/style/layers/fill_extrusion_layer.cpp b/src/mbgl/style/layers/fill_extrusion_layer.cpp index f72414557e..3eccf045ea 100644 --- a/src/mbgl/style/layers/fill_extrusion_layer.cpp +++ b/src/mbgl/style/layers/fill_extrusion_layer.cpp @@ -42,6 +42,10 @@ std::unique_ptr FillExtrusionLayer::cloneRef(const std::string& id_) cons void FillExtrusionLayer::Impl::stringifyLayout(rapidjson::Writer&) const { } +LayerFactory* FillExtrusionLayer::Impl::getLayerFactory() const { + return FillExtrusionLayerFactory::get(); +} + // Layout properties @@ -489,10 +493,23 @@ Mutable FillExtrusionLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +FillExtrusionLayerFactory* FillExtrusionLayerFactory::instance = nullptr; + +FillExtrusionLayerFactory::FillExtrusionLayerFactory() { + assert(!instance); + instance = this; +} + FillExtrusionLayerFactory::~FillExtrusionLayerFactory() = default; -const char* FillExtrusionLayerFactory::type() const { - return "fill-extrusion"; +// static +FillExtrusionLayerFactory* FillExtrusionLayerFactory::get() { + assert(instance); + return instance; +} + +bool FillExtrusionLayerFactory::supportsType(const std::string& type) const { + return type == "fill-extrusion"; } std::unique_ptr FillExtrusionLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp b/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp index 9a9a52dea4..dfbc3939f0 100644 --- a/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp +++ b/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp @@ -13,6 +13,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; Properties<>::Unevaluated layout; FillExtrusionPaintProperties::Transitionable paint; diff --git a/src/mbgl/style/layers/fill_layer.cpp b/src/mbgl/style/layers/fill_layer.cpp index 9314d5026a..53eb328326 100644 --- a/src/mbgl/style/layers/fill_layer.cpp +++ b/src/mbgl/style/layers/fill_layer.cpp @@ -42,6 +42,10 @@ std::unique_ptr FillLayer::cloneRef(const std::string& id_) const { void FillLayer::Impl::stringifyLayout(rapidjson::Writer&) const { } +LayerFactory* FillLayer::Impl::getLayerFactory() const { + return FillLayerFactory::get(); +} + // Layout properties @@ -489,10 +493,23 @@ Mutable FillLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +FillLayerFactory* FillLayerFactory::instance = nullptr; + +FillLayerFactory::FillLayerFactory() { + assert(!instance); + instance = this; +} + FillLayerFactory::~FillLayerFactory() = default; -const char* FillLayerFactory::type() const { - return "fill"; +// static +FillLayerFactory* FillLayerFactory::get() { + assert(instance); + return instance; +} + +bool FillLayerFactory::supportsType(const std::string& type) const { + return type == "fill"; } std::unique_ptr FillLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/fill_layer_impl.hpp b/src/mbgl/style/layers/fill_layer_impl.hpp index 22573e0d5d..b99f4303d9 100644 --- a/src/mbgl/style/layers/fill_layer_impl.hpp +++ b/src/mbgl/style/layers/fill_layer_impl.hpp @@ -13,6 +13,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; Properties<>::Unevaluated layout; FillPaintProperties::Transitionable paint; diff --git a/src/mbgl/style/layers/heatmap_layer.cpp b/src/mbgl/style/layers/heatmap_layer.cpp index 2201a39c8b..5afd951d58 100644 --- a/src/mbgl/style/layers/heatmap_layer.cpp +++ b/src/mbgl/style/layers/heatmap_layer.cpp @@ -42,6 +42,10 @@ std::unique_ptr HeatmapLayer::cloneRef(const std::string& id_) const { void HeatmapLayer::Impl::stringifyLayout(rapidjson::Writer&) const { } +LayerFactory* HeatmapLayer::Impl::getLayerFactory() const { + return HeatmapLayerFactory::get(); +} + // Layout properties @@ -374,10 +378,23 @@ Mutable HeatmapLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +HeatmapLayerFactory* HeatmapLayerFactory::instance = nullptr; + +HeatmapLayerFactory::HeatmapLayerFactory() { + assert(!instance); + instance = this; +} + HeatmapLayerFactory::~HeatmapLayerFactory() = default; -const char* HeatmapLayerFactory::type() const { - return "heatmap"; +// static +HeatmapLayerFactory* HeatmapLayerFactory::get() { + assert(instance); + return instance; +} + +bool HeatmapLayerFactory::supportsType(const std::string& type) const { + return type == "heatmap"; } std::unique_ptr HeatmapLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/heatmap_layer_impl.hpp b/src/mbgl/style/layers/heatmap_layer_impl.hpp index cc27c3076a..55de21341b 100644 --- a/src/mbgl/style/layers/heatmap_layer_impl.hpp +++ b/src/mbgl/style/layers/heatmap_layer_impl.hpp @@ -13,6 +13,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; HeatmapPaintProperties::Transitionable paint; }; diff --git a/src/mbgl/style/layers/hillshade_layer.cpp b/src/mbgl/style/layers/hillshade_layer.cpp index b0cb812971..2bc0120ac1 100644 --- a/src/mbgl/style/layers/hillshade_layer.cpp +++ b/src/mbgl/style/layers/hillshade_layer.cpp @@ -42,6 +42,10 @@ std::unique_ptr HillshadeLayer::cloneRef(const std::string& id_) const { void HillshadeLayer::Impl::stringifyLayout(rapidjson::Writer&) const { } +LayerFactory* HillshadeLayer::Impl::getLayerFactory() const { + return HillshadeLayerFactory::get(); +} + // Layout properties @@ -421,10 +425,23 @@ Mutable HillshadeLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +HillshadeLayerFactory* HillshadeLayerFactory::instance = nullptr; + +HillshadeLayerFactory::HillshadeLayerFactory() { + assert(!instance); + instance = this; +} + HillshadeLayerFactory::~HillshadeLayerFactory() = default; -const char* HillshadeLayerFactory::type() const { - return "hillshade"; +// static +HillshadeLayerFactory* HillshadeLayerFactory::get() { + assert(instance); + return instance; +} + +bool HillshadeLayerFactory::supportsType(const std::string& type) const { + return type == "hillshade"; } std::unique_ptr HillshadeLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/hillshade_layer_impl.hpp b/src/mbgl/style/layers/hillshade_layer_impl.hpp index 5618b7dfe2..ad94ac9790 100644 --- a/src/mbgl/style/layers/hillshade_layer_impl.hpp +++ b/src/mbgl/style/layers/hillshade_layer_impl.hpp @@ -13,6 +13,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; HillshadePaintProperties::Transitionable paint; }; diff --git a/src/mbgl/style/layers/layer.cpp.ejs b/src/mbgl/style/layers/layer.cpp.ejs index 6d08370342..85173c2eac 100644 --- a/src/mbgl/style/layers/layer.cpp.ejs +++ b/src/mbgl/style/layers/layer.cpp.ejs @@ -59,6 +59,10 @@ void <%- camelize(type) %>Layer::Impl::stringifyLayout(rapidjson::Writer +LayerFactory* <%- camelize(type) %>Layer::Impl::getLayerFactory() const { + return <%- camelize(type) %>LayerFactory::get(); +} + // Layout properties <% for (const property of layoutProperties) { -%> @@ -260,10 +264,23 @@ Mutable <%- camelize(type) %>Layer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +<%- camelize(type) %>LayerFactory* <%- camelize(type) %>LayerFactory::instance = nullptr; + +<%- camelize(type) %>LayerFactory::<%- camelize(type) %>LayerFactory() { + assert(!instance); + instance = this; +} + <%- camelize(type) %>LayerFactory::~<%- camelize(type) %>LayerFactory() = default; -const char* <%- camelize(type) %>LayerFactory::type() const { - return "<%- type %>"; +// static +<%- camelize(type) %>LayerFactory* <%- camelize(type) %>LayerFactory::get() { + assert(instance); + return instance; +} + +bool <%- camelize(type) %>LayerFactory::supportsType(const std::string& type) const { + return type == "<%- type %>"; } std::unique_ptr <%- camelize(type) %>LayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/line_layer.cpp b/src/mbgl/style/layers/line_layer.cpp index f80cba85f1..2175ab54a1 100644 --- a/src/mbgl/style/layers/line_layer.cpp +++ b/src/mbgl/style/layers/line_layer.cpp @@ -43,6 +43,10 @@ void LineLayer::Impl::stringifyLayout(rapidjson::Writer layout.stringify(writer); } +LayerFactory* LineLayer::Impl::getLayerFactory() const { + return LineLayerFactory::get(); +} + // Layout properties PropertyValue LineLayer::getDefaultLineCap() { @@ -828,10 +832,23 @@ Mutable LineLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +LineLayerFactory* LineLayerFactory::instance = nullptr; + +LineLayerFactory::LineLayerFactory() { + assert(!instance); + instance = this; +} + LineLayerFactory::~LineLayerFactory() = default; -const char* LineLayerFactory::type() const { - return "line"; +// static +LineLayerFactory* LineLayerFactory::get() { + assert(instance); + return instance; +} + +bool LineLayerFactory::supportsType(const std::string& type) const { + return type == "line"; } std::unique_ptr LineLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/line_layer_impl.hpp b/src/mbgl/style/layers/line_layer_impl.hpp index 04adc0e85c..9faa192c5f 100644 --- a/src/mbgl/style/layers/line_layer_impl.hpp +++ b/src/mbgl/style/layers/line_layer_impl.hpp @@ -13,6 +13,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; LineLayoutProperties::Unevaluated layout; LinePaintProperties::Transitionable paint; diff --git a/src/mbgl/style/layers/raster_layer.cpp b/src/mbgl/style/layers/raster_layer.cpp index 4cadd26cd3..f45b86f796 100644 --- a/src/mbgl/style/layers/raster_layer.cpp +++ b/src/mbgl/style/layers/raster_layer.cpp @@ -42,6 +42,10 @@ std::unique_ptr RasterLayer::cloneRef(const std::string& id_) const { void RasterLayer::Impl::stringifyLayout(rapidjson::Writer&) const { } +LayerFactory* RasterLayer::Impl::getLayerFactory() const { + return RasterLayerFactory::get(); +} + // Layout properties @@ -510,10 +514,23 @@ Mutable RasterLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +RasterLayerFactory* RasterLayerFactory::instance = nullptr; + +RasterLayerFactory::RasterLayerFactory() { + assert(!instance); + instance = this; +} + RasterLayerFactory::~RasterLayerFactory() = default; -const char* RasterLayerFactory::type() const { - return "raster"; +// static +RasterLayerFactory* RasterLayerFactory::get() { + assert(instance); + return instance; +} + +bool RasterLayerFactory::supportsType(const std::string& type) const { + return type == "raster"; } std::unique_ptr RasterLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/raster_layer_impl.hpp b/src/mbgl/style/layers/raster_layer_impl.hpp index adbe703e92..9916a01d47 100644 --- a/src/mbgl/style/layers/raster_layer_impl.hpp +++ b/src/mbgl/style/layers/raster_layer_impl.hpp @@ -13,6 +13,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; RasterPaintProperties::Transitionable paint; }; diff --git a/src/mbgl/style/layers/symbol_layer.cpp b/src/mbgl/style/layers/symbol_layer.cpp index d453ddb58d..682c7fbdf6 100644 --- a/src/mbgl/style/layers/symbol_layer.cpp +++ b/src/mbgl/style/layers/symbol_layer.cpp @@ -43,6 +43,10 @@ void SymbolLayer::Impl::stringifyLayout(rapidjson::Writer SymbolLayer::getDefaultSymbolPlacement() { @@ -1978,10 +1982,23 @@ Mutable SymbolLayer::mutableBaseImpl() const { return staticMutableCast(mutableImpl()); } +SymbolLayerFactory* SymbolLayerFactory::instance = nullptr; + +SymbolLayerFactory::SymbolLayerFactory() { + assert(!instance); + instance = this; +} + SymbolLayerFactory::~SymbolLayerFactory() = default; -const char* SymbolLayerFactory::type() const { - return "symbol"; +// static +SymbolLayerFactory* SymbolLayerFactory::get() { + assert(instance); + return instance; +} + +bool SymbolLayerFactory::supportsType(const std::string& type) const { + return type == "symbol"; } std::unique_ptr SymbolLayerFactory::createLayer(const std::string& id, const conversion::Convertible& value) { diff --git a/src/mbgl/style/layers/symbol_layer_impl.hpp b/src/mbgl/style/layers/symbol_layer_impl.hpp index f8ef87dcdf..2b88bad315 100644 --- a/src/mbgl/style/layers/symbol_layer_impl.hpp +++ b/src/mbgl/style/layers/symbol_layer_impl.hpp @@ -13,6 +13,7 @@ public: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; + LayerFactory* getLayerFactory() const final; SymbolLayoutProperties::Unevaluated layout; SymbolPaintProperties::Transitionable paint; -- cgit v1.2.1