1 use core::iter::FusedIterator;
2 
3 use crate::traits::{Float, Integer};
4 
5 pub mod f32 {
6     pub const LOG10_2: f32 = 0.301029995663981195213738894724493027_f32;
7     pub const LOG2_10: f32 = 3.32192809488736234787031942948939018_f32;
8 }
9 
10 pub mod f64 {
11     pub const LOG10_2: f64 = 0.301029995663981195213738894724493027_f64;
12     pub const LOG2_10: f64 = 3.32192809488736234787031942948939018_f64;
13 }
14 
15 #[inline]
once_with<A, F: FnOnce() -> A>(gen: F) -> OnceWith<F>16 pub fn once_with<A, F: FnOnce() -> A>(gen: F) -> OnceWith<F> {
17     OnceWith { gen: Some(gen) }
18 }
19 
20 #[derive(Copy, Clone, Debug)]
21 pub struct OnceWith<F> {
22     gen: Option<F>,
23 }
24 
25 impl<A, F: FnOnce() -> A> Iterator for OnceWith<F> {
26     type Item = A;
27 
28     #[inline]
next(&mut self) -> Option<A>29     fn next(&mut self) -> Option<A> {
30         let f = self.gen.take()?;
31         Some(f())
32     }
33 
34     #[inline]
size_hint(&self) -> (usize, Option<usize>)35     fn size_hint(&self) -> (usize, Option<usize>) {
36         self.gen.iter().size_hint()
37     }
38 }
39 
40 impl<A, F: FnOnce() -> A> DoubleEndedIterator for OnceWith<F> {
next_back(&mut self) -> Option<A>41     fn next_back(&mut self) -> Option<A> {
42         self.next()
43     }
44 }
45 
46 impl<A, F: FnOnce() -> A> ExactSizeIterator for OnceWith<F> {
len(&self) -> usize47     fn len(&self) -> usize {
48         self.gen.iter().len()
49     }
50 }
51 
52 impl<A, F: FnOnce() -> A> FusedIterator for OnceWith<F> {}
53 
54 pub trait float_v1_43: Float {
55     const RADIX: u32;
56     const MANTISSA_DIGITS: u32;
57     const DIGITS: u32;
58     const EPSILON: Self;
59     const MIN: Self;
60     const MIN_POSITIVE: Self;
61     const MAX: Self;
62     const MIN_EXP: i32;
63     const MAX_EXP: i32;
64     const MIN_10_EXP: i32;
65     const MAX_10_EXP: i32;
66     const NAN: Self;
67     const INFINITY: Self;
68     const NEG_INFINITY: Self;
69 }
70 
71 impl float_v1_43 for f32 {
72     const DIGITS: u32 = 6;
73     const EPSILON: f32 = 1.19209290e-07_f32;
74     const INFINITY: f32 = 1.0_f32 / 0.0_f32;
75     const MANTISSA_DIGITS: u32 = 24;
76     const MAX: f32 = 3.40282347e+38_f32;
77     const MAX_10_EXP: i32 = 38;
78     const MAX_EXP: i32 = 128;
79     const MIN: f32 = -3.40282347e+38_f32;
80     const MIN_10_EXP: i32 = -37;
81     const MIN_EXP: i32 = -125;
82     const MIN_POSITIVE: f32 = 1.17549435e-38_f32;
83     const NAN: f32 = 0.0_f32 / 0.0_f32;
84     const NEG_INFINITY: f32 = -1.0_f32 / 0.0_f32;
85     const RADIX: u32 = 2;
86 }
87 
88 impl float_v1_43 for f64 {
89     const DIGITS: u32 = 15;
90     const EPSILON: f64 = 2.2204460492503131e-16_f64;
91     const INFINITY: f64 = 1.0_f64 / 0.0_f64;
92     const MANTISSA_DIGITS: u32 = 53;
93     const MAX: f64 = 1.7976931348623157e+308_f64;
94     const MAX_10_EXP: i32 = 308;
95     const MAX_EXP: i32 = 1024;
96     const MIN: f64 = -1.7976931348623157e+308_f64;
97     const MIN_10_EXP: i32 = -307;
98     const MIN_EXP: i32 = -1021;
99     const MIN_POSITIVE: f64 = 2.2250738585072014e-308_f64;
100     const NAN: f64 = 0.0_f64 / 0.0_f64;
101     const NEG_INFINITY: f64 = -1.0_f64 / 0.0_f64;
102     const RADIX: u32 = 2;
103 }
104 
105 pub trait int_v1_43: Integer {
106     const MIN: Self;
107     const MAX: Self;
108 }
109 
110 macro_rules! impl_int_v1_43 {
111     ($($signed_type:ty, $unsigned_type:ty),*) => {$(
112         impl int_v1_43 for $signed_type {
113             const MIN: Self = !0 ^ ((!0 as $unsigned_type) >> 1) as Self;
114             const MAX: Self = !Self::MIN;
115         }
116 
117         impl int_v1_43 for $unsigned_type {
118             const MIN: Self = 0;
119             const MAX: Self = !0;
120         }
121     )*}
122 }
123 
124 impl_int_v1_43![
125     i8, u8, i16, u16, i32, u32, i64, u64, i128, u128, isize, usize
126 ];
127