From b2570b909b6cbf408bd9779656fd6a397d08dcec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Thu, 30 Mar 2017 12:14:35 +0200 Subject: [PATCH] [android] Fix implicit geometry conversions for NDK r13b --- platform/android/src/geojson/multi_point.cpp | 4 +++- platform/android/src/geojson/polygon.cpp | 6 +++++- platform/android/src/geojson/util.hpp | 22 ++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 platform/android/src/geojson/util.hpp diff --git a/platform/android/src/geojson/multi_point.cpp b/platform/android/src/geojson/multi_point.cpp index df4fdd7df..f3acdb1ea 100644 --- a/platform/android/src/geojson/multi_point.cpp +++ b/platform/android/src/geojson/multi_point.cpp @@ -2,6 +2,8 @@ #include "line_string.hpp" +#include "util.hpp" + namespace mbgl { namespace android { namespace geojson { @@ -11,7 +13,7 @@ mapbox::geojson::multi_point MultiPoint::convert(jni::JNIEnv &env, jni::Object(LineString::convert(env, jPositionListsList)); jni::DeleteLocalRef(env, jPositionListsList); } diff --git a/platform/android/src/geojson/polygon.cpp b/platform/android/src/geojson/polygon.cpp index bb37b8d99..ef00f9df3 100644 --- a/platform/android/src/geojson/polygon.cpp +++ b/platform/android/src/geojson/polygon.cpp @@ -2,6 +2,8 @@ #include "multi_line_string.hpp" +#include "util.hpp" + namespace mbgl { namespace android { namespace geojson { @@ -24,7 +26,9 @@ mapbox::geojson::polygon Polygon::convert(jni::JNIEnv &env, jni::Object(std::move(line))); + } } return polygon; diff --git a/platform/android/src/geojson/util.hpp b/platform/android/src/geojson/util.hpp new file mode 100644 index 000000000..ece8e5243 --- /dev/null +++ b/platform/android/src/geojson/util.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include + +namespace mbgl { +namespace android { +namespace geojson { + +// Clang 3.8 fails to implicitly convert matching types, so we'll have to do it explicitly. +template +To convertExplicit(From&& src) { + static_assert(std::is_same::container_type, + typename To::container_type>::value, + "container types do not match"); + static_assert(std::is_rvalue_reference::value, + "argument must be rvalue reference"); + return *reinterpret_cast>(&src); +} + +} // namespace geojson +} // namespace android +} // namespace mbgl