use std::collections::BTreeMap;
use const_num_traits::{
BitIndex, BitIndexOps, DivNonZero, Finite, HasNonZero, NonMin, NonNegative, Odd, Positive,
PowerOfTwo, PowerOfTwoOps,
};
fn power_of_two() {
let radix = 256u64;
let p = PowerOfTwo::<u64>::new(radix).expect("256 is 2^8");
assert_eq!(700u64.rem_pow2(p), 700 % 256); assert_eq!(700u64.div_pow2(p), 700 / 256);
assert_eq!(700u64.next_multiple_of_pow2(p), 768);
assert_eq!(u64::MAX.checked_next_multiple_of_pow2(p), None);
let mut folded = 0u64;
for limb in [10u64, 600, 70_000] {
folded ^= limb.rem_pow2(p);
}
assert_eq!(folded, (10 ^ 600 ^ 70_000) & 0xFF);
}
fn bit_index() {
let pos = BitIndex::<u64>::new(40).expect("40 < 64");
assert_eq!((1u64).shl_index(pos), 1u64 << 40);
assert_eq!((1u64 << 63).shr_index(pos), (1u64 << 63) >> 40);
assert!(BitIndex::<u64>::new(64).is_none());
}
fn nonzero_division() {
let d = 17u32.into_nonzero().expect("17 != 0");
assert_eq!(100u32.div_nonzero(d), 100 / 17);
assert_eq!(100u32.rem_nonzero(d), 100 % 17);
assert!(0u32.into_nonzero().is_none());
}
fn signed_range() {
let nn = NonNegative::<i32>::new(81).expect("81 >= 0");
let u: u32 = nn.to_unsigned(); assert_eq!(u, 81);
assert_eq!(nn.isqrt(), 9);
let nz = Positive::<i32>::new(7).expect("7 > 0").into_nonzero();
assert_eq!(nz.get(), 7);
}
fn nonmin() {
let a = NonMin::<i32>::new(-7).expect("-7 != MIN");
assert_eq!(a.abs(), 7); assert_eq!(a.neg(), 7);
let d = core::num::NonZero::new(2).unwrap();
assert_eq!(a.div_nonzero(d), -7 / 2);
let q = Positive::<i32>::new(9).unwrap().into_nonmin();
assert_eq!(q.abs(), 9);
assert!(NonMin::<i32>::new(i32::MIN).is_none());
}
fn odd_modulus() {
let m = Odd::<u64>::new(0xFFFF_FFFF_FFFF_FFC5).expect("a large odd prime");
assert_eq!(m.get() & 1, 1);
assert!(Odd::<u64>::new(0).is_none()); assert!(Odd::<u64>::new(10).is_none());
}
fn finite_floats() {
let raw = [2.0f64, f64::NAN, 1.0, f64::INFINITY, 0.5];
let mut xs: Vec<Finite<f64>> = raw.iter().copied().filter_map(Finite::<f64>::new).collect();
xs.sort(); let sorted: Vec<f64> = xs.iter().map(|f| f.get()).collect();
assert_eq!(sorted, [0.5, 1.0, 2.0]);
let mut table: BTreeMap<Finite<f64>, &str> = BTreeMap::new();
table.insert(Finite::<f64>::new(1.0).unwrap(), "one");
table.insert(Finite::<f64>::new(2.0).unwrap(), "two");
assert_eq!(table.get(&Finite::<f64>::new(1.0).unwrap()), Some(&"one"));
}
#[cfg(feature = "ct")]
fn constant_time() {
use const_num_traits::CtNonZero;
assert!(bool::from(Odd::<u64>::new_ct(0xABCD_1235).is_some()));
assert!(bool::from(Odd::<u64>::new_ct(0xABCD_1234).is_none()));
assert!(bool::from(42u32.into_nonzero_ct().is_some()));
assert!(bool::from(0u32.into_nonzero_ct().is_none()));
}
fn main() {
power_of_two();
bit_index();
nonzero_division();
signed_range();
nonmin();
odd_modulus();
finite_floats();
#[cfg(feature = "ct")]
constant_time();
println!("all typestate examples ran");
}