flussab/write/
text.rs

1//! Utilities for emitting text based formats using a [`DeferredWriter`].
2use crate::DeferredWriter;
3
4mod sealed {
5    pub trait Sealed: itoap::Integer {}
6
7    impl Sealed for i8 {}
8    impl Sealed for u8 {}
9    impl Sealed for i16 {}
10    impl Sealed for u16 {}
11    impl Sealed for i32 {}
12    impl Sealed for u32 {}
13    impl Sealed for i64 {}
14    impl Sealed for u64 {}
15    impl Sealed for i128 {}
16    impl Sealed for u128 {}
17    impl Sealed for isize {}
18    impl Sealed for usize {}
19}
20
21/// Primitive integer types that can be efficiently written into a [`DeferredWriter`].
22pub trait Integer: sealed::Sealed {}
23
24impl Integer for i8 {}
25impl Integer for u8 {}
26impl Integer for i16 {}
27impl Integer for u16 {}
28impl Integer for i32 {}
29impl Integer for u32 {}
30impl Integer for i64 {}
31impl Integer for u64 {}
32impl Integer for i128 {}
33impl Integer for u128 {}
34impl Integer for isize {}
35impl Integer for usize {}
36
37/// Write a decimal number using ASCII digits.
38#[inline]
39pub fn ascii_digits<I>(writer: &mut DeferredWriter, value: I)
40where
41    I: Integer,
42{
43    let ptr = writer.buf_write_ptr(I::MAX_LEN);
44    if ptr.is_null() {
45        ascii_digits_cold(writer, value)
46    } else {
47        // SAFETY above we requested space for `I::MAX_LEN` which is the most `itoap::write_to_ptr`
48        // will write. It returns the number of bytes written, so we can safely advance by it.
49        unsafe {
50            let len = itoap::write_to_ptr(ptr, value);
51            writer.advance_unchecked(len);
52        }
53    }
54}
55
56#[inline(never)]
57#[cold]
58fn ascii_digits_cold<I>(writer: &mut DeferredWriter, value: I)
59where
60    I: Integer,
61{
62    let _ = itoap::write(writer, value);
63}