From 10b2cc60a7b274f71b46976b1e9e89031b9e44ca Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 26 Jul 2016 17:02:52 -0400 Subject: [android] #5610 - Runtime style api - part 2 --- platform/android/src/conversion/constant.hpp | 95 ++++++++++++++++++++++++++ platform/android/src/conversion/conversion.hpp | 50 ++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 platform/android/src/conversion/constant.hpp create mode 100644 platform/android/src/conversion/conversion.hpp (limited to 'platform/android/src/conversion') diff --git a/platform/android/src/conversion/constant.hpp b/platform/android/src/conversion/constant.hpp new file mode 100644 index 0000000000..9a570d3717 --- /dev/null +++ b/platform/android/src/conversion/constant.hpp @@ -0,0 +1,95 @@ +#pragma once + +#include "conversion.hpp" + +#include +#include + +#include +#include +#include +#include + +namespace mbgl { +namespace android { +namespace conversion { + +template <> +struct Converter { + Result operator()(jni::JNIEnv& env, const bool& value) const { + static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Boolean")).release(); + static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(Z)V"); + return {&jni::NewObject(env, *javaClass, *constructor, (jboolean) value)}; + } +}; + +template <> +struct Converter { + Result operator()(jni::JNIEnv& env, const float& value) const { + static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Float")).release(); + static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(F)V"); + return {&jni::NewObject(env, *javaClass, *constructor, (jfloat) value)}; + } +}; + +template <> +struct Converter { + Result operator()(jni::JNIEnv& env, const std::string& value) const { + return {jni::Make(env, value).Get()}; + } +}; + +template <> +struct Converter { + Result operator()(jni::JNIEnv& env, const Color& value) const { + std::stringstream sstream; + sstream << "rgba(" << value.r << ", " << value.g << ", " << value.b << ", " << value.a << ")"; + std::string result = sstream.str(); + return convert(env, result); + } +}; + +template +struct Converter> { + Result operator()(jni::JNIEnv& env, const std::array& value) const { + std::vector v; + for (const float& id : value) { + v.push_back(id); + } + return convert>(env, v); + } +}; + +template <> +struct Converter> { + Result operator()(jni::JNIEnv& env, const std::vector& value) const { + static jni::jclass* stringCass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/String")).release(); + jni::jarray& jarray = jni::NewObjectArray(env, value.size(), *stringCass); + + for(size_t i = 0; i < value.size(); i = i + 1) { + Result converted = convert(env, value.at(i)); + jni::SetObjectArrayElement(env, jarray, i, *converted); + } + + return &jarray; + } +}; + +template <> +struct Converter> { + Result operator()(jni::JNIEnv& env, const std::vector& value) const { + static jni::jclass* floatClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Float")).release(); + jni::jarray& jarray = jni::NewObjectArray(env, value.size(), *floatClass); + + for(size_t i = 0; i < value.size(); i = i + 1) { + Result converted = convert(env, value.at(i)); + jni::SetObjectArrayElement(env, jarray, i, *converted); + } + + return &jarray; + } +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/platform/android/src/conversion/conversion.hpp b/platform/android/src/conversion/conversion.hpp new file mode 100644 index 0000000000..ea8a31bcf2 --- /dev/null +++ b/platform/android/src/conversion/conversion.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include + +#include + +#include + +namespace mbgl { +namespace android { +namespace conversion { + +struct Error { std::string message; }; + +template +class Result : private variant { +public: + using variant::variant; + + explicit operator bool() const { + return this->template is(); + } + + T& operator*() { + assert(this->template is()); + return this->template get(); + } + + const T& operator*() const { + assert(this->template is()); + return this->template get(); + } + + const Error& error() const { + assert(this->template is()); + return this->template get(); + } +}; + +template +struct Converter; + +template +Result convert(jni::JNIEnv& env, const V& value, Args&&...args) { + return Converter()(env, value, std::forward(args)...); +} + +} // namespace conversion +} // namespace android +} // namespace mbgl \ No newline at end of file -- cgit v1.2.1