lexical_util/
constants.rs

1//! Pre-defined constants for numeric types.
2
3#![doc(hidden)]
4#![cfg(any(feature = "write-floats", feature = "write-integers"))]
5
6#[cfg(feature = "f16")]
7use crate::bf16::bf16;
8#[cfg(feature = "f16")]
9use crate::f16::f16;
10
11/// The size, in bytes, of formatted values.
12pub trait FormattedSize {
13    /// Maximum number of bytes required to serialize a number to string.
14    /// If [`power-of-two`] or [`radix`] is not enabled, this is the same as
15    /// [`FORMATTED_SIZE_DECIMAL`][`Self::FORMATTED_SIZE_DECIMAL`].
16    ///
17    /// <div class="warning">
18    ///
19    /// Note that this value may be insufficient if digit precision control,
20    /// exponent break points, or disabling exponent notation is used. If
21    /// you are changing the number significant digits written, the exponent
22    /// break points, or disabling scientific notation, you will need a larger
23    /// buffer than the one provided. An upper limit on the buffer size can
24    /// then be determined using [`WriteOptions::buffer_size`].
25    ///
26    /// Using an insufficiently large buffer will lead to the code panicking.
27    ///
28    /// </div>
29    ///
30    /// [`WriteOptions::buffer_size`]: crate::options::WriteOptions::buffer_size
31    /// [`lexical_write_float`]: https://github.com/Alexhuszagh/rust-lexical/tree/main/lexical-write-float
32    /// [`power-of-two`]: crate#features
33    /// [`radix`]: crate#features
34    const FORMATTED_SIZE: usize;
35
36    /// Maximum number of bytes required to serialize a number to a decimal
37    /// string.
38    ///
39    /// <div class="warning">
40    ///
41    /// Note that this value may be insufficient if digit precision control,
42    /// exponent break points, or disabling exponent notation is used. If
43    /// you are changing the number significant digits written, the exponent
44    /// break points, or disabling scientific notation, you will need a larger
45    /// buffer than the one provided. An upper limit on the buffer size can
46    /// then be determined using [`WriteOptions::buffer_size`].
47    ///
48    /// Using an insufficiently large buffer will lead to the code panicking.
49    ///
50    /// </div>
51    ///
52    /// [`WriteOptions::buffer_size`]: crate::options::WriteOptions::buffer_size
53    /// [`lexical_write_float`]: https://github.com/Alexhuszagh/rust-lexical/tree/main/lexical-write-float
54    const FORMATTED_SIZE_DECIMAL: usize;
55}
56
57macro_rules! formatted_size_impl {
58    ($($t:tt $decimal:literal $radix:literal ; )*) => ($(
59        impl FormattedSize for $t {
60            #[cfg(feature = "power-of-two")]
61            const FORMATTED_SIZE: usize = $radix;
62            #[cfg(not(feature = "power-of-two"))]
63            const FORMATTED_SIZE: usize = $decimal;
64            const FORMATTED_SIZE_DECIMAL: usize = $decimal;
65        }
66    )*);
67}
68
69formatted_size_impl! {
70    i8 4 16 ;
71    i16 6 32 ;
72    i32 11 64 ;
73    i64 20 128 ;
74    i128 40 256 ;
75    u8 3 16 ;
76    u16 5 32 ;
77    u32 10 64 ;
78    u64 20 128 ;
79    u128 39 256 ;
80    // The f64 buffer is actually a size of 60, but use 64 since it's a power of 2.
81    // Use 256 for non-decimal values, actually, since we seem to have memory
82    // issues with f64. Clearly not sufficient memory allocated for non-decimal
83    // values.
84    //bf16 64 256 ;
85    //f16 64 256 ;
86    f32 64 256 ;
87    f64 64 256 ;
88    //f128 128 512 ;
89    //f256 256 1024 ;
90}
91
92#[cfg(feature = "f16")]
93formatted_size_impl! {
94    f16 64 256 ;
95    bf16 64 256 ;
96}
97
98#[cfg(target_pointer_width = "16")]
99formatted_size_impl! { isize 6 32 ; }
100#[cfg(target_pointer_width = "16")]
101formatted_size_impl! { usize 5 32 ; }
102
103#[cfg(target_pointer_width = "32")]
104formatted_size_impl! { isize 11 64 ; }
105#[cfg(target_pointer_width = "32")]
106formatted_size_impl! { usize 10 64 ; }
107
108#[cfg(target_pointer_width = "64")]
109formatted_size_impl! { isize 20 128 ; }
110#[cfg(target_pointer_width = "64")]
111formatted_size_impl! { usize 20 128 ; }
112
113/// Maximum number of bytes required to serialize any number with default
114/// options to string.
115///
116/// Note that this value may be insufficient if digit precision control,
117/// exponent break points, or disabling exponent notation is used.
118/// Please read the documentation in [`lexical_write_float`] for more
119/// information.
120///
121/// [`lexical_write_float`]: https://github.com/Alexhuszagh/rust-lexical/tree/main/lexical-write-float
122pub const BUFFER_SIZE: usize = f64::FORMATTED_SIZE;