nessa/algorithms/
integer_ext.rs

1use malachite::integer::random::uniform_random_integer_range;
2use malachite::Integer;
3use malachite::rounding_modes::RoundingMode;
4use malachite::num::conversion::traits::{RoundingFrom, SaturatingInto};
5use rand::RngCore;
6
7lazy_static! {
8    pub static ref ZERO: Integer = Integer::from(0);
9    pub static ref ONE: Integer = Integer::from(1);
10    pub static ref BYTE_MAX: Integer = Integer::from(255);
11    pub static ref USIZE_MAX: Integer = Integer::from(usize::MAX);
12    pub static ref U64_MAX: Integer = Integer::from(u64::MAX);
13}
14
15pub fn to_f64(n: &Integer) -> f64 {
16    f64::rounding_from(n, RoundingMode::Exact).0
17}
18
19pub fn to_usize(n: &Integer) -> usize {
20    n.saturating_into()
21}
22
23pub fn to_u32(n: &Integer) -> u32 {
24    n.saturating_into()
25}
26
27pub fn to_u64(n: &Integer) -> u64 {
28    n.saturating_into()
29}
30
31pub fn to_u8(n: &Integer) -> u8 {
32    n.saturating_into()
33}
34
35pub fn is_valid_index(n: &Integer) -> bool {
36    *n >= *ZERO && *n <= *USIZE_MAX
37}
38
39pub fn is_valid_byte(n: &Integer) -> bool {
40    *n >= *ZERO && *n <= *BYTE_MAX
41}
42
43pub fn truncate(n: &Integer) -> Integer {
44    n & &*U64_MAX
45}
46
47pub fn randint(f: Integer, t: Integer) -> Integer {
48    let mut bytes = [0; 32];
49    rand::thread_rng().fill_bytes(&mut bytes);
50    let s = malachite::random::Seed { bytes };
51
52    let mut r = uniform_random_integer_range(s, f, t);
53    r.next().unwrap()
54}