diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-02-28 02:45:13 +0200 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-02-28 09:33:04 -0800 |
commit | 609cdb0fd7b569dade2c3148f21024f280636154 (patch) | |
tree | 3e18523f629ed299ed9f6f84e8c4129e6d99fdd2 /platform/android/src/style/layers/layers.cpp | |
parent | f0de56cffae4922db80c74f751f14ac3ed572b31 (diff) | |
download | qtlocation-mapboxgl-609cdb0fd7b569dade2c3148f21024f280636154.tar.gz |
[android] fix ownership of style layer after delete
Diffstat (limited to 'platform/android/src/style/layers/layers.cpp')
-rw-r--r-- | platform/android/src/style/layers/layers.cpp | 53 |
1 files changed, 41 insertions, 12 deletions
diff --git a/platform/android/src/style/layers/layers.cpp b/platform/android/src/style/layers/layers.cpp index 328ef94ec8..5c6ee1ae8f 100644 --- a/platform/android/src/style/layers/layers.cpp +++ b/platform/android/src/style/layers/layers.cpp @@ -21,36 +21,65 @@ namespace mbgl { namespace android { -Layer* initializeLayerPeer(mbgl::Map& map, mbgl::style::Layer& coreLayer) { - Layer* layer; +static Layer* initializeLayerPeer(mbgl::Map& map, mbgl::style::Layer& coreLayer) { if (coreLayer.is<mbgl::style::BackgroundLayer>()) { - layer = new BackgroundLayer(map, *coreLayer.as<mbgl::style::BackgroundLayer>()); + return new BackgroundLayer(map, *coreLayer.as<mbgl::style::BackgroundLayer>()); } else if (coreLayer.is<mbgl::style::CircleLayer>()) { - layer = new CircleLayer(map, *coreLayer.as<mbgl::style::CircleLayer>()); + return new CircleLayer(map, *coreLayer.as<mbgl::style::CircleLayer>()); } else if (coreLayer.is<mbgl::style::FillLayer>()) { - layer = new FillLayer(map, *coreLayer.as<mbgl::style::FillLayer>()); + return new FillLayer(map, *coreLayer.as<mbgl::style::FillLayer>()); } else if (coreLayer.is<mbgl::style::LineLayer>()) { - layer = new LineLayer(map, *coreLayer.as<mbgl::style::LineLayer>()); + return new LineLayer(map, *coreLayer.as<mbgl::style::LineLayer>()); } else if (coreLayer.is<mbgl::style::RasterLayer>()) { - layer = new RasterLayer(map, *coreLayer.as<mbgl::style::RasterLayer>()); + return new RasterLayer(map, *coreLayer.as<mbgl::style::RasterLayer>()); } else if (coreLayer.is<mbgl::style::SymbolLayer>()) { - layer = new SymbolLayer(map, *coreLayer.as<mbgl::style::SymbolLayer>()); + return new SymbolLayer(map, *coreLayer.as<mbgl::style::SymbolLayer>()); } else if (coreLayer.is<mbgl::style::CustomLayer>()) { - layer = new CustomLayer(map, *coreLayer.as<mbgl::style::CustomLayer>()); + return new CustomLayer(map, *coreLayer.as<mbgl::style::CustomLayer>()); } else { - layer = new UnknownLayer(map, coreLayer); + return new UnknownLayer(map, coreLayer); } +} + +template <class LayerType, class PeerType> +static PeerType* createPeer(Map& map, std::unique_ptr<mbgl::style::Layer> layer) { + return new PeerType(map, std::move(std::unique_ptr<LayerType>(layer.release()->as<LayerType>()))); +} - return layer; +static Layer* initializeLayerPeer(Map& map, std::unique_ptr<mbgl::style::Layer> coreLayer) { + if (coreLayer->is<style::BackgroundLayer>()) { + return createPeer<style::BackgroundLayer, BackgroundLayer>(map, std::move(coreLayer)); + } else if (coreLayer->is<style::CircleLayer>()) { + return createPeer<style::CircleLayer, CircleLayer>(map, std::move(coreLayer)); + } else if (coreLayer->is<style::FillLayer>()) { + return createPeer<style::FillLayer, FillLayer>(map, std::move(coreLayer)); + } else if (coreLayer->is<style::LineLayer>()) { + return createPeer<style::LineLayer, LineLayer>(map, std::move(coreLayer)); + } else if (coreLayer->is<style::RasterLayer>()) { + return createPeer<style::RasterLayer, RasterLayer>(map, std::move(coreLayer)); + } else if (coreLayer->is<style::SymbolLayer>()) { + return createPeer<style::SymbolLayer, SymbolLayer>(map, std::move(coreLayer)); + } else if (coreLayer->is<mbgl::style::CustomLayer>()) { + return createPeer<style::SymbolLayer, SymbolLayer>(map, std::move(coreLayer)); + } else { + return new UnknownLayer(map, std::move(coreLayer)); + } } -jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& coreLayer) { +jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, Map& map, style::Layer& coreLayer) { std::unique_ptr<Layer> peerLayer = std::unique_ptr<Layer>(initializeLayerPeer(map, coreLayer)); jni::jobject* result = peerLayer->createJavaPeer(env); peerLayer.release(); return result; } +jni::jobject* 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))); + jni::jobject* result = peerLayer->createJavaPeer(env); + peerLayer.release(); + return result; +} + void registerNativeLayers(jni::JNIEnv& env) { Layer::registerNative(env); BackgroundLayer::registerNative(env); |