diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-11-28 18:19:17 +0200 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-11-29 09:53:28 +0200 |
commit | cd4136ed4b4fc5d9a44fe17aa98dfd590c9c0bfb (patch) | |
tree | 42e601f7b16a83a62a8418511b795b6dfcf9eeff /platform/android | |
parent | e3d1daaf6687467ee5c064d2577d2903c508c2dc (diff) | |
download | qtlocation-mapboxgl-cd4136ed4b4fc5d9a44fe17aa98dfd590c9c0bfb.tar.gz |
[core][android][darwin] Fix GeoJSONOptions handling
- share the `GeoJSONOptions` instances using `Immutable<GeoJSONOptions>` - avoid extra copying
- fix wrapping of the `GeoJSONOptions` instances in supercluster map/reduce lambdas.
Previously, local variables were wrapped by reference.
Diffstat (limited to 'platform/android')
-rw-r--r-- | platform/android/src/style/sources/geojson_source.cpp | 62 | ||||
-rw-r--r-- | platform/android/src/style/sources/geojson_source.hpp | 4 |
2 files changed, 33 insertions, 33 deletions
diff --git a/platform/android/src/style/sources/geojson_source.cpp b/platform/android/src/style/sources/geojson_source.cpp index 0eece4b1ad..f68c9d8f42 100644 --- a/platform/android/src/style/sources/geojson_source.cpp +++ b/platform/android/src/style/sources/geojson_source.cpp @@ -1,4 +1,5 @@ #include "geojson_source.hpp" +#include <mbgl/style/sources/geojson_source_impl.hpp> #include "../../attach_env.hpp" #include <mbgl/renderer/query.hpp> @@ -29,44 +30,42 @@ namespace android { // This conversion is expected not to fail because it's used only in contexts where // the value was originally a GeoJsonOptions object on the Java side. If it fails // to convert, it's a bug in our serialization or Java-side static typing. - static style::GeoJSONOptions convertGeoJSONOptions(jni::JNIEnv& env, const jni::Object<>& options) { - using namespace mbgl::style::conversion; - if (!options) { - return style::GeoJSONOptions(); - } - Error error; - optional<style::GeoJSONOptions> result = convert<style::GeoJSONOptions>( - mbgl::android::Value(env, options), error); - if (!result) { - throw std::logic_error(error.message); - } - return *result; +static Immutable<style::GeoJSONOptions> convertGeoJSONOptions(jni::JNIEnv& env, const jni::Object<>& options) { + using namespace mbgl::style::conversion; + if (!options) { + return style::GeoJSONOptions::defaultOptions(); } + Error error; + optional<style::GeoJSONOptions> result = convert<style::GeoJSONOptions>(mbgl::android::Value(env, options), error); + if (!result) { + throw std::logic_error(error.message); + } + return makeMutable<style::GeoJSONOptions>(std::move(*result)); +} - GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, const jni::String& sourceId, const jni::Object<>& options) - : Source(env, - std::make_unique<mbgl::style::GeoJSONSource>(jni::Make<std::string>(env, sourceId), - convertGeoJSONOptions(env, options))), - converter(std::make_unique<Actor<FeatureConverter>>(Scheduler::GetBackground(), - source.as<style::GeoJSONSource>()->getOptions())) {} - - GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, AndroidRendererFrontend& frontend) - : Source(env, coreSource, createJavaPeer(env), frontend), - converter(std::make_unique<Actor<FeatureConverter>>(Scheduler::GetBackground(), - source.as<style::GeoJSONSource>()->getOptions())) {} +GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, const jni::String& sourceId, const jni::Object<>& options) + : Source(env, + std::make_unique<mbgl::style::GeoJSONSource>(jni::Make<std::string>(env, sourceId), + convertGeoJSONOptions(env, options))), + converter(std::make_unique<Actor<FeatureConverter>>(Scheduler::GetBackground(), + source.as<style::GeoJSONSource>()->impl().getOptions())) {} - GeoJSONSource::~GeoJSONSource() = default; +GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, AndroidRendererFrontend& frontend) + : Source(env, coreSource, createJavaPeer(env), frontend), + converter(std::make_unique<Actor<FeatureConverter>>(Scheduler::GetBackground(), + source.as<style::GeoJSONSource>()->impl().getOptions())) {} - void GeoJSONSource::setGeoJSONString(jni::JNIEnv& env, const jni::String& jString) { +GeoJSONSource::~GeoJSONSource() = default; - std::shared_ptr<std::string> json = std::make_shared<std::string>(jni::Make<std::string>(env, jString)); +void GeoJSONSource::setGeoJSONString(jni::JNIEnv& env, const jni::String& jString) { + std::shared_ptr<std::string> json = std::make_shared<std::string>(jni::Make<std::string>(env, jString)); - Update::Converter converterFn = [this, json](ActorRef<GeoJSONDataCallback> _callback) { - converter->self().invoke(&FeatureConverter::convertJson, json, _callback); - }; + Update::Converter converterFn = [this, json](ActorRef<GeoJSONDataCallback> _callback) { + converter->self().invoke(&FeatureConverter::convertJson, json, _callback); + }; - setAsync(converterFn); - } + setAsync(converterFn); +} void GeoJSONSource::setFeatureCollection(jni::JNIEnv& env, const jni::Object<geojson::FeatureCollection>& jFeatures) { setCollectionAsync(env, jFeatures); @@ -237,6 +236,7 @@ namespace android { mbgl::Log::Error(mbgl::Event::JNI, "Error setting geo json: " + error.message); return; } + callback.invoke(&GeoJSONDataCallback::operator(), style::GeoJSONData::create(*converted, options)); } diff --git a/platform/android/src/style/sources/geojson_source.hpp b/platform/android/src/style/sources/geojson_source.hpp index e506191ceb..668e944e1c 100644 --- a/platform/android/src/style/sources/geojson_source.hpp +++ b/platform/android/src/style/sources/geojson_source.hpp @@ -15,7 +15,7 @@ using GeoJSONDataCallback = std::function<void(std::shared_ptr<style::GeoJSONDat class FeatureConverter { public: - explicit FeatureConverter(style::GeoJSONOptions options_) : options(std::move(options_)) {} + explicit FeatureConverter(Immutable<style::GeoJSONOptions> options_) : options(std::move(options_)) {} void convertJson(std::shared_ptr<std::string>, ActorRef<GeoJSONDataCallback>); template <class JNIType> @@ -23,7 +23,7 @@ public: ActorRef<GeoJSONDataCallback>); private: - style::GeoJSONOptions options; + Immutable<style::GeoJSONOptions> options; }; struct Update { |