use awint_internals::*;
use const_fn::const_fn;
use crate::Bits;
impl Bits {
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn is_zero(&self) -> bool {
unsafe_for_each!(self, x, {
if x != 0 {
return false
}
});
true
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn is_umax(&self) -> bool {
unsafe_for_each!(self, x, {0..(self.len() - 1)} {
if x != MAX {
return false
}
});
if self.extra() == 0 {
self.last() == MAX
} else {
self.last() == (MAX >> self.unused())
}
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn is_imax(&self) -> bool {
unsafe_for_each!(self, x, {0..(self.len() - 1)} {
if x != MAX {
return false
}
});
if self.extra() == 0 {
self.last() == MAX >> 1
} else {
self.last() == !(MAX << (self.extra() - 1))
}
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn is_imin(&self) -> bool {
unsafe_for_each!(self, x, {0..(self.len() - 1)} {
if x != 0 {
return false
}
});
if self.extra() == 0 {
self.last() == IDigit::MIN as Digit
} else {
self.last() == (1 << (self.extra() - 1))
}
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn is_uone(&self) -> bool {
if self.first() != 1 {
return false
}
unsafe_for_each!(self, x, {1..self.len()} {
if x != 0 {
return false
}
});
true
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn const_eq(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {0..self.len()}.rev() {
if x != y {
return Some(false)
}
});
Some(true)
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn const_ne(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {0..self.len()}.rev() {
if x != y {
return Some(true)
}
});
Some(false)
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn ult(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {0..self.len()}.rev() {
if x < y {
return Some(true)
} else if x != y {
return Some(false)
}
});
Some(false)
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn ule(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {0..self.len()}.rev() {
if x < y {
return Some(true)
} else if x != y {
return Some(false)
}
});
Some(true)
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn ugt(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {0..self.len()}.rev() {
if x < y {
return Some(false)
} else if x != y {
return Some(true)
}
});
Some(false)
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn uge(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {0..self.len()}.rev() {
if x < y {
return Some(false)
} else if x != y {
return Some(true)
}
});
Some(true)
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn ilt(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {
if self.msb() != rhs.msb() {
return Some(self.msb())
}
},
{0..self.len()}.rev() {
if x < y {
return Some(true)
} else if x != y {
return Some(false)
}
});
Some(false)
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn ile(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {
if self.msb() != rhs.msb() {
return Some(self.msb())
}
},
{0..self.len()}.rev() {
if x < y {
return Some(true)
} else if x != y {
return Some(false)
}
});
Some(true)
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn igt(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {
if self.msb() != rhs.msb() {
return Some(rhs.msb())
}
},
{0..self.len()}.rev() {
if x < y {
return Some(false)
} else if x != y {
return Some(true)
}
});
Some(false)
}
#[const_fn(cfg(feature = "const_support"))]
#[must_use]
pub const fn ige(&self, rhs: &Self) -> Option<bool> {
unsafe_binop_for_each!(self, rhs, x, y, {
if self.msb() != rhs.msb() {
return Some(rhs.msb())
}
},
{0..self.len()}.rev() {
if x < y {
return Some(false)
} else if x != y {
return Some(true)
}
});
Some(true)
}
}