Coverage Report

Created: 2026-04-29 06:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs
Line
Count
Source
1
//! Utilities for Rust numbers.
2
//!
3
//! These traits define useful properties, methods, associated
4
//! types, and trait bounds, and conversions for working with
5
//! numbers in generic code.
6
7
use core::{fmt, mem, ops};
8
9
#[cfg(feature = "f16")]
10
use crate::bf16::bf16;
11
#[cfg(feature = "f16")]
12
use crate::f16::f16;
13
#[cfg(all(not(feature = "std"), any(feature = "parse-floats", feature = "write-floats")))]
14
use crate::libm;
15
16
// AS PRIMITIVE
17
// ------------
18
19
/// Type that can be converted to [`primitive`] values with `as`.
20
///
21
/// [`primitive`]: https://doc.rust-lang.org/rust-by-example/primitives.html
22
pub trait AsPrimitive: Copy + PartialEq + PartialOrd + Send + Sync + Sized {
23
    /// Convert the value to a [`u8`], as if by `value as u8`.
24
    fn as_u8(self) -> u8;
25
26
    /// Convert the value to a [`u16`], as if by `value as u16`.
27
    fn as_u16(self) -> u16;
28
29
    /// Convert the value to a [`u32`], as if by `value as u32`.
30
    fn as_u32(self) -> u32;
31
32
    /// Convert the value to a [`u64`], as if by `value as u64`.
33
    fn as_u64(self) -> u64;
34
35
    /// Convert the value to a [`u128`], as if by `value as u128`.
36
    fn as_u128(self) -> u128;
37
38
    /// Convert the value to a [`usize`], as if by `value as usize`.
39
    fn as_usize(self) -> usize;
40
41
    /// Convert the value to an [`i8`], as if by `value as i8`.
42
    fn as_i8(self) -> i8;
43
44
    /// Convert the value to an [`i16`], as if by `value as i16`.
45
    fn as_i16(self) -> i16;
46
47
    /// Convert the value to an [`i32`], as if by `value as i32`.
48
    fn as_i32(self) -> i32;
49
50
    /// Convert the value to an [`i64`], as if by `value as i64`.
51
    fn as_i64(self) -> i64;
52
53
    /// Convert the value to an [`i128`], as if by `value as i128`.
54
    fn as_i128(self) -> i128;
55
56
    /// Convert the value to an [`isize`], as if by `value as isize`.
57
    fn as_isize(self) -> isize;
58
59
    /// Convert the value to an [`f32`], as if by `value as f32`.
60
    fn as_f32(self) -> f32;
61
62
    /// Convert the value to an [`f64`], as if by `value as f64`.
63
    fn as_f64(self) -> f64;
64
65
    /// Convert the value from a [`u32`], as if by `value as _`.
66
    fn from_u32(value: u32) -> Self;
67
68
    /// Convert the value from a [`u64`], as if by `value as _`.
69
    fn from_u64(value: u64) -> Self;
70
71
    /// Convert the value to an [`struct@f16`], identical to `value as f16`
72
    /// if [`struct@f16`] was a primitive type.
73
    #[cfg(feature = "f16")]
74
    fn as_f16(self) -> f16;
75
76
    /// Convert the value to an [`struct@bf16`], identical to `value as bf16`
77
    /// if [`struct@bf16`] was a primitive type.
78
    #[cfg(feature = "f16")]
79
    fn as_bf16(self) -> bf16;
80
}
81
82
macro_rules! as_primitive {
83
    ($($t:ty)*) => ($(
84
        impl AsPrimitive for $t {
85
            #[inline(always)]
86
0
            fn as_u8(self) -> u8 {
87
0
                self as u8
88
0
            }
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_u8
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_u8
89
90
            #[inline(always)]
91
0
            fn as_u16(self) -> u16 {
92
0
                self as u16
93
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_u16
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_u16
94
95
            #[inline(always)]
96
0
            fn as_u32(self) -> u32 {
97
0
                self as u32
98
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_u32
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_u32
99
100
            #[inline(always)]
101
22.3k
            fn as_u64(self) -> u64 {
102
22.3k
                self as u64
103
22.3k
            }
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_u64
<u64 as lexical_util::num::AsPrimitive>::as_u64
Line
Count
Source
101
22.3k
            fn as_u64(self) -> u64 {
102
22.3k
                self as u64
103
22.3k
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_u64
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_u64
104
105
            #[inline(always)]
106
0
            fn as_u128(self) -> u128 {
107
0
                self as u128
108
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_u128
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_u128
109
110
            #[inline(always)]
111
0
            fn as_usize(self) -> usize {
112
0
                self as usize
113
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_usize
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_usize
114
115
            #[inline(always)]
116
0
            fn as_i8(self) -> i8 {
117
0
                self as i8
118
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_i8
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_i8
119
120
            #[inline(always)]
121
0
            fn as_i16(self) -> i16 {
122
0
                self as i16
123
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_i16
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_i16
124
125
            #[inline(always)]
126
168k
            fn as_i32(self) -> i32 {
127
19.8k
                self as i32
128
168k
            }
<u32 as lexical_util::num::AsPrimitive>::as_i32
Line
Count
Source
126
148k
            fn as_i32(self) -> i32 {
127
148k
                self as i32
128
148k
            }
<u64 as lexical_util::num::AsPrimitive>::as_i32
Line
Count
Source
126
338
            fn as_i32(self) -> i32 {
127
338
                self as i32
128
338
            }
<i32 as lexical_util::num::AsPrimitive>::as_i32
Line
Count
Source
126
19.8k
            fn as_i32(self) -> i32 {
127
19.8k
                self as i32
128
19.8k
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_i32
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_i32
129
130
            #[inline(always)]
131
0
            fn as_i64(self) -> i64 {
132
0
                self as i64
133
0
            }
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_i64
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_i64
134
135
            #[inline(always)]
136
0
            fn as_i128(self) -> i128 {
137
0
                self as i128
138
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_i128
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_i128
139
140
            #[inline(always)]
141
0
            fn as_isize(self) -> isize {
142
0
                self as isize
143
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_isize
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_isize
144
145
            #[inline(always)]
146
0
            fn as_f32(self) -> f32 {
147
0
                self as f32
148
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_f32
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_f32
149
150
            #[inline(always)]
151
2.32k
            fn as_f64(self) -> f64 {
152
0
                self as f64
153
2.32k
            }
<u64 as lexical_util::num::AsPrimitive>::as_f64
Line
Count
Source
151
2.32k
            fn as_f64(self) -> f64 {
152
2.32k
                self as f64
153
2.32k
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::as_f64
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::as_f64
154
155
            #[inline(always)]
156
0
            fn from_u32(value: u32) -> Self {
157
0
                value as Self
158
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::from_u32
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::from_u32
159
160
            #[inline(always)]
161
0
            fn from_u64(value: u64) -> Self {
162
0
                value as Self
163
0
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <u16 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <u32 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <u64 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <u128 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <usize as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <i8 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <i16 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <i32 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <i64 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <i128 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <isize as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <f32 as lexical_util::num::AsPrimitive>::from_u64
Unexecuted instantiation: <f64 as lexical_util::num::AsPrimitive>::from_u64
164
165
            #[cfg(feature = "f16")]
166
            #[inline(always)]
167
            fn as_f16(self) -> f16 {
168
                f16::from_f32(self as f32)
169
            }
170
171
            #[cfg(feature = "f16")]
172
            #[inline(always)]
173
            fn as_bf16(self) -> bf16 {
174
                bf16::from_f32(self as f32)
175
            }
176
        }
177
    )*)
178
}
179
180
as_primitive! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize f32 f64 }
181
182
#[cfg(feature = "f16")]
183
macro_rules! half_as_primitive {
184
    ($($t:ty)*) => ($(
185
        impl AsPrimitive for $t {
186
            #[inline(always)]
187
            fn as_u8(self) -> u8 {
188
                self.as_f32() as u8
189
            }
190
191
            #[inline(always)]
192
            fn as_u16(self) -> u16 {
193
                self.as_f32() as u16
194
            }
195
196
            #[inline(always)]
197
            fn as_u32(self) -> u32 {
198
                self.as_f32() as u32
199
            }
200
201
            #[inline(always)]
202
            fn as_u64(self) -> u64 {
203
                self.as_f32() as u64
204
            }
205
206
            #[inline(always)]
207
            fn as_u128(self) -> u128 {
208
                self.as_f32() as u128
209
            }
210
211
            #[inline(always)]
212
            fn as_usize(self) -> usize {
213
                self.as_f32() as usize
214
            }
215
216
            #[inline(always)]
217
            fn as_i8(self) -> i8 {
218
                self.as_f32() as i8
219
            }
220
221
            #[inline(always)]
222
            fn as_i16(self) -> i16 {
223
                self.as_f32() as i16
224
            }
225
226
            #[inline(always)]
227
            fn as_i32(self) -> i32 {
228
                self.as_f32() as i32
229
            }
230
231
            #[inline(always)]
232
            fn as_i64(self) -> i64 {
233
                self.as_f32() as i64
234
            }
235
236
            #[inline(always)]
237
            fn as_i128(self) -> i128 {
238
                self.as_f32() as i128
239
            }
240
241
            #[inline(always)]
242
            fn as_isize(self) -> isize {
243
                self.as_f32() as isize
244
            }
245
246
            #[inline(always)]
247
            fn as_f32(self) -> f32 {
248
                self.as_f32() as f32
249
            }
250
251
            #[inline(always)]
252
            fn as_f64(self) -> f64 {
253
                self.as_f32() as f64
254
            }
255
256
            #[inline(always)]
257
            #[allow(clippy::as_underscore)] // reason="intentionally used in a generic sense"
258
            fn from_u32(value: u32) -> Self {
259
                Self::from_f32(value as _)
260
            }
261
262
            #[inline(always)]
263
            fn from_u64(value: u64) -> Self {
264
                _ = value;
265
                unimplemented!()
266
            }
267
268
            #[inline(always)]
269
            fn as_f16(self) -> f16 {
270
                f16::from_f32(self.as_f32())
271
            }
272
273
            #[inline(always)]
274
            fn as_bf16(self) -> bf16 {
275
                bf16::from_f32(self.as_f32())
276
            }
277
        }
278
    )*)
279
}
280
281
#[cfg(feature = "f16")]
282
half_as_primitive! { f16 bf16 }
283
284
// AS CAST
285
// -------
286
287
/// An interface for casting between machine scalars, as if `as` was used.
288
///
289
/// All values that the type can be cast to must be [`primitive`] values.
290
///
291
/// [`primitive`]: https://doc.rust-lang.org/rust-by-example/primitives.html
292
pub trait AsCast: AsPrimitive {
293
    /// Creates a number from another value that can be converted into
294
    /// a primitive via the [`AsPrimitive`] trait.
295
    ///
296
    /// # Examples
297
    ///
298
    /// ```rust
299
    /// use lexical_util::num::AsCast;
300
    ///
301
    /// assert_eq!(u8::as_cast(256u16), 256u16 as u8); // 0
302
    /// ```
303
    fn as_cast<N: AsPrimitive>(n: N) -> Self;
304
}
305
306
/// Allows the high-level conversion of generic types as if `as` was used.
307
///
308
/// # Examples
309
///
310
/// ```rust
311
/// use lexical_util::num::as_cast;
312
///
313
/// assert_eq!(as_cast::<u8, u16>(256u16), 256u16 as u8); // 0
314
/// ```
315
#[inline(always)]
316
168k
pub fn as_cast<U: AsCast, T: AsCast>(t: T) -> U {
317
168k
    U::as_cast(t)
318
168k
}
Unexecuted instantiation: lexical_util::num::as_cast::<u8, u32>
lexical_util::num::as_cast::<i32, u32>
Line
Count
Source
316
148k
pub fn as_cast<U: AsCast, T: AsCast>(t: T) -> U {
317
148k
    U::as_cast(t)
318
148k
}
Unexecuted instantiation: lexical_util::num::as_cast::<i64, u32>
Unexecuted instantiation: lexical_util::num::as_cast::<u64, u32>
Unexecuted instantiation: lexical_util::num::as_cast::<u8, u8>
lexical_util::num::as_cast::<i32, i32>
Line
Count
Source
316
19.5k
pub fn as_cast<U: AsCast, T: AsCast>(t: T) -> U {
317
19.5k
    U::as_cast(t)
318
19.5k
}
Unexecuted instantiation: lexical_util::num::as_cast::<i64, i64>
Unexecuted instantiation: lexical_util::num::as_cast::<u64, u64>
Unexecuted instantiation: lexical_util::num::as_cast::<_, _>
319
320
macro_rules! as_cast {
321
    ($($t:ty, $meth:ident ; )*) => ($(
322
        impl AsCast for $t {
323
            #[inline(always)]
324
            #[allow(clippy::as_underscore)] // reason="intentional due to generic API"
325
191k
            fn as_cast<N: AsPrimitive>(n: N) -> $t {
326
191k
                n.$meth() as _
327
191k
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsCast>::as_cast::<u32>
Unexecuted instantiation: <u64 as lexical_util::num::AsCast>::as_cast::<u32>
<i32 as lexical_util::num::AsCast>::as_cast::<u32>
Line
Count
Source
325
148k
            fn as_cast<N: AsPrimitive>(n: N) -> $t {
326
148k
                n.$meth() as _
327
148k
            }
Unexecuted instantiation: <i64 as lexical_util::num::AsCast>::as_cast::<u32>
<f64 as lexical_util::num::AsCast>::as_cast::<u64>
Line
Count
Source
325
2.32k
            fn as_cast<N: AsPrimitive>(n: N) -> $t {
326
2.32k
                n.$meth() as _
327
2.32k
            }
<u64 as lexical_util::num::AsCast>::as_cast::<u64>
Line
Count
Source
325
20.2k
            fn as_cast<N: AsPrimitive>(n: N) -> $t {
326
20.2k
                n.$meth() as _
327
20.2k
            }
Unexecuted instantiation: <u8 as lexical_util::num::AsCast>::as_cast::<u8>
Unexecuted instantiation: <u8 as lexical_util::num::AsCast>::as_cast::<u64>
<i32 as lexical_util::num::AsCast>::as_cast::<i32>
Line
Count
Source
325
19.5k
            fn as_cast<N: AsPrimitive>(n: N) -> $t {
326
19.5k
                n.$meth() as _
327
19.5k
            }
<i32 as lexical_util::num::AsCast>::as_cast::<u64>
Line
Count
Source
325
338
            fn as_cast<N: AsPrimitive>(n: N) -> $t {
326
338
                n.$meth() as _
327
338
            }
Unexecuted instantiation: <i64 as lexical_util::num::AsCast>::as_cast::<i64>
Unexecuted instantiation: <i64 as lexical_util::num::AsCast>::as_cast::<u64>
Unexecuted instantiation: <u8 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <u16 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <u32 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <u64 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <u128 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <usize as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <i8 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <i16 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <i32 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <i64 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <i128 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <isize as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <f32 as lexical_util::num::AsCast>::as_cast::<_>
Unexecuted instantiation: <f64 as lexical_util::num::AsCast>::as_cast::<_>
328
        }
329
    )*);
330
}
331
332
as_cast!(
333
    u8, as_u8 ;
334
    u16, as_u16 ;
335
    u32, as_u32 ;
336
    u64, as_u64 ;
337
    u128, as_u128 ;
338
    usize, as_usize ;
339
    i8, as_i8 ;
340
    i16, as_i16 ;
341
    i32, as_i32 ;
342
    i64, as_i64 ;
343
    i128, as_i128 ;
344
    isize, as_isize ;
345
    f32, as_f32 ;
346
    f64, as_f64 ;
347
);
348
349
#[cfg(feature = "f16")]
350
as_cast!(
351
    f16, as_f16 ;
352
    bf16, as_bf16 ;
353
);
354
355
// PRIMITIVE
356
// ---------
357
358
/// The base trait for all [`primitive`] types.
359
///
360
/// [`primitive`]: https://doc.rust-lang.org/rust-by-example/primitives.html
361
pub trait Primitive: 'static + fmt::Debug + fmt::Display + AsCast {}
362
363
macro_rules! primitive {
364
    ($($t:ty)*) => ($(
365
        impl Primitive for $t {}
366
    )*)
367
}
368
369
primitive! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize f32 f64 }
370
371
#[cfg(feature = "f16")]
372
primitive! { f16 bf16 }
373
374
// NUMBER
375
// ------
376
377
/// The base trait for all numbers (integers and floating-point numbers).
378
pub trait Number:
379
    Default +
380
    Primitive +
381
    // Operations
382
    ops::Add<Output=Self> +
383
    ops::AddAssign +
384
    ops::Div<Output=Self> +
385
    ops::DivAssign +
386
    ops::Mul<Output=Self> +
387
    ops::MulAssign +
388
    ops::Rem<Output=Self> +
389
    ops::RemAssign +
390
    ops::Sub<Output=Self> +
391
    ops::SubAssign
392
{
393
    /// If the number can hold negative values.
394
    const IS_SIGNED: bool;
395
}
396
397
macro_rules! number_impl {
398
    ($($t:tt $is_signed:literal ; )*) => ($(
399
        impl Number for $t {
400
            const IS_SIGNED: bool = $is_signed;
401
        }
402
    )*)
403
}
404
405
number_impl! {
406
    u8 false ;
407
    u16 false ;
408
    u32 false ;
409
    u64 false ;
410
    u128 false ;
411
    usize false ;
412
    i8 true ;
413
    i16 true ;
414
    i32 true ;
415
    i64 true ;
416
    i128 true ;
417
    isize true ;
418
    f32 true ;
419
    f64 true ;
420
    // f128 true
421
}
422
423
#[cfg(feature = "f16")]
424
number_impl! {
425
    f16 true ;
426
    bf16 true ;
427
}
428
429
// INTEGER
430
// -------
431
432
/// The base trait for all signed and unsigned [`integers`].
433
///
434
/// [`integers`]: https://en.wikipedia.org/wiki/Integer_(computer_science)
435
pub trait Integer:
436
    // Basic
437
    Number + Eq + Ord +
438
    // Operations
439
    ops::BitAnd<Output=Self> +
440
    ops::BitAndAssign +
441
    ops::BitOr<Output=Self> +
442
    ops::BitOrAssign +
443
    ops::BitXor<Output=Self> +
444
    ops::BitXorAssign +
445
    ops::Not<Output=Self> +
446
    ops::Shl<Self, Output=Self> +
447
    ops::Shl<i32, Output=Self> +
448
    ops::ShlAssign<i32> +
449
    ops::Shr<i32, Output=Self> +
450
    ops::ShrAssign<i32> +
451
{
452
    // CONSTANTS
453
    /// A value equal to `0`.
454
    const ZERO: Self;
455
456
    /// A value equal to `1`.
457
    const ONE: Self;
458
459
    /// A value equal to `2`.
460
    const TWO: Self;
461
462
    /// The largest value that can be represented by this integer type.
463
    ///
464
    /// See [`u32::MAX`].
465
    const MAX: Self;
466
467
    /// The smallest value that can be represented by this integer type.
468
    ///
469
    /// See [`u32::MIN`].
470
    const MIN: Self;
471
472
    /// The size of this integer type in bits.
473
    ///
474
    /// See [`u32::BITS`].
475
    const BITS: usize;
476
477
    // FUNCTIONS (INHERITED)
478
    /// Returns the number of leading zeros in the binary representation
479
    /// of `self`.
480
    ///
481
    /// See [`u32::leading_zeros`].
482
    fn leading_zeros(self) -> u32;
483
484
    /// Returns the number of trailing zeros in the binary representation
485
    /// of `self`.
486
    ///
487
    /// See [`u32::trailing_zeros`].
488
    fn trailing_zeros(self) -> u32;
489
490
    /// Raises self to the power of `exp`, using exponentiation by squaring.
491
    ///
492
    /// See [`u32::pow`].
493
    fn pow(self, exp: u32) -> Self;
494
495
    /// Checked exponentiation. Computes `self.pow(exp)`, returning
496
    /// `None` if overflow occurred.
497
    ///
498
    /// See [`u32::checked_pow`].
499
    fn checked_pow(self, exp: u32) -> Option<Self>;
500
501
    /// Raises self to the power of `exp`, using exponentiation by squaring.
502
    ///
503
    /// Returns a tuple of the exponentiation along with a bool indicating
504
    /// whether an overflow happened.
505
    ///
506
    /// See [`u32::overflowing_pow`].
507
    fn overflowing_pow(self, exp: u32) -> (Self, bool);
508
509
    /// Checked integer addition. Computes `self + i`, returning `None` if
510
    /// overflow occurred.
511
    ///
512
    /// See [`u32::checked_add`].
513
    fn checked_add(self, i: Self) -> Option<Self>;
514
515
    /// Checked integer subtraction. Computes `self - i`, returning `None`
516
    /// if overflow occurred.
517
    ///
518
    /// See [`u32::checked_sub`].
519
    fn checked_sub(self, i: Self) -> Option<Self>;
520
521
    /// Checked integer multiplication. Computes `self * rhs`, returning `None`
522
    /// if overflow occurred.
523
    ///
524
    /// See [`u32::checked_mul`].
525
    fn checked_mul(self, i: Self) -> Option<Self>;
526
527
    /// Calculates `self + i`.
528
    ///
529
    /// Returns a tuple of the addition along with a boolean indicating whether
530
    /// an arithmetic overflow would occur. If an overflow would have occurred
531
    /// then the wrapped value is returned. See [`u32::overflowing_add`].
532
    fn overflowing_add(self, i: Self) -> (Self, bool);
533
534
    /// Calculates `self - i`.
535
    ///
536
    /// Returns a tuple of the addition along with a boolean indicating whether
537
    /// an arithmetic overflow would occur. If an overflow would have occurred
538
    /// then the wrapped value is returned. See [`u32::overflowing_sub`].
539
    fn overflowing_sub(self, i: Self) -> (Self, bool);
540
541
    /// Calculates `self * i`.
542
    ///
543
    /// Returns a tuple of the addition along with a boolean indicating whether
544
    /// an arithmetic overflow would occur. If an overflow would have occurred
545
    /// then the wrapped value is returned. See [`u32::overflowing_mul`].
546
    fn overflowing_mul(self, i: Self) -> (Self, bool);
547
548
    /// Wrapping (modular) addition. Computes `self + i`, wrapping around at
549
    /// the boundary of the type.
550
    ///
551
    /// See [`u32::wrapping_add`].
552
    fn wrapping_add(self, i: Self) -> Self;
553
554
    /// Wrapping (modular) subtraction. Computes `self - i`, wrapping around at
555
    /// the boundary of the type.
556
    ///
557
    /// See [`u32::wrapping_sub`].
558
    fn wrapping_sub(self, i: Self) -> Self;
559
560
    /// Wrapping (modular) multiplication. Computes `self * i`, wrapping around at
561
    /// the boundary of the type.
562
    ///
563
    /// See [`u32::wrapping_mul`].
564
    fn wrapping_mul(self, i: Self) -> Self;
565
566
    /// Wrapping (modular) negation. Computes `-self`, wrapping around at
567
    /// the boundary of the type.
568
    ///
569
    /// See [`u32::wrapping_neg`].
570
    fn wrapping_neg(self) -> Self;
571
572
    /// Saturating integer addition. Computes `self + i`, saturating at the
573
    /// numeric bounds instead of overflowing.
574
    ///
575
    /// See [`u32::saturating_add`].
576
    fn saturating_add(self, i: Self) -> Self;
577
578
    /// Saturating integer subtraction. Computes `self - i`, saturating at the
579
    /// numeric bounds instead of overflowing.
580
    ///
581
    /// See [`u32::saturating_sub`].
582
    fn saturating_sub(self, i: Self) -> Self;
583
584
    /// Saturating integer multiplication. Computes `self * i`, saturating at
585
    /// the numeric bounds instead of overflowing.
586
    ///
587
    /// See [`u32::saturating_mul`].
588
    fn saturating_mul(self, i: Self) -> Self;
589
590
    /// Get the fast ceiling of the quotient from integer division.
591
    ///
592
    /// The remainder may wrap to the numerical boundaries for the type.
593
    /// See [`u32::div_ceil`].
594
    ///
595
    /// # Examples
596
    ///
597
    /// ```rust
598
    /// use lexical_util::num::Integer;
599
    ///
600
    /// assert_eq!(250u16.ceil_divmod(10), (25, 0));
601
    /// assert_eq!(256u16.ceil_divmod(10), (26, -4));
602
    /// assert_eq!(i32::MAX.ceil_divmod(-2), (-0x3FFFFFFE, 3));
603
    ///
604
    /// // notice how `-1` wraps since `i32` cannot hold `i128::MAX`.
605
    /// assert_eq!((i128::MAX - 1).ceil_divmod(i128::MAX), (1, -1));
606
    /// ```
607
    #[inline(always)]
608
0
    fn ceil_divmod(self, y: Self) -> (Self, i32) {
609
0
        let q = self / y;
610
0
        let r = self % y;
611
0
        match r == Self::ZERO {
612
0
            true  => (q, i32::as_cast(r)),
613
0
            false => (q + Self::ONE, i32::as_cast(r) - i32::as_cast(y))
614
        }
615
0
    }
616
617
    /// Get the fast ceiling of the quotient from integer division.
618
    ///
619
    /// This is identical to [`u32::div_ceil`].
620
    ///
621
    /// # Examples
622
    ///
623
    /// ```rust
624
    /// use lexical_util::num::Integer;
625
    ///
626
    /// assert_eq!(250u16.ceil_div(10), 25);
627
    /// assert_eq!(256u16.ceil_div(10), 26);
628
    /// assert_eq!(i32::MAX.ceil_div(-2), -0x3FFFFFFE);
629
    /// assert_eq!((i128::MAX - 1).ceil_div(i128::MAX), 1);
630
    /// ```
631
    #[inline(always)]
632
0
    fn ceil_div(self, y: Self) -> Self {
633
0
        self.ceil_divmod(y).0
634
0
    }
635
636
    /// Get the fast ceiling modulus from integer division.
637
    ///
638
    /// The remainder is not guaranteed to be valid since it can
639
    /// overflow if the remainder is not 0. See [`Self::ceil_divmod`].
640
    ///
641
    /// # Examples
642
    ///
643
    /// ```rust
644
    /// use lexical_util::num::Integer;
645
    ///
646
    /// assert_eq!(250u16.ceil_mod(10), 0);
647
    /// assert_eq!(256u16.ceil_mod(10), -4);
648
    /// assert_eq!(i32::MAX.ceil_mod(-2), 3);
649
    ///
650
    /// // notice how `-1` wraps since `i32` cannot hold `i128::MAX`.
651
    /// assert_eq!((i128::MAX - 1).ceil_mod(i128::MAX), -1);
652
    /// ```
653
    #[inline(always)]
654
0
    fn ceil_mod(self, y: Self) -> i32 {
655
0
        self.ceil_divmod(y).1
656
0
    }
657
658
    // PROPERTIES
659
660
    /// Get the number of bits in a value.
661
    ///
662
    /// # Examples
663
    ///
664
    /// ```rust
665
    /// use lexical_util::num::Integer;
666
    ///
667
    /// assert_eq!(1u64.bit_length(), 1);
668
    /// assert_eq!(2u64.bit_length(), 2);
669
    /// assert_eq!(3u64.bit_length(), 2);
670
    /// assert_eq!(16u64.bit_length(), 5);
671
    /// ```
672
    #[inline(always)]
673
0
    fn bit_length(self) -> u32 {
674
0
        Self::BITS as u32 - self.leading_zeros()
675
0
    }
676
677
    /// Returns true if the least-significant bit is odd.
678
    #[inline(always)]
679
338
    fn is_odd(self) -> bool {
680
338
        self & Self::ONE == Self::ONE
681
338
    }
<u32 as lexical_util::num::Integer>::is_odd
Line
Count
Source
679
338
    fn is_odd(self) -> bool {
680
338
        self & Self::ONE == Self::ONE
681
338
    }
Unexecuted instantiation: <_ as lexical_util::num::Integer>::is_odd
682
683
    /// Returns true if the least-significant bit is even.
684
    #[inline(always)]
685
338
    fn is_even(self) -> bool {
686
338
        !self.is_odd()
687
338
    }
<u32 as lexical_util::num::Integer>::is_even
Line
Count
Source
685
338
    fn is_even(self) -> bool {
686
338
        !self.is_odd()
687
338
    }
Unexecuted instantiation: <_ as lexical_util::num::Integer>::is_even
688
689
    /// Get the maximum number of digits before the slice will overflow.
690
    ///
691
    /// This is effectively the `floor(log(2^BITS-1, radix))`, but we can
692
    /// try to go a bit lower without worrying too much.
693
    #[inline(always)]
694
19.6k
    fn overflow_digits(radix: u32) -> usize {
695
        // this is heavily optimized for base10 and it's a way under estimate
696
        // that said, it's fast and works.
697
19.6k
        if radix <= 16 {
698
19.6k
            mem::size_of::<Self>() * 2 - Self::IS_SIGNED as usize
699
        } else {
700
            // way under approximation but always works and is fast
701
0
            mem::size_of::<Self>()
702
        }
703
19.6k
    }
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::overflow_digits
<i32 as lexical_util::num::Integer>::overflow_digits
Line
Count
Source
694
19.6k
    fn overflow_digits(radix: u32) -> usize {
695
        // this is heavily optimized for base10 and it's a way under estimate
696
        // that said, it's fast and works.
697
19.6k
        if radix <= 16 {
698
19.6k
            mem::size_of::<Self>() * 2 - Self::IS_SIGNED as usize
699
        } else {
700
            // way under approximation but always works and is fast
701
0
            mem::size_of::<Self>()
702
        }
703
19.6k
    }
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::overflow_digits
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::overflow_digits
Unexecuted instantiation: <_ as lexical_util::num::Integer>::overflow_digits
704
}
705
706
macro_rules! integer_impl {
707
($($t:tt)*) => ($(
708
    impl Integer for $t {
709
        const ZERO: $t = 0;
710
        const ONE: $t = 1;
711
        const TWO: $t = 2;
712
        const MAX: $t = $t::MAX;
713
        const MIN: $t = $t::MIN;
714
        const BITS: usize = $t::BITS as usize;
715
716
        #[inline(always)]
717
0
        fn leading_zeros(self) -> u32 {
718
0
            $t::leading_zeros(self)
719
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <usize as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <isize as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::leading_zeros
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::leading_zeros
720
721
        #[inline(always)]
722
0
        fn trailing_zeros(self) -> u32 {
723
0
            $t::trailing_zeros(self)
724
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <usize as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <isize as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::trailing_zeros
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::trailing_zeros
725
726
        #[inline(always)]
727
15.3k
        fn checked_add(self, i: Self) -> Option<Self> {
728
15.3k
            $t::checked_add(self, i)
729
15.3k
        }
<i32 as lexical_util::num::Integer>::checked_add
Line
Count
Source
727
15.3k
        fn checked_add(self, i: Self) -> Option<Self> {
728
15.3k
            $t::checked_add(self, i)
729
15.3k
        }
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <usize as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <isize as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::checked_add
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::checked_add
730
731
        #[inline(always)]
732
0
        fn checked_sub(self, i: Self) -> Option<Self> {
733
0
            $t::checked_sub(self, i)
734
0
        }
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <usize as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <isize as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::checked_sub
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::checked_sub
735
736
        #[inline(always)]
737
15.4k
        fn checked_mul(self, i: Self) -> Option<Self> {
738
15.4k
            $t::checked_mul(self, i)
739
15.4k
        }
<i32 as lexical_util::num::Integer>::checked_mul
Line
Count
Source
737
15.4k
        fn checked_mul(self, i: Self) -> Option<Self> {
738
15.4k
            $t::checked_mul(self, i)
739
15.4k
        }
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <usize as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <isize as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::checked_mul
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::checked_mul
740
741
        #[inline(always)]
742
0
        fn overflowing_add(self, i: Self) -> (Self, bool) {
743
0
            $t::overflowing_add(self, i)
744
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <usize as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <isize as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::overflowing_add
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::overflowing_add
745
746
        #[inline(always)]
747
0
        fn overflowing_sub(self, i: Self) -> (Self, bool) {
748
0
            $t::overflowing_sub(self, i)
749
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <usize as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <isize as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::overflowing_sub
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::overflowing_sub
750
751
        #[inline(always)]
752
0
        fn overflowing_mul(self, i: Self) -> (Self, bool) {
753
0
            $t::overflowing_mul(self, i)
754
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <usize as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <isize as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::overflowing_mul
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::overflowing_mul
755
756
        #[inline(always)]
757
58.9k
        fn wrapping_add(self, i: Self) -> Self {
758
58.9k
            $t::wrapping_add(self, i)
759
58.9k
        }
<i32 as lexical_util::num::Integer>::wrapping_add
Line
Count
Source
757
58.9k
        fn wrapping_add(self, i: Self) -> Self {
758
58.9k
            $t::wrapping_add(self, i)
759
58.9k
        }
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <usize as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <isize as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::wrapping_add
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::wrapping_add
760
761
        #[inline(always)]
762
0
        fn wrapping_sub(self, i: Self) -> Self {
763
0
            $t::wrapping_sub(self, i)
764
0
        }
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <usize as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <isize as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::wrapping_sub
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::wrapping_sub
765
766
        #[inline(always)]
767
58.9k
        fn wrapping_mul(self, i: Self) -> Self {
768
58.9k
            $t::wrapping_mul(self, i)
769
58.9k
        }
<i32 as lexical_util::num::Integer>::wrapping_mul
Line
Count
Source
767
58.9k
        fn wrapping_mul(self, i: Self) -> Self {
768
58.9k
            $t::wrapping_mul(self, i)
769
58.9k
        }
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <usize as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <isize as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::wrapping_mul
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::wrapping_mul
770
771
        #[inline(always)]
772
0
        fn wrapping_neg(self) -> Self {
773
0
            $t::wrapping_neg(self)
774
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <usize as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <isize as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::wrapping_neg
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::wrapping_neg
775
776
        #[inline(always)]
777
0
        fn pow(self, exp: u32) -> Self {
778
0
            Self::pow(self, exp)
779
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::pow
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::pow
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::pow
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::pow
Unexecuted instantiation: <usize as lexical_util::num::Integer>::pow
Unexecuted instantiation: <isize as lexical_util::num::Integer>::pow
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::pow
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::pow
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::pow
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::pow
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::pow
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::pow
780
781
        #[inline(always)]
782
0
        fn checked_pow(self, exp: u32) -> Option<Self> {
783
0
            Self::checked_pow(self, exp)
784
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <usize as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <isize as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::checked_pow
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::checked_pow
785
786
        #[inline(always)]
787
0
        fn overflowing_pow(self, exp: u32) -> (Self, bool) {
788
0
            Self::overflowing_pow(self, exp)
789
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <usize as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <isize as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::overflowing_pow
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::overflowing_pow
790
791
        #[inline(always)]
792
0
        fn saturating_add(self, i: Self) -> Self {
793
0
            $t::saturating_add(self, i)
794
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <usize as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <isize as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::saturating_add
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::saturating_add
795
796
        #[inline(always)]
797
0
        fn saturating_sub(self, i: Self) -> Self {
798
0
            $t::saturating_sub(self, i)
799
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <usize as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <isize as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::saturating_sub
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::saturating_sub
800
801
        #[inline(always)]
802
0
        fn saturating_mul(self, i: Self) -> Self {
803
0
            $t::saturating_mul(self, i)
804
0
        }
Unexecuted instantiation: <i16 as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <i32 as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <i64 as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <i128 as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <usize as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <isize as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <u8 as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <u16 as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <u32 as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <u64 as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <u128 as lexical_util::num::Integer>::saturating_mul
Unexecuted instantiation: <i8 as lexical_util::num::Integer>::saturating_mul
805
    }
806
)*)
807
}
808
809
integer_impl! { u8 u16 u32 u64 u128 i8 i16 i32 i64 i128 usize isize }
810
811
// SIGNED INTEGER
812
// --------------
813
814
/// The trait for types that support [`signed`] integral operations, that is,
815
/// they can hold negative numbers.
816
///
817
/// [`signed`]: https://en.wikipedia.org/wiki/Integer_(computer_science)#Value_and_representation
818
pub trait SignedInteger: Integer + ops::Neg<Output = Self> {}
819
820
macro_rules! signed_integer_impl {
821
($($t:tt)*) => ($(
822
    impl SignedInteger for $t {}
823
)*)
824
}
825
826
signed_integer_impl! { i8 i16 i32 i64 i128 isize }
827
828
// UNSIGNED INTEGER
829
// ----------------
830
831
/// The trait for types that support [`unsigned`] integral operations, that is,
832
/// they can only hold positive numbers.
833
///
834
/// [`unsigned`]: https://en.wikipedia.org/wiki/Integer_(computer_science)#Value_and_representation
835
pub trait UnsignedInteger: Integer {}
836
837
macro_rules! unsigned_integer_impl {
838
($($t:ty)*) => ($(
839
    impl UnsignedInteger for $t {}
840
)*)
841
}
842
843
unsigned_integer_impl! { u8 u16 u32 u64 u128 usize }
844
845
// FLOAT
846
// -----
847
848
/// The trait for floating-point [`numbers`][`floats`].
849
///
850
/// Floating-point numbers are numbers that may contain a fraction
851
/// and are stored internally as the significant digits and an
852
/// exponent of base 2.
853
///
854
/// [`floats`]: https://en.wikipedia.org/wiki/Floating-point_arithmetic
855
#[cfg(any(feature = "parse-floats", feature = "write-floats"))]
856
pub trait Float: Number + ops::Neg<Output = Self> {
857
    /// Unsigned type of the same size.
858
    type Unsigned: UnsignedInteger;
859
860
    // CONSTANTS
861
862
    /// A value equal to `0`.
863
    const ZERO: Self;
864
865
    /// A value equal to `1`.
866
    const ONE: Self;
867
868
    /// A value equal to `2`.
869
    const TWO: Self;
870
871
    /// Largest finite value.
872
    ///
873
    /// See [`f64::MAX`].
874
    const MAX: Self;
875
876
    /// Smallest finite value.
877
    ///
878
    /// See [`f64::MIN`].
879
    const MIN: Self;
880
881
    /// Infinity (`∞`).
882
    ///
883
    /// See [`f64::INFINITY`].
884
    const INFINITY: Self;
885
886
    /// Negative infinity (`−∞`).
887
    ///
888
    /// See [`f64::NEG_INFINITY`].
889
    const NEG_INFINITY: Self;
890
891
    /// Not a Number (NaN).
892
    ///
893
    /// See [`f64::NAN`].
894
    const NAN: Self;
895
896
    /// The size of this float type in bits.
897
    ///
898
    /// Analogous to [`u32::BITS`].
899
    const BITS: usize;
900
901
    /// Bitmask to extract the sign from the float.
902
    const SIGN_MASK: Self::Unsigned;
903
904
    /// Bitmask to extract the biased exponent, including the hidden bit.
905
    const EXPONENT_MASK: Self::Unsigned;
906
907
    /// Bitmask to extract the hidden bit in the exponent, which is an
908
    /// implicit 1 in the significant digits.
909
    const HIDDEN_BIT_MASK: Self::Unsigned;
910
911
    /// Bitmask to extract the mantissa (significant digits), excluding
912
    /// the hidden bit.
913
    const MANTISSA_MASK: Self::Unsigned;
914
915
    /// Mask to determine if a full-carry occurred (1 in bit above hidden bit).
916
    const CARRY_MASK: Self::Unsigned;
917
918
    // PROPERTIES
919
920
    // The following constants can be calculated as follows:
921
    //  - `INFINITY_BITS`: EXPONENT_MASK
922
    //  - `NEGATIVE_INFINITY_BITS`: INFINITY_BITS | SIGN_MASK
923
    //  - `EXPONENT_BIAS`: `2^(EXPONENT_SIZE-1) - 1 + MANTISSA_SIZE`
924
    //  - `DENORMAL_EXPONENT`: `1 - EXPONENT_BIAS`
925
    //  - `MAX_EXPONENT`: `2^EXPONENT_SIZE - 1 - EXPONENT_BIAS`
926
927
    /// Positive infinity as bits.
928
    const INFINITY_BITS: Self::Unsigned;
929
930
    /// Positive infinity as bits.
931
    const NEGATIVE_INFINITY_BITS: Self::Unsigned;
932
933
    /// The number of bits in the exponent.
934
    const EXPONENT_SIZE: i32;
935
936
    /// Size of the significand (mantissa) without the hidden bit.
937
    const MANTISSA_SIZE: i32;
938
939
    /// Bias of the exponent. See [`exponent bias`].
940
    ///
941
    /// [`exponent bias`]: https://en.wikipedia.org/wiki/Exponent_bias
942
    const EXPONENT_BIAS: i32;
943
944
    /// Exponent portion of a [`denormal`] float.
945
    ///
946
    /// [`denormal`]: https://en.wikipedia.org/wiki/Subnormal_number
947
    const DENORMAL_EXPONENT: i32;
948
949
    /// Maximum (unbiased) exponent value in the float.
950
    const MAX_EXPONENT: i32;
951
952
    // FUNCTIONS (INHERITED)
953
954
    // Re-export the to and from bits methods.
955
956
    /// Raw transmutation to the unsigned integral type.
957
    ///
958
    /// See [`f64::to_bits`].
959
    fn to_bits(self) -> Self::Unsigned;
960
961
    /// Raw transmutation from the unsigned integral type.
962
    ///
963
    /// See [`f64::from_bits`].
964
    fn from_bits(u: Self::Unsigned) -> Self;
965
966
    /// Returns the natural logarithm of the number.
967
    ///
968
    /// See [`f64::ln`].
969
    fn ln(self) -> Self;
970
971
    /// Returns the largest integer less than or equal to `self`.
972
    ///
973
    /// See [`f64::floor`].
974
    fn floor(self) -> Self;
975
976
    /// Returns true if `self` has a positive sign, including `+0.0`,
977
    /// NaNs with positive sign bit and positive infinity.
978
    ///
979
    /// See [`f64::is_sign_positive`].
980
    fn is_sign_positive(self) -> bool;
981
982
    /// Returns true if `self` has a negative sign, including `-0.0`,
983
    /// NaNs with negative sign bit and negative infinity.
984
    ///
985
    /// See [`f64::is_sign_negative`].
986
    fn is_sign_negative(self) -> bool;
987
988
    /// Returns true if the float is [`denormal`].
989
    ///
990
    /// Denormal (subnormal) numbers fall below the range of numbers
991
    /// that can be stored as `mantissa * 2^exp`, and therefore
992
    /// always have the minimum exponent.
993
    ///
994
    /// [`denormal`]: https://en.wikipedia.org/wiki/Subnormal_number
995
    #[inline(always)]
996
676
    fn is_denormal(self) -> bool {
997
676
        self.to_bits() & Self::EXPONENT_MASK == Self::Unsigned::ZERO
998
676
    }
<f64 as lexical_util::num::Float>::is_denormal
Line
Count
Source
996
676
    fn is_denormal(self) -> bool {
997
676
        self.to_bits() & Self::EXPONENT_MASK == Self::Unsigned::ZERO
998
676
    }
Unexecuted instantiation: <_ as lexical_util::num::Float>::is_denormal
999
1000
    /// Returns true if the float is NaN, positive infinity, or negative
1001
    /// infinity.
1002
    #[inline(always)]
1003
0
    fn is_special(self) -> bool {
1004
0
        self.to_bits() & Self::EXPONENT_MASK == Self::EXPONENT_MASK
1005
0
    }
1006
1007
    /// Returns true if the float is NaN.
1008
    #[inline(always)]
1009
0
    fn is_nan(self) -> bool {
1010
0
        self.is_special() && (self.to_bits() & Self::MANTISSA_MASK) != Self::Unsigned::ZERO
1011
0
    }
1012
1013
    /// Returns true if the float is positive or negative infinity.
1014
    #[inline(always)]
1015
0
    fn is_inf(self) -> bool {
1016
0
        self.is_special() && (self.to_bits() & Self::MANTISSA_MASK) == Self::Unsigned::ZERO
1017
0
    }
1018
1019
    /// Returns true if the float's least-significant mantissa bit is odd.
1020
    #[inline(always)]
1021
0
    fn is_odd(self) -> bool {
1022
0
        self.to_bits().is_odd()
1023
0
    }
1024
1025
    /// Returns true if the float's least-significant mantissa bit is even.
1026
    #[inline(always)]
1027
0
    fn is_even(self) -> bool {
1028
0
        !self.is_odd()
1029
0
    }
1030
1031
    /// Returns true if the float needs a negative sign when serializing it.
1032
    ///
1033
    /// This is true if it's `-0.0` or it's below 0 and not NaN. But inf values
1034
    /// need the sign.
1035
    #[inline(always)]
1036
0
    fn needs_negative_sign(self) -> bool {
1037
0
        self.is_sign_negative() && !self.is_nan()
1038
0
    }
1039
1040
    /// Get the unbiased exponent component from the float.
1041
    #[inline(always)]
1042
338
    fn exponent(self) -> i32 {
1043
338
        if self.is_denormal() {
1044
0
            return Self::DENORMAL_EXPONENT;
1045
338
        }
1046
1047
338
        let bits = self.to_bits();
1048
338
        let biased_e = i32::as_cast((bits & Self::EXPONENT_MASK) >> Self::MANTISSA_SIZE).as_i32();
1049
338
        biased_e - Self::EXPONENT_BIAS
1050
338
    }
<f64 as lexical_util::num::Float>::exponent
Line
Count
Source
1042
338
    fn exponent(self) -> i32 {
1043
338
        if self.is_denormal() {
1044
0
            return Self::DENORMAL_EXPONENT;
1045
338
        }
1046
1047
338
        let bits = self.to_bits();
1048
338
        let biased_e = i32::as_cast((bits & Self::EXPONENT_MASK) >> Self::MANTISSA_SIZE).as_i32();
1049
338
        biased_e - Self::EXPONENT_BIAS
1050
338
    }
Unexecuted instantiation: <_ as lexical_util::num::Float>::exponent
1051
1052
    /// Get the mantissa (significand) component from float.
1053
    #[inline(always)]
1054
338
    fn mantissa(self) -> Self::Unsigned {
1055
338
        let bits = self.to_bits();
1056
338
        let s = bits & Self::MANTISSA_MASK;
1057
338
        if !self.is_denormal() {
1058
338
            s + Self::HIDDEN_BIT_MASK
1059
        } else {
1060
0
            s
1061
        }
1062
338
    }
<f64 as lexical_util::num::Float>::mantissa
Line
Count
Source
1054
338
    fn mantissa(self) -> Self::Unsigned {
1055
338
        let bits = self.to_bits();
1056
338
        let s = bits & Self::MANTISSA_MASK;
1057
338
        if !self.is_denormal() {
1058
338
            s + Self::HIDDEN_BIT_MASK
1059
        } else {
1060
0
            s
1061
        }
1062
338
    }
Unexecuted instantiation: <_ as lexical_util::num::Float>::mantissa
1063
1064
    /// Get next greater float.
1065
    ///
1066
    /// # Examples
1067
    ///
1068
    /// ```rust
1069
    /// use lexical_util::num::Float;
1070
    ///
1071
    /// assert_eq!(1f32.next(), 1.0000001);
1072
    /// assert_eq!((-0.0f32).next(), 0.0); // +0.0
1073
    /// assert_eq!(0f32.next(), 1e-45);
1074
    /// ```
1075
    #[inline(always)]
1076
0
    fn next(self) -> Self {
1077
0
        let bits = self.to_bits();
1078
0
        if self.is_sign_negative() && self == Self::ZERO {
1079
            // -0.0
1080
0
            Self::ZERO
1081
0
        } else if bits == Self::INFINITY_BITS {
1082
0
            Self::from_bits(Self::INFINITY_BITS)
1083
0
        } else if self.is_sign_negative() {
1084
0
            Self::from_bits(bits.saturating_sub(Self::Unsigned::ONE))
1085
        } else {
1086
0
            Self::from_bits(bits.saturating_add(Self::Unsigned::ONE))
1087
        }
1088
0
    }
1089
1090
    /// Get next greater float for a positive float.
1091
    ///
1092
    /// Value must be >= 0.0 and < INFINITY.
1093
    #[inline(always)]
1094
0
    fn next_positive(self) -> Self {
1095
0
        debug_assert!(self.is_sign_positive() && !self.is_inf());
1096
0
        Self::from_bits(self.to_bits() + Self::Unsigned::ONE)
1097
0
    }
1098
1099
    /// Get previous greater float, such that `self.prev().next() == self`.
1100
    ///
1101
    /// # Examples
1102
    ///
1103
    /// ```rust
1104
    /// use lexical_util::num::Float;
1105
    ///
1106
    /// assert_eq!(1f32.prev(), 0.99999994);
1107
    /// assert_eq!(0.0f32.prev(), 0.0); // -0.0
1108
    /// assert_eq!((-0.0f32).prev(), -1e-45);
1109
    /// ```
1110
    #[inline(always)]
1111
0
    fn prev(self) -> Self {
1112
0
        let bits = self.to_bits();
1113
0
        if self.is_sign_positive() && self == Self::ZERO {
1114
            // +0.0
1115
0
            -Self::ZERO
1116
0
        } else if bits == Self::NEGATIVE_INFINITY_BITS {
1117
0
            Self::from_bits(Self::NEGATIVE_INFINITY_BITS)
1118
0
        } else if self.is_sign_negative() {
1119
0
            Self::from_bits(bits.saturating_add(Self::Unsigned::ONE))
1120
        } else {
1121
0
            Self::from_bits(bits.saturating_sub(Self::Unsigned::ONE))
1122
        }
1123
0
    }
1124
1125
    /// Get previous greater float for a positive float.
1126
    /// Value must be > 0.0.
1127
    #[inline(always)]
1128
0
    fn prev_positive(self) -> Self {
1129
0
        debug_assert!(self.is_sign_positive() && self != Self::ZERO);
1130
0
        Self::from_bits(self.to_bits() - Self::Unsigned::ONE)
1131
0
    }
1132
1133
    /// Round a positive number to even.
1134
    #[inline(always)]
1135
0
    fn round_positive_even(self) -> Self {
1136
0
        if self.mantissa().is_odd() {
1137
0
            self.next_positive()
1138
        } else {
1139
0
            self
1140
        }
1141
0
    }
1142
1143
    /// Get the max of two finite numbers.
1144
    ///
1145
    /// This assumes that both floats form a [`total ord`],
1146
    /// that is, `x < y` is always `y >= x`. Non-finite floats,
1147
    /// such as NaN, break this criteria, but finite floats enable
1148
    /// simpler (and faster) comparison criteria while remaining
1149
    /// accurate.
1150
    ///
1151
    /// [`total ord`]: https://doc.rust-lang.org/std/cmp/trait.Ord.html
1152
    #[inline(always)]
1153
0
    fn max_finite(self, f: Self) -> Self {
1154
0
        debug_assert!(!self.is_special() && !f.is_special(), "max_finite self={} f={}", self, f);
1155
0
        if self < f {
1156
0
            f
1157
        } else {
1158
0
            self
1159
        }
1160
0
    }
1161
1162
    /// Get the min of two finite numbers.
1163
    ///
1164
    /// This assumes that both floats form a [`total ord`],
1165
    /// that is, `x < y` is always `y >= x`. Non-finite floats,
1166
    /// such as NaN, break this criteria, but finite floats enable
1167
    /// simpler (and faster) comparison criteria while remaining
1168
    /// accurate.
1169
    ///
1170
    /// [`total ord`]: https://doc.rust-lang.org/std/cmp/trait.Ord.html
1171
    #[inline(always)]
1172
0
    fn min_finite(self, f: Self) -> Self {
1173
0
        debug_assert!(!self.is_special() && !f.is_special(), "min_finite self={} f={}", self, f);
1174
0
        if self < f {
1175
0
            self
1176
        } else {
1177
0
            f
1178
        }
1179
0
    }
1180
}
1181
1182
/// Define the float literals.
1183
#[cfg(any(feature = "parse-floats", feature = "write-floats"))]
1184
macro_rules! float_literals {
1185
    ($float:ty) => {
1186
        const ZERO: $float = 0.0;
1187
        const ONE: $float = 1.0;
1188
        const TWO: $float = 2.0;
1189
        const MAX: $float = <$float>::MAX;
1190
        const MIN: $float = <$float>::MIN;
1191
        const INFINITY: $float = <$float>::INFINITY;
1192
        const NEG_INFINITY: $float = <$float>::NEG_INFINITY;
1193
        const NAN: $float = <$float>::NAN;
1194
        const BITS: usize = mem::size_of::<$float>() * 8;
1195
    };
1196
}
1197
1198
/// Define the float masks.
1199
#[cfg(any(feature = "parse-floats", feature = "write-floats"))]
1200
macro_rules! float_masks {
1201
    (
1202
        float =>
1203
        $float:ty,sign_mask =>
1204
        $sign:literal,exponent_mask =>
1205
        $exponent:literal,hidden_bit_mask =>
1206
        $hidden:literal,mantissa_mask =>
1207
        $mantissa:literal,
1208
    ) => {
1209
        const SIGN_MASK: <$float>::Unsigned = $sign;
1210
        const EXPONENT_MASK: <$float>::Unsigned = $exponent;
1211
        const HIDDEN_BIT_MASK: <$float>::Unsigned = $hidden;
1212
        const MANTISSA_MASK: <$float>::Unsigned = $mantissa;
1213
        // The carry mask is always 1 bit above the hidden bit.
1214
        const CARRY_MASK: <$float>::Unsigned = $hidden << 1;
1215
        // Infinity is always every exponent bit set.
1216
        const INFINITY_BITS: <$float>::Unsigned = $exponent;
1217
        // Negative infinity is just infinity + sign.
1218
        const NEGATIVE_INFINITY_BITS: <$float>::Unsigned = $exponent | $sign;
1219
    };
1220
}
1221
1222
//  Due to missing specifics or types for the following float types,
1223
//  `Float` is not yet fully implemented for:
1224
//      - f128
1225
1226
#[cfg(feature = "f16")]
1227
macro_rules! float_one {
1228
    ($f:ident) => {
1229
        (($f::EXPONENT_BIAS - $f::MANTISSA_SIZE) as u16) << $f::MANTISSA_SIZE
1230
    };
1231
}
1232
1233
#[cfg(feature = "f16")]
1234
macro_rules! float_two {
1235
    ($f:ident) => {
1236
        (($f::EXPONENT_BIAS - $f::MANTISSA_SIZE + 1) as u16) << $f::MANTISSA_SIZE
1237
    };
1238
}
1239
1240
#[cfg(feature = "f16")]
1241
macro_rules! float_max {
1242
    ($f:ident) => {
1243
        ($f::EXPONENT_MASK ^ $f::HIDDEN_BIT_MASK) | $f::MANTISSA_MASK
1244
    };
1245
}
1246
1247
#[cfg(feature = "f16")]
1248
macro_rules! float_min {
1249
    ($f:ident) => {
1250
        $f::MAX.to_bits() | $f::SIGN_MASK
1251
    };
1252
}
1253
1254
#[cfg(feature = "f16")]
1255
macro_rules! float_nan {
1256
    ($f:ident) => {
1257
        $f::EXPONENT_MASK | ($f::HIDDEN_BIT_MASK >> 1)
1258
    };
1259
}
1260
1261
#[cfg(feature = "f16")]
1262
impl Float for f16 {
1263
    type Unsigned = u16;
1264
1265
    const ZERO: Self = Self::from_bits(0);
1266
    const ONE: Self = Self::from_bits(float_one!(Self));
1267
    const TWO: Self = Self::from_bits(float_two!(Self));
1268
    const MAX: Self = Self::from_bits(float_max!(Self));
1269
    const MIN: Self = Self::from_bits(float_min!(Self));
1270
    const INFINITY: Self = Self::from_bits(Self::INFINITY_BITS);
1271
    const NEG_INFINITY: Self = Self::from_bits(Self::NEGATIVE_INFINITY_BITS);
1272
    const NAN: Self = Self::from_bits(float_nan!(Self));
1273
    const BITS: usize = mem::size_of::<Self>() * 8;
1274
1275
    float_masks!(
1276
        float => Self,
1277
        sign_mask => 0x8000,
1278
        exponent_mask => 0x7C00,
1279
        hidden_bit_mask => 0x0400,
1280
        mantissa_mask => 0x03FF,
1281
    );
1282
    const EXPONENT_SIZE: i32 = 5;
1283
    const MANTISSA_SIZE: i32 = 10;
1284
    const EXPONENT_BIAS: i32 = 15 + Self::MANTISSA_SIZE;
1285
    const DENORMAL_EXPONENT: i32 = 1 - Self::EXPONENT_BIAS;
1286
    const MAX_EXPONENT: i32 = 0x1F - Self::EXPONENT_BIAS;
1287
1288
    #[inline(always)]
1289
    fn to_bits(self) -> u16 {
1290
        f16::to_bits(self)
1291
    }
1292
1293
    #[inline(always)]
1294
    fn from_bits(u: u16) -> f16 {
1295
        f16::from_bits(u)
1296
    }
1297
1298
    #[inline(always)]
1299
    fn ln(self) -> f16 {
1300
        f16::from_f32(self.as_f32().ln())
1301
    }
1302
1303
    #[inline(always)]
1304
    fn floor(self) -> f16 {
1305
        f16::from_f32(self.as_f32().floor())
1306
    }
1307
1308
    #[inline(always)]
1309
    fn is_sign_positive(self) -> bool {
1310
        self.to_bits() & Self::SIGN_MASK == 0
1311
    }
1312
1313
    #[inline(always)]
1314
    fn is_sign_negative(self) -> bool {
1315
        !self.is_sign_positive()
1316
    }
1317
}
1318
1319
#[cfg(feature = "f16")]
1320
impl Float for bf16 {
1321
    type Unsigned = u16;
1322
1323
    const ZERO: Self = Self::from_bits(0);
1324
    const ONE: Self = Self::from_bits(float_one!(Self));
1325
    const TWO: Self = Self::from_bits(float_two!(Self));
1326
    const MAX: Self = Self::from_bits(float_max!(Self));
1327
    const MIN: Self = Self::from_bits(float_min!(Self));
1328
    const INFINITY: Self = Self::from_bits(Self::INFINITY_BITS);
1329
    const NEG_INFINITY: Self = Self::from_bits(Self::NEGATIVE_INFINITY_BITS);
1330
    const NAN: Self = Self::from_bits(float_nan!(Self));
1331
    const BITS: usize = mem::size_of::<Self>() * 8;
1332
1333
    float_masks!(
1334
        float => Self,
1335
        sign_mask => 0x8000,
1336
        exponent_mask => 0x7F80,
1337
        hidden_bit_mask => 0x0080,
1338
        mantissa_mask => 0x007F,
1339
    );
1340
    const EXPONENT_SIZE: i32 = 8;
1341
    const MANTISSA_SIZE: i32 = 7;
1342
    const EXPONENT_BIAS: i32 = 127 + Self::MANTISSA_SIZE;
1343
    const DENORMAL_EXPONENT: i32 = 1 - Self::EXPONENT_BIAS;
1344
    const MAX_EXPONENT: i32 = 0xFF - Self::EXPONENT_BIAS;
1345
1346
    #[inline(always)]
1347
    fn to_bits(self) -> u16 {
1348
        bf16::to_bits(self)
1349
    }
1350
1351
    #[inline(always)]
1352
    fn from_bits(u: u16) -> bf16 {
1353
        bf16::from_bits(u)
1354
    }
1355
1356
    #[inline(always)]
1357
    fn ln(self) -> bf16 {
1358
        bf16::from_f32(self.as_f32().ln())
1359
    }
1360
1361
    #[inline(always)]
1362
    fn floor(self) -> bf16 {
1363
        bf16::from_f32(self.as_f32().floor())
1364
    }
1365
1366
    #[inline(always)]
1367
    fn is_sign_positive(self) -> bool {
1368
        self.to_bits() & Self::SIGN_MASK == 0
1369
    }
1370
1371
    #[inline(always)]
1372
    fn is_sign_negative(self) -> bool {
1373
        !self.is_sign_positive()
1374
    }
1375
}
1376
1377
#[cfg(any(feature = "parse-floats", feature = "write-floats"))]
1378
impl Float for f32 {
1379
    type Unsigned = u32;
1380
    float_literals!(f32);
1381
    float_masks!(
1382
        float => Self,
1383
        sign_mask => 0x80000000,
1384
        exponent_mask => 0x7F800000,
1385
        hidden_bit_mask => 0x00800000,
1386
        mantissa_mask => 0x007FFFFF,
1387
    );
1388
    const EXPONENT_SIZE: i32 = 8;
1389
    const MANTISSA_SIZE: i32 = 23;
1390
    const EXPONENT_BIAS: i32 = 127 + Self::MANTISSA_SIZE;
1391
    const DENORMAL_EXPONENT: i32 = 1 - Self::EXPONENT_BIAS;
1392
    const MAX_EXPONENT: i32 = 0xFF - Self::EXPONENT_BIAS;
1393
1394
    #[inline(always)]
1395
0
    fn to_bits(self) -> u32 {
1396
0
        f32::to_bits(self)
1397
0
    }
1398
1399
    #[inline(always)]
1400
0
    fn from_bits(u: u32) -> f32 {
1401
0
        f32::from_bits(u)
1402
0
    }
1403
1404
    #[inline(always)]
1405
0
    fn ln(self) -> f32 {
1406
        #[cfg(feature = "std")]
1407
        return f32::ln(self);
1408
1409
        #[cfg(not(feature = "std"))]
1410
0
        return libm::logf(self);
1411
0
    }
1412
1413
    #[inline(always)]
1414
0
    fn floor(self) -> f32 {
1415
        #[cfg(feature = "std")]
1416
        return f32::floor(self);
1417
1418
        #[cfg(not(feature = "std"))]
1419
0
        return libm::floorf(self);
1420
0
    }
1421
1422
    #[inline(always)]
1423
0
    fn is_sign_positive(self) -> bool {
1424
0
        f32::is_sign_positive(self)
1425
0
    }
1426
1427
    #[inline(always)]
1428
0
    fn is_sign_negative(self) -> bool {
1429
0
        f32::is_sign_negative(self)
1430
0
    }
1431
}
1432
1433
#[cfg(any(feature = "parse-floats", feature = "write-floats"))]
1434
impl Float for f64 {
1435
    type Unsigned = u64;
1436
    float_literals!(f64);
1437
    float_masks!(
1438
        float => Self,
1439
        sign_mask => 0x8000000000000000,
1440
        exponent_mask => 0x7FF0000000000000,
1441
        hidden_bit_mask => 0x0010000000000000,
1442
        mantissa_mask => 0x000FFFFFFFFFFFFF,
1443
    );
1444
    const EXPONENT_SIZE: i32 = 11;
1445
    const MANTISSA_SIZE: i32 = 52;
1446
    const EXPONENT_BIAS: i32 = 1023 + Self::MANTISSA_SIZE;
1447
    const DENORMAL_EXPONENT: i32 = 1 - Self::EXPONENT_BIAS;
1448
    const MAX_EXPONENT: i32 = 0x7FF - Self::EXPONENT_BIAS;
1449
1450
    #[inline(always)]
1451
1.35k
    fn to_bits(self) -> u64 {
1452
1.35k
        f64::to_bits(self)
1453
1.35k
    }
1454
1455
    #[inline(always)]
1456
2.72k
    fn from_bits(u: u64) -> f64 {
1457
2.72k
        f64::from_bits(u)
1458
2.72k
    }
1459
1460
    #[inline(always)]
1461
0
    fn ln(self) -> f64 {
1462
        #[cfg(feature = "std")]
1463
        return f64::ln(self);
1464
1465
        #[cfg(not(feature = "std"))]
1466
0
        return libm::logd(self);
1467
0
    }
1468
1469
    #[inline(always)]
1470
0
    fn floor(self) -> f64 {
1471
        #[cfg(feature = "std")]
1472
        return f64::floor(self);
1473
1474
        #[cfg(not(feature = "std"))]
1475
0
        return libm::floord(self);
1476
0
    }
1477
1478
    #[inline(always)]
1479
0
    fn is_sign_positive(self) -> bool {
1480
0
        f64::is_sign_positive(self)
1481
0
    }
1482
1483
    #[inline(always)]
1484
0
    fn is_sign_negative(self) -> bool {
1485
0
        f64::is_sign_negative(self)
1486
0
    }
1487
}
1488
1489
// #[cfg(feature = "f128")]
1490
// impl Float for f128 {
1491
//     type Unsigned = u128;
1492
//     float_literals!(f128);
1493
//     float_masks!(
1494
//         float => Self,
1495
//         sign_mask => 0x80000000000000000000000000000000,
1496
//         exponent_mask => 0x7FFF0000000000000000000000000000,
1497
//         hidden_bit_mask => 0x00010000000000000000000000000000,
1498
//         mantissa_mask => 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF,
1499
//     );
1500
//     const EXPONENT_SIZE: i32 = 15;
1501
//     const MANTISSA_SIZE: i32 = 112;
1502
//     const EXPONENT_BIAS: i32 = 16383 + Self::MANTISSA_SIZE;
1503
//     const DENORMAL_EXPONENT: i32 = 1 - Self::EXPONENT_BIAS;
1504
//     const MAX_EXPONENT: i32 = 0x7FFF - Self::EXPONENT_BIAS;
1505
// }