#include "layers.hpp" #include #include #include #include #include #include #include #include #include #include #include #include "background_layer.hpp" #include "circle_layer.hpp" #include "custom_layer.hpp" #include "fill_extrusion_layer.hpp" #include "fill_layer.hpp" #include "heatmap_layer.hpp" #include "hillshade_layer.hpp" #include "line_layer.hpp" #include "raster_layer.hpp" #include "symbol_layer.hpp" #include "unknown_layer.hpp" #include "fill_extrusion_layer.hpp" namespace mbgl { namespace android { // Mapping from style layers to peer classes template struct PeerType {}; template <> struct PeerType { using Type = android::BackgroundLayer; }; template <> struct PeerType { using Type = android::CircleLayer; }; template <> struct PeerType { using Type = android::FillExtrusionLayer; }; template <> struct PeerType { using Type = android::FillLayer; }; template <> struct PeerType { using Type = android::HeatmapLayer; }; template <> struct PeerType { using Type = android::HillshadeLayer; }; template <> struct PeerType { using Type = android::LineLayer; }; template <> struct PeerType { using Type = android::RasterLayer; }; template <> struct PeerType { using Type = android::SymbolLayer; }; template <> struct PeerType { using Type = android::CustomLayer; }; // Inititalizes a non-owning peer struct LayerPeerIntitializer { mbgl::Map& map; template Layer* operator()(LayerType& layer) { return new typename PeerType::Type(map, layer); } }; static Layer* initializeLayerPeer(mbgl::Map& map, mbgl::style::Layer& coreLayer) { Layer* layer = coreLayer.accept(LayerPeerIntitializer {map}); return layer ? layer : new UnknownLayer(map, coreLayer); } // 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 layer; template Layer* operator()(LayerType&) && { return new typename PeerType::Type( map, std::unique_ptr(layer.release()->as()) ); } }; static Layer* initializeLayerPeer(Map& map, std::unique_ptr coreLayer) { Layer* layer = coreLayer->accept(UniqueLayerPeerIntitializer {map, std::move(coreLayer)}); return layer ? layer : new UnknownLayer(map, std::move(coreLayer)); } jni::Local> createJavaLayerPeer(jni::JNIEnv& env, Map& map, style::Layer& coreLayer) { std::unique_ptr peerLayer = std::unique_ptr(initializeLayerPeer(map, coreLayer)); jni::Local> result = peerLayer->createJavaPeer(env); peerLayer.release(); return result; } jni::Local> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr coreLayer) { std::unique_ptr peerLayer = std::unique_ptr(initializeLayerPeer(map, std::move(coreLayer))); jni::Local> result = peerLayer->createJavaPeer(env); peerLayer.release(); return result; } void registerNativeLayers(jni::JNIEnv& env) { Layer::registerNative(env); BackgroundLayer::registerNative(env); CircleLayer::registerNative(env); CustomLayer::registerNative(env); FillExtrusionLayer::registerNative(env); FillLayer::registerNative(env); HeatmapLayer::registerNative(env); HillshadeLayer::registerNative(env); LineLayer::registerNative(env); RasterLayer::registerNative(env); SymbolLayer::registerNative(env); UnknownLayer::registerNative(env); } } // namespace android } // namespace mbgl