summaryrefslogtreecommitdiff
path: root/platform/android/src/style/layers/layers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/style/layers/layers.cpp')
-rw-r--r--platform/android/src/style/layers/layers.cpp82
1 files changed, 37 insertions, 45 deletions
diff --git a/platform/android/src/style/layers/layers.cpp b/platform/android/src/style/layers/layers.cpp
index 232e92a7c7..c0a3acdf42 100644
--- a/platform/android/src/style/layers/layers.cpp
+++ b/platform/android/src/style/layers/layers.cpp
@@ -26,66 +26,58 @@
#include "fill_extrusion_layer.hpp"
namespace mbgl {
-namespace android {
-
-// Mapping from style layers to peer classes
-template <class> struct PeerType {};
-template <> struct PeerType<style::BackgroundLayer> { using Type = android::BackgroundLayer; };
-template <> struct PeerType<style::CircleLayer> { using Type = android::CircleLayer; };
-template <> struct PeerType<style::FillExtrusionLayer> { using Type = android::FillExtrusionLayer; };
-template <> struct PeerType<style::FillLayer> { using Type = android::FillLayer; };
-template <> struct PeerType<style::HeatmapLayer> { using Type = android::HeatmapLayer; };
-template <> struct PeerType<style::HillshadeLayer> { using Type = android::HillshadeLayer; };
-template <> struct PeerType<style::LineLayer> { using Type = android::LineLayer; };
-template <> struct PeerType<style::RasterLayer> { using Type = android::RasterLayer; };
-template <> struct PeerType<style::SymbolLayer> { using Type = android::SymbolLayer; };
-template <> struct PeerType<style::CustomLayer> { using Type = android::CustomLayer; };
-// Inititalizes a non-owning peer
-struct LayerPeerIntitializer {
- mbgl::Map& map;
-
- template <class LayerType>
- Layer* operator()(LayerType& layer) {
- return new typename PeerType<LayerType>::Type(map, layer);
- }
-};
+namespace android {
-static Layer* initializeLayerPeer(mbgl::Map& map, mbgl::style::Layer& coreLayer) {
- Layer* layer = coreLayer.accept(LayerPeerIntitializer {map});
- return layer ? layer : new UnknownLayer(map, coreLayer);
+template <typename T>
+inline std::unique_ptr<T> to(std::unique_ptr<style::Layer> layer) {
+ return std::unique_ptr<T>(layer.release()->as<T>());
}
-// Initializes an owning peer
-// Only usable once since it needs to pass on ownership
-// of the given layer and thus enforced to be an rvalue
-struct UniqueLayerPeerIntitializer {
- mbgl::Map& map;
- std::unique_ptr<style::Layer> layer;
+template <typename T>
+inline T& to(style::Layer& layer) {
+ return *layer.as<T>();
+}
- template <class LayerType>
- Layer* operator()(LayerType&) && {
- return new typename PeerType<LayerType>::Type(
- map,
- std::unique_ptr<LayerType>(layer.release()->as<LayerType>())
- );
+template <typename T>
+std::unique_ptr<Layer> initializeLayerPeer(Map& map, style::LayerType type, T&& layer) {
+ switch (type) {
+ case style::LayerType::Fill:
+ return std::unique_ptr<Layer>(new FillLayer(map, to<style::FillLayer>(std::forward<T>(layer))));
+ case style::LayerType::Line:
+ return std::unique_ptr<Layer>(new LineLayer(map, to<style::LineLayer>(std::forward<T>(layer))));
+ case style::LayerType::Circle:
+ return std::unique_ptr<Layer>(new CircleLayer(map, to<style::CircleLayer>(std::forward<T>(layer))));
+ case style::LayerType::Symbol:
+ return std::unique_ptr<Layer>(new SymbolLayer(map, to<style::SymbolLayer>(std::forward<T>(layer))));
+ case style::LayerType::Raster:
+ return std::unique_ptr<Layer>(new RasterLayer(map, to<style::RasterLayer>(std::forward<T>(layer))));
+ case style::LayerType::Background:
+ return std::unique_ptr<Layer>(new BackgroundLayer(map, to<style::BackgroundLayer>(std::forward<T>(layer))));
+ case style::LayerType::Hillshade:
+ return std::unique_ptr<Layer>(new HillshadeLayer(map, to<style::HillshadeLayer>(std::forward<T>(layer))));
+ case style::LayerType::Custom:
+ return std::unique_ptr<Layer>(new CustomLayer(map, to<style::CustomLayer>(std::forward<T>(layer))));
+ case style::LayerType::FillExtrusion:
+ return std::unique_ptr<Layer>(new FillExtrusionLayer(map, to<style::FillExtrusionLayer>(std::forward<T>(layer))));
+ case style::LayerType::Heatmap:
+ return std::unique_ptr<Layer>(new HeatmapLayer(map, to<style::HeatmapLayer>(std::forward<T>(layer))));
}
-};
-
-static Layer* initializeLayerPeer(Map& map, std::unique_ptr<mbgl::style::Layer> coreLayer) {
- Layer* layer = coreLayer->accept(UniqueLayerPeerIntitializer {map, std::move(coreLayer)});
- return layer ? layer : new UnknownLayer(map, std::move(coreLayer));
+ // Not reachable, but placate GCC.
+ assert(false);
+ return std::unique_ptr<Layer>(new UnknownLayer(map, std::forward<T>(layer)));
}
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, Map& map, style::Layer& coreLayer) {
- std::unique_ptr<Layer> peerLayer = std::unique_ptr<Layer>(initializeLayerPeer(map, coreLayer));
+ std::unique_ptr<Layer> peerLayer = initializeLayerPeer(map, coreLayer.getType(), coreLayer);
jni::Local<jni::Object<Layer>> result = peerLayer->createJavaPeer(env);
peerLayer.release();
return result;
}
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> coreLayer) {
- std::unique_ptr<Layer> peerLayer = std::unique_ptr<Layer>(initializeLayerPeer(map, std::move(coreLayer)));
+ auto type = coreLayer->getType();
+ std::unique_ptr<Layer> peerLayer = initializeLayerPeer(map, type, std::move(coreLayer));
jni::Local<jni::Object<Layer>> result = peerLayer->createJavaPeer(env);
peerLayer.release();
return result;