use num_traits::ToPrimitive;
#[must_use]
#[inline]
pub fn usize_to_f64(value: usize) -> f64 {
match value.to_f64() {
Some(converted) => converted,
None => f64::INFINITY,
}
}
#[must_use]
#[inline]
pub fn u64_to_f64(value: u64) -> f64 {
match value.to_f64() {
Some(converted) => converted,
None => f64::INFINITY,
}
}
#[must_use]
#[inline]
pub fn usize_to_f32(value: usize) -> f32 {
match value.to_f32() {
Some(converted) => converted,
None => f32::INFINITY,
}
}
#[must_use]
#[inline]
pub fn f64_to_f32(value: f64) -> f32 {
match value.to_f32() {
Some(converted) => converted,
None if value.is_sign_negative() => f32::NEG_INFINITY,
None => f32::INFINITY,
}
}
#[must_use]
#[inline]
pub fn f64_to_i64(value: f64) -> i64 {
match value.to_i64() {
Some(converted) => converted,
None if value.is_nan() => 0,
None if value.is_sign_negative() => i64::MIN,
None => i64::MAX,
}
}
#[must_use]
#[inline]
pub fn f32_to_i64(value: f32) -> i64 {
f64_to_i64(f64::from(value))
}
#[must_use]
#[inline]
pub fn f64_to_usize(value: f64) -> usize {
match value.to_usize() {
Some(converted) => converted,
None if value.is_nan() || value.is_sign_negative() => 0,
None => usize::MAX,
}
}
#[must_use]
#[inline]
pub fn usize_to_u32(value: usize) -> u32 {
match u32::try_from(value) {
Ok(converted) => converted,
Err(_) => u32::MAX,
}
}
#[must_use]
#[inline]
pub fn u64_to_u32(value: u64) -> u32 {
match u32::try_from(value) {
Ok(converted) => converted,
Err(_) => u32::MAX,
}
}
#[must_use]
#[inline]
pub fn f64_to_u32(value: f64) -> u32 {
match value.to_u32() {
Some(converted) => converted,
None if value.is_nan() || value.is_sign_negative() => 0,
None => u32::MAX,
}
}
#[must_use]
#[inline]
pub fn f64_to_u64(value: f64) -> u64 {
match value.to_u64() {
Some(converted) => converted,
None if value.is_nan() || value.is_sign_negative() => 0,
None => u64::MAX,
}
}
#[must_use]
#[inline]
pub const fn low_u8(value: u32) -> u8 {
value.to_le_bytes()[0]
}
#[must_use]
#[inline]
pub const fn low_u16(value: u32) -> u16 {
let bytes = value.to_le_bytes();
u16::from_le_bytes([bytes[0], bytes[1]])
}
#[must_use]
#[inline]
pub fn f32_eq(left: f32, right: f32) -> bool {
left.partial_cmp(&right) == Some(std::cmp::Ordering::Equal)
}
#[must_use]
#[inline]
pub fn f64_eq(left: f64, right: f64) -> bool {
left.partial_cmp(&right) == Some(std::cmp::Ordering::Equal)
}
#[must_use]
#[inline]
pub fn i64_to_f64(value: i64) -> f64 {
match value.to_f64() {
Some(converted) => converted,
None => f64::NAN,
}
}
#[must_use]
#[inline]
pub fn u64_to_f32_unit(bits: u64) -> f32 {
f64_to_f32(u64_to_f64(bits & 0x00ff_ffff) / 16_777_216.0)
}