use crate::{
LuaValue,
lua_vm::execute::helper::{ttisfloat, ttisinteger},
};
#[inline]
pub fn int_lt_float(i: i64, f: f64) -> bool {
if f.is_nan() {
return false;
}
if f >= (i64::MAX as f64) {
return true;
}
if f < (i64::MIN as f64) {
return false;
}
let fi = f as i64;
if i < fi {
true
} else if i > fi {
false
} else {
f > (fi as f64)
}
}
#[inline]
pub fn float_lt_int(f: f64, i: i64) -> bool {
if f.is_nan() {
return false;
}
if f >= (i64::MAX as f64) {
return false;
}
if f < (i64::MIN as f64) {
return true;
}
let fi = f as i64;
if fi < i {
true
} else if fi > i {
false
} else {
f < (fi as f64)
}
}
#[inline]
pub fn int_le_float(i: i64, f: f64) -> bool {
if f.is_nan() {
return false;
}
!float_lt_int(f, i)
}
#[inline]
pub fn float_le_int(f: f64, i: i64) -> bool {
if f.is_nan() {
return false;
}
!int_lt_float(i, f)
}
pub fn lt_num(a: &LuaValue, b: &LuaValue) -> bool {
if ttisinteger(a) {
let ai = a.ivalue();
if ttisinteger(b) {
let bi = b.ivalue();
ai < bi
} else if ttisfloat(b) {
int_lt_float(ai, b.fltvalue())
} else {
false
}
} else {
let af = a.fltvalue();
if ttisfloat(b) {
let bf = b.fltvalue();
af < bf
} else if ttisinteger(b) {
float_lt_int(af, b.ivalue())
} else {
false
}
}
}
pub fn le_num(a: &LuaValue, b: &LuaValue) -> bool {
if ttisinteger(a) {
let ai = a.ivalue();
if ttisinteger(b) {
let bi = b.ivalue();
ai <= bi
} else if ttisfloat(b) {
int_le_float(ai, b.fltvalue())
} else {
false
}
} else {
let af = a.fltvalue();
if ttisfloat(b) {
let bf = b.fltvalue();
af <= bf
} else if ttisinteger(b) {
float_le_int(af, b.ivalue())
} else {
false
}
}
}