diff options
Diffstat (limited to 'platform')
-rw-r--r-- | platform/android/src/geojson/multi_point.cpp | 4 | ||||
-rw-r--r-- | platform/android/src/geojson/polygon.cpp | 6 | ||||
-rw-r--r-- | platform/android/src/geojson/util.hpp | 22 |
3 files changed, 30 insertions, 2 deletions
diff --git a/platform/android/src/geojson/multi_point.cpp b/platform/android/src/geojson/multi_point.cpp index df4fdd7dfa..f3acdb1ea6 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<M if (jMultiPoint) { auto jPositionListsList = MultiPoint::getCoordinates(env, jMultiPoint); - multiPoint = LineString::convert(env, jPositionListsList); + multiPoint = convertExplicit<mapbox::geojson::multi_point>(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 bb37b8d99e..ef00f9df3f 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<java::ut if (jPositionListsList) { auto multiLine = MultiLineString::convert(env, jPositionListsList); polygon.reserve(multiLine.size()); - polygon.insert(std::end(polygon), std::begin(multiLine), std::end(multiLine)); + for (auto&& line : multiLine) { + polygon.emplace_back(convertExplicit<mapbox::geojson::linear_ring>(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 0000000000..ece8e52433 --- /dev/null +++ b/platform/android/src/geojson/util.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include <type_traits> + +namespace mbgl { +namespace android { +namespace geojson { + +// Clang 3.8 fails to implicitly convert matching types, so we'll have to do it explicitly. +template <typename To, typename From> +To convertExplicit(From&& src) { + static_assert(std::is_same<typename std::decay_t<From>::container_type, + typename To::container_type>::value, + "container types do not match"); + static_assert(std::is_rvalue_reference<From&&>::value, + "argument must be rvalue reference"); + return *reinterpret_cast<std::add_pointer_t<To>>(&src); +} + +} // namespace geojson +} // namespace android +} // namespace mbgl |