diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-05-21 20:35:14 +0300 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-05-23 10:06:56 +0300 |
commit | 3d26574cb4077a8b48071e08f07574964587f747 (patch) | |
tree | 8a830cd44c0142df3777c7be954239026b92d441 /platform/android/src/style/layers/layers.cpp | |
parent | 95d2ed7b9597c7dd24a9b95653fe52a2dffb4ece (diff) | |
download | qtlocation-mapboxgl-3d26574cb4077a8b48071e08f07574964587f747.tar.gz |
[android] replace branches on layer types with visitors
Diffstat (limited to 'platform/android/src/style/layers/layers.cpp')
-rw-r--r-- | platform/android/src/style/layers/layers.cpp | 82 |
1 files changed, 40 insertions, 42 deletions
diff --git a/platform/android/src/style/layers/layers.cpp b/platform/android/src/style/layers/layers.cpp index 5c49f875ee..9803b6f841 100644 --- a/platform/android/src/style/layers/layers.cpp +++ b/platform/android/src/style/layers/layers.cpp @@ -24,53 +24,51 @@ namespace mbgl { namespace android { -static Layer* initializeLayerPeer(mbgl::Map& map, mbgl::style::Layer& coreLayer) { - if (coreLayer.is<mbgl::style::BackgroundLayer>()) { - return new BackgroundLayer(map, *coreLayer.as<mbgl::style::BackgroundLayer>()); - } else if (coreLayer.is<mbgl::style::CircleLayer>()) { - return new CircleLayer(map, *coreLayer.as<mbgl::style::CircleLayer>()); - } else if (coreLayer.is<mbgl::style::FillExtrusionLayer>()) { - return new FillExtrusionLayer(map, *coreLayer.as<mbgl::style::FillExtrusionLayer>()); - } else if (coreLayer.is<mbgl::style::FillLayer>()) { - return new FillLayer(map, *coreLayer.as<mbgl::style::FillLayer>()); - } else if (coreLayer.is<mbgl::style::LineLayer>()) { - return new LineLayer(map, *coreLayer.as<mbgl::style::LineLayer>()); - } else if (coreLayer.is<mbgl::style::RasterLayer>()) { - return new RasterLayer(map, *coreLayer.as<mbgl::style::RasterLayer>()); - } else if (coreLayer.is<mbgl::style::SymbolLayer>()) { - return new SymbolLayer(map, *coreLayer.as<mbgl::style::SymbolLayer>()); - } else if (coreLayer.is<mbgl::style::CustomLayer>()) { - return new CustomLayer(map, *coreLayer.as<mbgl::style::CustomLayer>()); - } else { - return new UnknownLayer(map, coreLayer); +// 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::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); } -} +}; -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>()))); +static Layer* initializeLayerPeer(mbgl::Map& map, mbgl::style::Layer& coreLayer) { + Layer* layer = coreLayer.accept(LayerPeerIntitializer {map}); + return layer ? layer : new UnknownLayer(map, coreLayer); } -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::FillExtrusionLayer>()) { - return createPeer<style::FillExtrusionLayer, FillExtrusionLayer>(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)); +// 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 <class LayerType> + Layer* operator()(LayerType&) && { + return new typename PeerType<LayerType>::Type( + map, + std::unique_ptr<LayerType>(layer.release()->as<LayerType>()) + ); } +}; + +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)); } jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, Map& map, style::Layer& coreLayer) { |