| // SPDX-License-Identifier: GPL-2.0 | |
| //! Formatting utilities. | |
| //! | |
| //! This module is intended to be used in place of `core::fmt` in kernel code. | |
| pub use core::fmt::{ | |
| Arguments, | |
| Debug, | |
| Error, | |
| Formatter, | |
| Result, | |
| Write, // | |
| }; | |
| /// Internal adapter used to route and allow implementations of formatting traits for foreign types. | |
| /// | |
| /// It is inserted automatically by the [`fmt!`] macro and is not meant to be used directly. | |
| /// | |
| /// [`fmt!`]: crate::prelude::fmt! | |
| #[doc(hidden)] | |
| pub struct Adapter<T>(pub T); | |
| macro_rules! impl_fmt_adapter_forward { | |
| ($($trait:ident),* $(,)?) => { | |
| $( | |
| impl<T: $trait> $trait for Adapter<T> { | |
| fn fmt(&self, f: &mut Formatter<'_>) -> Result { | |
| let Self(t) = self; | |
| $trait::fmt(t, f) | |
| } | |
| } | |
| )* | |
| }; | |
| } | |
| use core::fmt::{ | |
| Binary, | |
| LowerExp, | |
| LowerHex, | |
| Octal, | |
| Pointer, | |
| UpperExp, | |
| UpperHex, // | |
| }; | |
| impl_fmt_adapter_forward!(Debug, LowerHex, UpperHex, Octal, Binary, Pointer, LowerExp, UpperExp); | |
| /// A copy of [`core::fmt::Display`] that allows us to implement it for foreign types. | |
| /// | |
| /// Types should implement this trait rather than [`core::fmt::Display`]. Together with the | |
| /// [`Adapter`] type and [`fmt!`] macro, it allows for formatting foreign types (e.g. types from | |
| /// core) which do not implement [`core::fmt::Display`] directly. | |
| /// | |
| /// [`fmt!`]: crate::prelude::fmt! | |
| pub trait Display { | |
| /// Same as [`core::fmt::Display::fmt`]. | |
| fn fmt(&self, f: &mut Formatter<'_>) -> Result; | |
| } | |
| impl<T: ?Sized + Display> Display for &T { | |
| fn fmt(&self, f: &mut Formatter<'_>) -> Result { | |
| Display::fmt(*self, f) | |
| } | |
| } | |
| impl<T: ?Sized + Display> core::fmt::Display for Adapter<&T> { | |
| fn fmt(&self, f: &mut Formatter<'_>) -> Result { | |
| let Self(t) = self; | |
| Display::fmt(t, f) | |
| } | |
| } | |
| macro_rules! impl_display_forward { | |
| ($( | |
| $( { $($generics:tt)* } )? $ty:ty $( { where $($where:tt)* } )? | |
| ),* $(,)?) => { | |
| $( | |
| impl$($($generics)*)? Display for $ty $(where $($where)*)? { | |
| fn fmt(&self, f: &mut Formatter<'_>) -> Result { | |
| core::fmt::Display::fmt(self, f) | |
| } | |
| } | |
| )* | |
| }; | |
| } | |
| impl_display_forward!( | |
| bool, | |
| char, | |
| core::panic::PanicInfo<'_>, | |
| Arguments<'_>, | |
| i128, | |
| i16, | |
| i32, | |
| i64, | |
| i8, | |
| isize, | |
| str, | |
| u128, | |
| u16, | |
| u32, | |
| u64, | |
| u8, | |
| usize, | |
| {<T: ?Sized>} crate::sync::Arc<T> {where crate::sync::Arc<T>: core::fmt::Display}, | |
| {<T: ?Sized>} crate::sync::UniqueArc<T> {where crate::sync::UniqueArc<T>: core::fmt::Display}, | |
| ); |