5#ifndef LIB_CONVERTER_TONIC_DART_CONVERTER_H_
6#define LIB_CONVERTER_TONIC_DART_CONVERTER_H_
12#include "third_party/dart/runtime/include/dart_api.h"
20template <
typename T,
typename Enable =
void>
42 static constexpr const char* kFfiRepresentation =
"Void";
43 static constexpr const char* kDartRepresentation =
"void";
44 static constexpr bool kAllowedInLeafCall =
true;
57 static constexpr const char* kFfiRepresentation =
"Bool";
58 static constexpr const char* kDartRepresentation =
"bool";
59 static constexpr bool kAllowedInLeafCall =
true;
64 Dart_SetBooleanReturnValue(
args, val);
69 Dart_BooleanValue(handle, &result);
75 Dart_Handle& exception) {
77 Dart_GetNativeBooleanArgument(
args, index, &result);
97 static Dart_Handle
ToDart(T val) {
return Dart_NewInteger(val); }
100 Dart_SetIntegerReturnValue(
args, val);
105 Dart_IntegerToInt64(handle, &result);
106 return static_cast<T
>(result);
111 Dart_Handle& exception) {
113 Dart_GetNativeIntegerArgument(
args, index, &result);
114 return static_cast<T
>(result);
121 if (
sizeof(T) == 4) {
122 if (std::is_signed<T>()) {
128 if (std::is_signed<T>()) {
155 static constexpr const char* kFfiRepresentation =
"Uint64";
156 static constexpr const char* kDartRepresentation =
"int";
157 static constexpr bool kAllowedInLeafCall =
true;
166 static Dart_Handle
ToDart(
unsigned long long val) {
168 return Dart_NewInteger(
static_cast<int64_t
>(val));
172 unsigned long long val) {
174 Dart_SetIntegerReturnValue(
args, val);
177 static unsigned long long FromDart(Dart_Handle handle) {
179 Dart_IntegerToInt64(handle, &result);
185 Dart_Handle& exception) {
187 Dart_GetNativeIntegerArgument(
args, index, &result);
210 static constexpr const char* kFfiRepresentation =
"Double";
211 static constexpr const char* kDartRepresentation =
"double";
212 static constexpr bool kAllowedInLeafCall =
true;
214 static Dart_Handle
ToDart(
double val) {
return Dart_NewDouble(val); }
217 Dart_SetDoubleReturnValue(
args, val);
222 Dart_DoubleValue(handle, &result);
228 Dart_Handle& exception) {
230 Dart_GetNativeDoubleArgument(
args, index, &result);
248 static constexpr const char* kFfiRepresentation =
"Int32";
249 static constexpr const char* kDartRepresentation =
"int";
250 static constexpr bool kAllowedInLeafCall =
true;
253 return Dart_NewInteger(
254 static_cast<typename std::underlying_type<T>::type
>(val));
258 Dart_SetIntegerReturnValue(
259 args,
static_cast<typename std::underlying_type<T>::type
>(val));
264 Dart_IntegerToInt64(handle, &result);
265 return static_cast<T
>(result);
270 Dart_Handle& exception) {
272 Dart_GetNativeIntegerArgument(
args, index, &result);
273 return static_cast<T
>(result);
289 static constexpr const char* kFfiRepresentation =
"Handle";
290 static constexpr const char* kDartRepresentation =
"String";
291 static constexpr bool kAllowedInLeafCall =
false;
294 return Dart_NewStringFromUTF8(
reinterpret_cast<const uint8_t*
>(val.data()),
303 if (Dart_IsNull(handle)) {
304 return std::string();
306 uint8_t*
data =
nullptr;
308 if (Dart_IsError(Dart_StringToUTF8(handle, &
data, &
length)))
309 return std::string();
310 return std::string(
reinterpret_cast<char*
>(
data),
length);
315 Dart_Handle& exception) {
316 return FromDart(Dart_GetNativeArgument(
args, index));
330 static constexpr const char* kFfiRepresentation =
"Handle";
331 static constexpr const char* kDartRepresentation =
"String";
332 static constexpr bool kAllowedInLeafCall =
false;
335 return Dart_NewStringFromUTF16(
336 reinterpret_cast<const uint16_t*
>(val.data()), val.length());
344 if (Dart_IsNull(handle)) {
345 return std::u16string();
348 Dart_StringLength(handle, &
length);
350 Dart_StringToUTF16(handle,
data.data(), &
length);
351 return std::u16string(
reinterpret_cast<char16_t*
>(
data.data()),
length);
356 Dart_Handle& exception) {
357 return FromDart(Dart_GetNativeArgument(
args, index));
369 static Dart_Handle
ToDart(
const char* val) {
370 return Dart_NewStringFromCString(val);
378 if (Dart_IsNull(handle)) {
381 const char* result =
nullptr;
382 Dart_StringToCString(handle, &result);
388 Dart_Handle& exception) {
389 return FromDart(Dart_GetNativeArgument(
args, index));
397 const std::string& type_name) {
407 auto type = Dart_GetNonNullableType(library, type_string, 0,
nullptr);
415 std::enable_if_t<std::is_same<std::string, T>::value,
int> = 0>
420template <typename T, std::enable_if_t<std::is_integral<T>::value,
int> = 0>
426 std::enable_if_t<std::is_floating_point<T>::value,
int> = 0>
433 Dart_Handle type_handle_or_null = ::Dart_Null()) {
434 if constexpr (std::is_same<std::string, T>::value) {
435 return ::Dart_EmptyString();
436 }
else if constexpr (std::is_integral<T>::value) {
437 return ::Dart_NewIntegerFromUint64(0u);
438 }
else if constexpr (std::is_floating_point<T>::value) {
439 return ::Dart_NewDouble(0.0);
441 auto object = ::Dart_New(type_handle_or_null, ::Dart_Null(), 0,
nullptr);
445 return ::Dart_Null();
448template <
typename T,
typename Enable =
void>
451 bool is_nullable =
false;
452 auto is_nullable_handle = ::Dart_IsNullableType(type_handle, &is_nullable);
454 return is_nullable_handle;
457 auto list = ::Dart_NewListOfType(type_handle,
length);
461 auto sentinel = CreateZeroInitializedDartObject<T>(type_handle);
465 auto list = ::Dart_NewListOfTypeFilled(type_handle, sentinel,
length);
469 return ::Dart_Null();
476 static constexpr const char* kFfiRepresentation =
"Handle";
477 static constexpr const char* kDartRepresentation =
"List";
478 static constexpr bool kAllowedInLeafCall =
false;
483 static Dart_Handle
ToDart(
const std::vector<ValueType>& val) {
485 ToDartTypeHandle<ValueType>(), val.size());
486 if (Dart_IsError(list))
488 for (
size_t i = 0;
i < val.size();
i++) {
491 if (Dart_IsError(result))
498 const std::vector<ValueType>& val) {
502 static std::vector<ValueType>
FromDart(Dart_Handle handle) {
503 std::vector<ValueType> result;
505 if (!Dart_IsList(handle))
509 Dart_ListLength(handle, &
length);
516 std::vector<Dart_Handle> items(
length);
517 Dart_Handle items_result =
518 Dart_ListGetRange(handle, 0,
length, items.data());
530 Dart_Handle& exception) {
531 return FromDart(Dart_GetNativeArgument(
args, index));
548 static constexpr const char* kFfiRepresentation =
"Handle";
549 static constexpr const char* kDartRepresentation =
"Object";
550 static constexpr bool kAllowedInLeafCall =
false;
555 Dart_SetReturnValue(
args, val);
562 Dart_Handle& exception) {
563 Dart_Handle result = Dart_GetNativeArgument(
args, index);
595inline Dart_Handle
ToDart(
const char* val) {
596 return Dart_NewStringFromCString(val);
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
Dart_Handle LookupNonNullableType(const std::string &library_name, const std::string &type_name)
Dart_Handle StdStringToDart(const std::string &val)
Dart_Handle ToDartTypeHandle()
Dart_Handle ToDart(const T &object)
bool CheckAndHandleError(Dart_Handle handle)
std::string StdStringFromDart(Dart_Handle handle)
Dart_Handle CreateZeroInitializedDartObject(Dart_Handle type_handle_or_null=::Dart_Null())
static NativeType FromFfi(FfiType val)
static FfiType ToFfi(NativeType val)
static Dart_Handle ToDart(NativeType val)
static bool AllowedInLeafCall()
static const char * GetDartRepresentation()
static const char * GetFfiRepresentation()
static NativeType FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static NativeType FromDart(Dart_Handle handle)
static void SetReturnValue(Dart_NativeArguments args, Dart_Handle val)
static const char * GetFfiRepresentation()
static T FromDart(Dart_Handle handle)
static Dart_Handle ToDart(T val)
static void SetReturnValue(Dart_NativeArguments args, T val)
static bool AllowedInLeafCall()
static T FromFfi(FfiType val)
static T FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static const char * GetDartRepresentation()
static void SetReturnValue(Dart_NativeArguments args, bool val)
static bool AllowedInLeafCall()
static FfiType ToFfi(NativeType val)
static Dart_Handle ToDart(NativeType val)
static const char * GetFfiRepresentation()
static const char * GetDartRepresentation()
static NativeType FromDart(Dart_Handle handle)
static NativeType FromFfi(FfiType val)
static NativeType FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static const char * FromDart(Dart_Handle handle)
static void SetReturnValue(Dart_NativeArguments args, const char *val)
static const char * FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static Dart_Handle ToDart(const char *val)
static FfiType ToFfi(double val)
static void SetReturnValue(Dart_NativeArguments args, double val)
static bool AllowedInLeafCall()
static double FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static const char * GetFfiRepresentation()
static Dart_Handle ToDart(double val)
static double FromFfi(FfiType val)
static double FromDart(Dart_Handle handle)
static const char * GetDartRepresentation()
static FfiType ToFfi(NativeType val)
static const char * GetDartRepresentation()
static const char * GetFfiRepresentation()
static Dart_Handle ToDart(const NativeType &val)
static bool AllowedInLeafCall()
static NativeType FromDart(Dart_Handle handle)
static NativeType FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static NativeType FromFfi(FfiType val)
static void SetReturnValue(Dart_NativeArguments args, const NativeType &val)
std::u16string NativeType
static NativeType FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static const char * GetDartRepresentation()
static NativeType FromFfi(FfiType val)
static const char * GetFfiRepresentation()
static void SetReturnValue(Dart_NativeArguments args, const NativeType &val)
static NativeType FromDart(Dart_Handle handle)
static FfiType ToFfi(NativeType val)
static bool AllowedInLeafCall()
static Dart_Handle ToDart(const NativeType &val)
static bool AllowedInLeafCall()
typename DartConverterTypes< T >::ValueType ValueType
static Dart_Handle ToDart(const std::vector< ValueType > &val)
static std::vector< ValueType > FromDart(Dart_Handle handle)
static const char * GetDartRepresentation()
static const char * GetFfiRepresentation()
static FfiType ToFfi(std::vector< ValueType > val)
static void SetReturnValue(Dart_NativeArguments args, const std::vector< ValueType > &val)
typename DartConverterTypes< T >::ConverterType ConverterType
static std::vector< ValueType > FromFfi(FfiType val)
static std::vector< ValueType > FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static bool AllowedInLeafCall()
static void SetReturnValue(Dart_NativeArguments args, unsigned long long val)
static Dart_Handle ToDart(unsigned long long val)
static const char * GetDartRepresentation()
static unsigned long long FromDart(Dart_Handle handle)
unsigned long long FfiType
static unsigned long long FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static FfiType FromFfi(FfiType val)
static FfiType ToFfi(FfiType val)
static const char * GetFfiRepresentation()
static bool AllowedInLeafCall()
static const char * GetDartRepresentation()
static const char * GetFfiRepresentation()
static Dart_Handle ToDart(T val)
static const char * GetFfiRepresentation()
static constexpr const char * kDartRepresentation
static void SetReturnValue(Dart_NativeArguments args, T val)
static T FromFfi(FfiType val)
static const char * GetDartRepresentation()
static constexpr bool kAllowedInLeafCall
static T FromDart(Dart_Handle handle)
static FfiType ToFfi(T val)
static bool AllowedInLeafCall()
static T FromArguments(Dart_NativeArguments args, int index, Dart_Handle &exception)
static Dart_Handle NewList(Dart_Handle type_handle, intptr_t length)
std::shared_ptr< const fml::Mapping > data