15 #ifndef SHAKA_EMBEDDED_MAPPING_CONVERT_JS_H_ 16 #define SHAKA_EMBEDDED_MAPPING_CONVERT_JS_H_ 21 #include <type_traits> 22 #include <unordered_map> 43 template <
typename T,
typename =
void>
47 #define ADD_SPECIAL_TYPE(id, ...) \ 48 template <typename T> \ 49 struct _SelectSpecialTypes<T, util::enable_if_t<__VA_ARGS__>> { \ 55 std::is_base_of<GenericConverter, T>::value);
57 #undef ADD_SPECIAL_TYPE 84 template <
typename Number>
95 if (std::numeric_limits<Number>::has_infinity &&
96 std::abs(value) == std::numeric_limits<Number>::infinity()) {
98 }
else if (value < std::numeric_limits<Number>::lowest() ||
99 value > std::numeric_limits<Number>::max()) {
105 *dest =
static_cast<Number>(value);
110 #if defined(USING_V8) 112 #elif defined(USING_JSC) 113 return JSValueMakeNumber(
GetContext(), source);
118 template <
typename T>
121 return dest->TryConvert(source);
125 return source.ToJsValue();
129 template <
typename T>
140 *dest = std::move(temp);
153 template <
typename... Types>
156 template <
size_t I,
typename =
void>
164 dest->template emplace<I>(std::move(temp));
172 if (source.
index() == I)
178 template <
typename Dummy>
179 struct Helper<sizeof...(Types) - 1, Dummy> {
180 static constexpr
const size_t I =
sizeof...(Types) - 1;
187 dest->template emplace<I>(std::move(temp));
195 CHECK_EQ(source.
index(), I);
211 template <
typename T>
217 LocalVar<JsObject> array(UnsafeJsCast<JsObject>(source));
221 std::vector<T> temp(length);
222 DCHECK_EQ(length, temp.size());
223 for (
size_t i = 0; i < length; i++) {
234 LocalVar<JsObject> ret(
CreateArray(source.size()));
235 for (
size_t i = 0; i < source.size(); i++) {
243 template <
typename Key,
typename Value>
246 std::unordered_map<Key, Value>*
dest) {
249 "Can only use std::string as a key for maps");
253 LocalVar<JsObject> map(UnsafeJsCast<JsObject>(source));
259 std::unordered_map<Key, Value> temp;
266 temp.emplace(
name, std::move(temp_field));
274 const std::unordered_map<Key, Value>&
source) {
276 for (
auto& pair : source) {
284 template <
typename T>
286 static_assert(std::is_base_of<BackingObject, T>::value,
287 "Don't accept raw pointers as arguments, use RefPtr<T>.");
296 return source->JsThis();
300 template <
typename T>
312 *dest = UnsafeJsCast<JsObject>(
source);
352 #if defined(USING_V8) 353 return v8::Boolean::New(
GetIsolate(), source);
354 #elif defined(USING_JSC) 355 return JSValueMakeBoolean(
GetContext(), source);
369 template <
typename T>
380 template <
typename T>
388 #endif // SHAKA_EMBEDDED_MAPPING_CONVERT_JS_H_ void SetArrayIndexRaw(Handle< JsObject > object, size_t i, Handle< JsValue > value)
static ReturnVal< JsValue > ToJsValue(Number source)
ReturnVal< JsObject > CreateObject()
bool IsObject(Handle< JsValue > value)
bool FromJsValue(Handle< JsValue > source, T *dest)
bool IsNullOrUndefined(Handle< JsValue > value)
std::vector< std::string > GetMemberNames(Handle< JsObject > object)
ReturnVal< JsValue > JsNull()
ReturnVal< JsValue > GetArrayIndexRaw(Handle< JsObject > object, size_t index, LocalVar< JsValue > *exception=nullptr)
static ReturnVal< JsValue > ToJsValue(const ReturnVal< T > &source)
static ReturnVal< JsValue > ToJsValue(bool source)
static bool FromJsValue(Handle< JsValue > source, std::vector< T > *dest)
bool BooleanFromValue(Handle< JsValue > value)
static ReturnVal< JsValue > ToJsValue(const std::vector< T > &source)
static ReturnVal< JsValue > ToJsValue(const shaka::optional< T > &source)
ReturnVal< JsObject > CreateArray(size_t length)
ReturnVal< JsValue > ToJsValue(T &&source)
static bool FromJsValue(Handle< JsValue > source, Handle< JsObject > *dest)
const T & value() const &
ReturnVal< JsValue > RawToJsValue(Handle< T > source)
static bool FromJsValue(Handle< JsValue > source, std::string *dest)
static ReturnVal< JsValue > ToJsValue(const shaka::variant< Types... > &source)
static bool FromJsValue(Handle< JsValue > source, Number *dest)
#define ADD_SPECIAL_TYPE(id,...)
proto::ValueType GetValueType(Handle< JsValue > value)
double NumberFromValue(Handle< JsValue > value)
static ReturnVal< JsValue > ToJsValue(T *source)
static bool FromJsValue(Handle< JsValue > source, bool *dest)
void swap(shared_lock< Mutex > &a, shared_lock< Mutex > &b)
static ReturnVal< JsValue > ToJsValue(const T &source)
static ReturnVal< JsValue > ToJsValue(const std::unordered_map< Key, Value > &source)
static bool FromJsValue(Handle< JsValue > source, shaka::variant< Types... > *dest)
void SetMemberRaw(Handle< JsObject > object, const std::string &name, Handle< JsValue > value)
std::string ConvertToString(Handle< JsValue > value)
static ReturnVal< JsValue > ToJsValue(const std::string &source)
JSContextRef GetContext()
static bool FromJsValue(Handle< JsValue > source, T *dest)
static bool FromJsValue(Handle< JsValue > source, shaka::optional< T > *dest)
size_t ArrayLength(Handle< JsObject > value)
ReturnVal< JsString > JsStringFromUtf8(const std::string &str)
v8::Isolate * GetIsolate()
ReturnVal< JsValue > GetMemberRaw(Handle< JsObject > object, const std::string &name, LocalVar< JsValue > *exception=nullptr)
bool IsBuiltInObject(Handle< JsObject > object)
static bool FromJsValue(Handle< JsValue > source, std::unordered_map< Key, Value > *dest)
typename variant_alternative< I, Variant >::type variant_alternative_t