pub trait ToJsUint32 {
fn to_js_uint32(self) -> u32;
}
pub trait ToJsInt32 {
fn to_js_int32(self) -> i32;
}
impl ToJsUint32 for f64 {
#[inline]
fn to_js_uint32(self) -> u32 {
if !self.is_finite() || self == 0.0 {
return 0;
}
let int = self.trunc();
let rem = int.rem_euclid(4294967296.0);
rem as u64 as u32
}
}
impl ToJsUint32 for f32 {
#[inline]
fn to_js_uint32(self) -> u32 {
(self as f64).to_js_uint32()
}
}
macro_rules! impl_to_js_uint32_for_int {
($($t:ty),*) => {
$(
impl ToJsUint32 for $t {
#[inline]
fn to_js_uint32(self) -> u32 {
self as u32
}
}
)*
};
}
impl_to_js_uint32_for_int!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize);
impl<T: ToJsUint32> ToJsInt32 for T {
#[inline]
fn to_js_int32(self) -> i32 {
self.to_js_uint32() as i32
}
}