// 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 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(pub T); macro_rules! impl_fmt_adapter_forward { ($($trait:ident),* $(,)?) => { $( impl $trait for Adapter { 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 Display for &T { fn fmt(&self, f: &mut Formatter<'_>) -> Result { Display::fmt(*self, f) } } impl 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, {} crate::sync::Arc {where crate::sync::Arc: core::fmt::Display}, {} crate::sync::UniqueArc {where crate::sync::UniqueArc: core::fmt::Display}, );